development

deepsource-autofix-76c6eb20
Dan Gowans 2022-08-31 16:28:29 -04:00
parent 7f73f41f90
commit f7b87329ef
26 changed files with 455 additions and 21 deletions

View File

@ -0,0 +1,3 @@
import type { RequestHandler } from "express";
export declare const handler: RequestHandler;
export default handler;

View File

@ -0,0 +1,13 @@
import * as configFunctions from "../../helpers/functions.config.js";
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
export const handler = (request, response) => {
const workOrder = getWorkOrder(request.params.workOrderId);
if (!workOrder) {
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound");
}
response.render("workOrder-view", {
headTitle: "Work Order #" + workOrder.workOrderNumber,
workOrder
});
};
export default handler;

View File

@ -0,0 +1,27 @@
import type {
RequestHandler
} from "express";
import * as configFunctions from "../../helpers/functions.config.js";
import {
getWorkOrder
} from "../../helpers/lotOccupancyDB/getWorkOrder.js";
export const handler: RequestHandler = (request, response) => {
const workOrder = getWorkOrder(request.params.workOrderId);
if (!workOrder) {
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound");
}
response.render("workOrder-view", {
headTitle: "Work Order #" + workOrder.workOrderNumber,
workOrder
});
};
export default handler;

View File

@ -6,5 +6,5 @@ interface GetFeeCategoriesFilters {
interface GetFeeCategoriesOptions { interface GetFeeCategoriesOptions {
includeFees?: boolean; includeFees?: boolean;
} }
export declare const getFeeCategories: (filters?: GetFeeCategoriesFilters, options?: GetFeeCategoriesOptions) => recordTypes.FeeCategory[]; export declare const getFeeCategories: (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions) => recordTypes.FeeCategory[];
export default getFeeCategories; export default getFeeCategories;

View File

@ -1,10 +1,11 @@
import sqlite from "better-sqlite3"; import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const getFeeCategories = (filters, options) => { export const getFeeCategories = (filters, options) => {
const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees;
const database = sqlite(databasePath, { const database = sqlite(databasePath, {
readonly: true readonly: !updateOrderNumbers
}); });
let sql = "select feeCategoryId, feeCategory" + let sql = "select feeCategoryId, feeCategory, orderNumber" +
" from FeeCategories" + " from FeeCategories" +
" where recordDelete_timeMillis is null"; " where recordDelete_timeMillis is null";
let sqlParameters = []; let sqlParameters = [];
@ -26,14 +27,23 @@ export const getFeeCategories = (filters, options) => {
" order by orderNumber, feeCategory") " order by orderNumber, feeCategory")
.all(sqlParameters); .all(sqlParameters);
if (options.includeFees) { if (options.includeFees) {
let expectedFeeCategoryOrderNumber = -1;
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
expectedFeeCategoryOrderNumber += 1;
if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) {
database.prepare("update FeeCategories" +
" set orderNumber = ?" +
" where feeCategoryId = ?")
.run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId);
feeCategory.orderNumber = expectedFeeCategoryOrderNumber;
}
sql = "select f.feeId, f.feeName, f.feeDescription," + sql = "select f.feeId, f.feeName, f.feeDescription," +
" f.occupancyTypeId, o.occupancyType," + " f.occupancyTypeId, o.occupancyType," +
" f.lotTypeId, l.lotType," + " f.lotTypeId, l.lotType," +
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
" f.taxAmount, f.taxPercentage," + " f.taxAmount, f.taxPercentage," +
" f.includeQuantity, f.quantityUnit," + " f.includeQuantity, f.quantityUnit," +
" f.isRequired" + " f.isRequired, f.orderNumber" +
" from Fees f" + " from Fees f" +
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
" left join LotTypes l on f.lotTypeId = l.lotTypeId" + " left join LotTypes l on f.lotTypeId = l.lotTypeId" +
@ -52,6 +62,19 @@ export const getFeeCategories = (filters, options) => {
feeCategory.fees = database.prepare(sql + feeCategory.fees = database.prepare(sql +
" order by f.orderNumber, f.feeName") " order by f.orderNumber, f.feeName")
.all(sqlParameters); .all(sqlParameters);
if (updateOrderNumbers) {
let expectedFeeOrderNumber = -1;
for (const fee of feeCategory.fees) {
expectedFeeOrderNumber += 1;
if (fee.orderNumber !== expectedFeeOrderNumber) {
database.prepare("update Fees" +
" set orderNumber = ?" +
" where feeId = ?")
.run(expectedFeeOrderNumber, fee.feeId);
fee.orderNumber = expectedFeeOrderNumber;
}
}
}
} }
} }
database.close(); database.close();

View File

@ -17,13 +17,15 @@ interface GetFeeCategoriesOptions {
} }
export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ? : GetFeeCategoriesOptions): recordTypes.FeeCategory[] => { export const getFeeCategories = (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions): recordTypes.FeeCategory[] => {
const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees;
const database = sqlite(databasePath, { const database = sqlite(databasePath, {
readonly: true readonly: !updateOrderNumbers
}); });
let sql = "select feeCategoryId, feeCategory" + let sql = "select feeCategoryId, feeCategory, orderNumber" +
" from FeeCategories" + " from FeeCategories" +
" where recordDelete_timeMillis is null"; " where recordDelete_timeMillis is null";
@ -53,15 +55,28 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
if (options.includeFees) { if (options.includeFees) {
let expectedFeeCategoryOrderNumber = -1;
for (const feeCategory of feeCategories) { for (const feeCategory of feeCategories) {
expectedFeeCategoryOrderNumber += 1;
if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) {
database.prepare("update FeeCategories" +
" set orderNumber = ?" +
" where feeCategoryId = ?")
.run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId);
feeCategory.orderNumber = expectedFeeCategoryOrderNumber;
}
sql = "select f.feeId, f.feeName, f.feeDescription," + sql = "select f.feeId, f.feeName, f.feeDescription," +
" f.occupancyTypeId, o.occupancyType," + " f.occupancyTypeId, o.occupancyType," +
" f.lotTypeId, l.lotType," + " f.lotTypeId, l.lotType," +
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," + " ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
" f.taxAmount, f.taxPercentage," + " f.taxAmount, f.taxPercentage," +
" f.includeQuantity, f.quantityUnit," + " f.includeQuantity, f.quantityUnit," +
" f.isRequired" + " f.isRequired, f.orderNumber" +
" from Fees f" + " from Fees f" +
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" + " left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
" left join LotTypes l on f.lotTypeId = l.lotTypeId" + " left join LotTypes l on f.lotTypeId = l.lotTypeId" +
@ -87,6 +102,26 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
feeCategory.fees = database.prepare(sql + feeCategory.fees = database.prepare(sql +
" order by f.orderNumber, f.feeName") " order by f.orderNumber, f.feeName")
.all(sqlParameters); .all(sqlParameters);
if (updateOrderNumbers) {
let expectedFeeOrderNumber = -1;
for (const fee of feeCategory.fees) {
expectedFeeOrderNumber += 1;
if (fee.orderNumber !== expectedFeeOrderNumber) {
database.prepare("update Fees" +
" set orderNumber = ?" +
" where feeId = ?")
.run(expectedFeeOrderNumber, fee.feeId);
fee.orderNumber = expectedFeeOrderNumber;
}
}
}
} }
} }

View File

@ -0,0 +1,2 @@
export declare const moveFeeCategoryDown: (feeCategoryId: number | string) => boolean;
export default moveFeeCategoryDown;

View File

@ -0,0 +1,24 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const moveFeeCategoryDown = (feeCategoryId) => {
const database = sqlite(databasePath);
const currentOrderNumber = database.prepare("select orderNumber" +
" from FeeCategories" +
" where feeCategoryId = ?")
.get(feeCategoryId)
.orderNumber;
database
.prepare("update FeeCategories" +
" set orderNumber = orderNumber - 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? + 1")
.run(currentOrderNumber);
const result = database
.prepare("update FeeCategories" +
" set orderNumber = ? + 1" +
" where feeCategoryId = ?")
.run(currentOrderNumber, feeCategoryId);
database.close();
return result.changes > 0;
};
export default moveFeeCategoryDown;

View File

@ -0,0 +1,38 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
export const moveFeeCategoryDown =
(feeCategoryId: number | string): boolean => {
const database = sqlite(databasePath);
const currentOrderNumber: number = database.prepare("select orderNumber" +
" from FeeCategories" +
" where feeCategoryId = ?")
.get(feeCategoryId)
.orderNumber;
database
.prepare("update FeeCategories" +
" set orderNumber = orderNumber - 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? + 1")
.run(currentOrderNumber);
const result = database
.prepare("update FeeCategories" +
" set orderNumber = ? + 1" +
" where feeCategoryId = ?")
.run(currentOrderNumber, feeCategoryId);
database.close();
return result.changes > 0;
};
export default moveFeeCategoryDown;

View File

@ -0,0 +1,2 @@
export declare const moveFeeCategoryUp: (feeCategoryId: number | string) => boolean;
export default moveFeeCategoryUp;

View File

@ -0,0 +1,28 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const moveFeeCategoryUp = (feeCategoryId) => {
const database = sqlite(databasePath);
const currentOrderNumber = database.prepare("select orderNumber" +
" from FeeCategories" +
" where feeCategoryId = ?")
.get(feeCategoryId)
.orderNumber;
if (currentOrderNumber <= 0) {
database.close();
return true;
}
database
.prepare("update FeeCategories" +
" set orderNumber = orderNumber + 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? - 1")
.run(currentOrderNumber);
const result = database
.prepare("update FeeCategories" +
" set orderNumber = ? - 1" +
" where feeCategoryId = ?")
.run(currentOrderNumber, feeCategoryId);
database.close();
return result.changes > 0;
};
export default moveFeeCategoryUp;

View File

@ -0,0 +1,43 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
export const moveFeeCategoryUp =
(feeCategoryId: number | string): boolean => {
const database = sqlite(databasePath);
const currentOrderNumber: number = database.prepare("select orderNumber" +
" from FeeCategories" +
" where feeCategoryId = ?")
.get(feeCategoryId)
.orderNumber;
if (currentOrderNumber <= 0) {
database.close();
return true;
}
database
.prepare("update FeeCategories" +
" set orderNumber = orderNumber + 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? - 1")
.run(currentOrderNumber);
const result = database
.prepare("update FeeCategories" +
" set orderNumber = ? - 1" +
" where feeCategoryId = ?")
.run(currentOrderNumber, feeCategoryId);
database.close();
return result.changes > 0;
};
export default moveFeeCategoryUp;

View File

@ -0,0 +1,2 @@
export declare const moveFeeDown: (feeId: number | string) => boolean;
export default moveFeeDown;

View File

@ -0,0 +1,24 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const moveFeeDown = (feeId) => {
const database = sqlite(databasePath);
const currentOrderNumber = database.prepare("select orderNumber" +
" from Fees" +
" where feeId = ?")
.get(feeId)
.orderNumber;
database
.prepare("update Fees" +
" set orderNumber = orderNumber - 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? + 1")
.run(currentOrderNumber);
const result = database
.prepare("update Fees" +
" set orderNumber = ? + 1" +
" where feeId = ?")
.run(currentOrderNumber, feeId);
database.close();
return result.changes > 0;
};
export default moveFeeDown;

View File

@ -0,0 +1,38 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
export const moveFeeDown =
(feeId: number | string): boolean => {
const database = sqlite(databasePath);
const currentOrderNumber: number = database.prepare("select orderNumber" +
" from Fees" +
" where feeId = ?")
.get(feeId)
.orderNumber;
database
.prepare("update Fees" +
" set orderNumber = orderNumber - 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? + 1")
.run(currentOrderNumber);
const result = database
.prepare("update Fees" +
" set orderNumber = ? + 1" +
" where feeId = ?")
.run(currentOrderNumber, feeId);
database.close();
return result.changes > 0;
};
export default moveFeeDown;

View File

@ -0,0 +1,2 @@
export declare const moveFeeUp: (feeId: number | string) => boolean;
export default moveFeeUp;

View File

@ -0,0 +1,28 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const moveFeeUp = (feeId) => {
const database = sqlite(databasePath);
const currentOrderNumber = database.prepare("select orderNumber" +
" from Fees" +
" where feeId = ?")
.get(feeId)
.orderNumber;
if (currentOrderNumber <= 0) {
database.close();
return true;
}
database
.prepare("update Fees" +
" set orderNumber = orderNumber + 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? - 1")
.run(currentOrderNumber);
const result = database
.prepare("update Fees" +
" set orderNumber = ? - 1" +
" where feeId = ?")
.run(currentOrderNumber, feeId);
database.close();
return result.changes > 0;
};
export default moveFeeUp;

View File

@ -0,0 +1,43 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
export const moveFeeUp =
(feeId: number | string): boolean => {
const database = sqlite(databasePath);
const currentOrderNumber: number = database.prepare("select orderNumber" +
" from Fees" +
" where feeId = ?")
.get(feeId)
.orderNumber;
if (currentOrderNumber <= 0) {
database.close();
return true;
}
database
.prepare("update Fees" +
" set orderNumber = orderNumber + 1" +
" where recordDelete_timeMillis is null" +
" and orderNumber = ? - 1")
.run(currentOrderNumber);
const result = database
.prepare("update Fees" +
" set orderNumber = ? - 1" +
" where feeId = ?")
.run(currentOrderNumber, feeId);
database.close();
return result.changes > 0;
};
export default moveFeeUp;

View File

@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const urlPrefix = document.querySelector("main").dataset.urlPrefix; const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories"); const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
let feeCategories = exports.feeCategories; let feeCategories = exports.feeCategories;
delete exports.feeCategories;
const renderFeeCategories = () => { const renderFeeCategories = () => {
if (feeCategories.length === 0) { if (feeCategories.length === 0) {
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" + feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
@ -55,13 +56,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const panelElement = document.createElement("div"); const panelElement = document.createElement("div");
panelElement.className = "panel"; panelElement.className = "panel";
for (const fee of feeCategory.fees) { for (const fee of feeCategory.fees) {
const panelBlockElement = document.createElement("a"); const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.className = "panel-block is-block container--fee";
panelBlockElement.dataset.feeId = fee.feeId.toString(); panelBlockElement.dataset.feeId = fee.feeId.toString();
panelBlockElement.innerHTML = "<div class=\"columns\">" + panelBlockElement.innerHTML = "<div class=\"columns\">" +
("<div class=\"column is-half\">" + ("<div class=\"column is-half\">" +
"<p>" + "<p>" +
"<strong>" + cityssm.escapeHTML(fee.feeName) + "</strong><br />" + "<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" + "<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
"</p>" + "</p>" +
"<p class=\"tags\">" + "<p class=\"tags\">" +
@ -98,7 +99,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
"") + "") +
"</div>") + "</div>") +
"</div>"; "</div>";
panelBlockElement.addEventListener("click", openEditFee); panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
feeCategoryContainerElement.append(panelElement); feeCategoryContainerElement.append(panelElement);
@ -311,8 +312,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
}; };
const openEditFee = (clickEvent) => { const openEditFee = (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10); const feeContainerElement = clickEvent.currentTarget.closest(".container--fee");
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId); const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId);
const feeCategory = feeCategories.find((currentFeeCategory) => { const feeCategory = feeCategories.find((currentFeeCategory) => {
return currentFeeCategory.feeCategoryId === feeCategoryId; return currentFeeCategory.feeCategoryId === feeCategoryId;
}); });

View File

@ -23,6 +23,7 @@ declare const bulmaJS: BulmaJS;
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement; const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement;
let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories; let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories;
delete exports.feeCategories;
const renderFeeCategories = () => { const renderFeeCategories = () => {
@ -85,14 +86,14 @@ declare const bulmaJS: BulmaJS;
for (const fee of feeCategory.fees) { for (const fee of feeCategory.fees) {
const panelBlockElement = document.createElement("a"); const panelBlockElement = document.createElement("div");
panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.className = "panel-block is-block container--fee";
panelBlockElement.dataset.feeId = fee.feeId.toString(); panelBlockElement.dataset.feeId = fee.feeId.toString();
panelBlockElement.innerHTML = "<div class=\"columns\">" + panelBlockElement.innerHTML = "<div class=\"columns\">" +
("<div class=\"column is-half\">" + ("<div class=\"column is-half\">" +
"<p>" + "<p>" +
"<strong>" + cityssm.escapeHTML(fee.feeName) + "</strong><br />" + "<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" + "<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
"</p>" + "</p>" +
"<p class=\"tags\">" + "<p class=\"tags\">" +
@ -130,7 +131,7 @@ declare const bulmaJS: BulmaJS;
"</div>") + "</div>") +
"</div>"; "</div>";
panelBlockElement.addEventListener("click", openEditFee); panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
panelElement.append(panelBlockElement); panelElement.append(panelBlockElement);
} }
@ -435,8 +436,10 @@ declare const bulmaJS: BulmaJS;
const openEditFee = (clickEvent: Event) => { const openEditFee = (clickEvent: Event) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId, 10); const feeContainerElement = (clickEvent.currentTarget as HTMLElement).closest(".container--fee") as HTMLElement;
const feeCategoryId = Number.parseInt(((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId);
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
const feeCategoryId = Number.parseInt((feeContainerElement.closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId);
const feeCategory = feeCategories.find((currentFeeCategory) => { const feeCategory = feeCategories.find((currentFeeCategory) => {
return currentFeeCategory.feeCategoryId === feeCategoryId; return currentFeeCategory.feeCategoryId === feeCategoryId;

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,9 @@
import { Router } from "express"; import { Router } from "express";
import handler_search from "../handlers/workOrders-get/search.js"; import handler_search from "../handlers/workOrders-get/search.js";
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js"; import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
import handler_view from "../handlers/workOrders-get/view.js";
export const router = Router(); export const router = Router();
router.get("/", handler_search); router.get("/", handler_search);
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders); router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
router.get("/:workOrderId", handler_view);
export default router; export default router;

View File

@ -8,6 +8,7 @@ import * as configFunctions from "../helpers/functions.config.js";
import handler_search from "../handlers/workOrders-get/search.js"; import handler_search from "../handlers/workOrders-get/search.js";
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js"; import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
import handler_view from "../handlers/workOrders-get/view.js";
export const router = Router(); export const router = Router();
@ -20,4 +21,9 @@ router.post("/doSearchWorkOrders",
handler_doSearchWorkOrders); handler_doSearchWorkOrders);
router.get("/:workOrderId",
handler_view);
export default router; export default router;

View File

@ -101,6 +101,7 @@ export interface FeeCategory extends Record {
feeCategoryId?: number; feeCategoryId?: number;
feeCategory?: string; feeCategory?: string;
fees?: Fee[]; fees?: Fee[];
orderNumber?: number;
} }
export interface Fee extends Record { export interface Fee extends Record {
feeId?: number; feeId?: number;
@ -119,6 +120,7 @@ export interface Fee extends Record {
taxAmount?: number; taxAmount?: number;
taxPercentage?: number; taxPercentage?: number;
isRequired?: boolean; isRequired?: boolean;
orderNumber?: number;
} }
export interface LotOccupancyFee extends Fee, Record { export interface LotOccupancyFee extends Fee, Record {
lotOccupancyId?: number; lotOccupancyId?: number;

View File

@ -143,6 +143,7 @@ export interface FeeCategory extends Record {
feeCategoryId ? : number; feeCategoryId ? : number;
feeCategory ? : string; feeCategory ? : string;
fees ? : Fee[]; fees ? : Fee[];
orderNumber ? : number;
} }
@ -171,6 +172,8 @@ export interface Fee extends Record {
taxPercentage ? : number; taxPercentage ? : number;
isRequired ? : boolean; isRequired ? : boolean;
orderNumber ? : number;
} }

View File

@ -0,0 +1,41 @@
<%- include('_header'); -%>
<div class="columns is-variable is-4-mobile is-4-tablet is-block-print" id="is-site-layout">
<div class="column is-block-print">
<nav class="breadcrumb">
<ul>
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
<li>
<a href="<%= urlPrefix %>/workOrders">
<span class="icon is-small"><i class="fas fa-hard-hat" aria-hidden="true"></i></span>
<span>Work Orders</span>
</a>
</li>
<li class="is-active">
<a href="#" aria-current="page">
Work Order #<%= workOrder.workOrderNumber || "(No Number)" %>
</a>
</li>
</ul>
</nav>
<h1 class="title is-1">
Work Order #<%= workOrder.workOrderNumber || "(No Number)" %>
</h1>
<% if (user.userProperties.canUpdate) { %>
<div class="fixed-container is-fixed-bottom-right mx-4 my-4 has-text-right is-hidden-print">
<a class="button is-circle is-primary has-tooltip-left" data-tooltip="Update Work Order" href="<%= urlPrefix %>/workOrders/<%= workOrder.workOrderId %>/edit">
<i class="fas fa-pencil-alt" aria-hidden="true"></i>
<span class="sr-only">Update Work Order</span>
</a>
</div>
<% } %>
</div>
</div>
<%- include('_footerA'); -%>
<%- include('_footerB'); -%>