development
parent
7f73f41f90
commit
f7b87329ef
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -6,5 +6,5 @@ interface GetFeeCategoriesFilters {
|
|||
interface GetFeeCategoriesOptions {
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
export const getFeeCategories = (filters, options) => {
|
||||
const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees;
|
||||
const database = sqlite(databasePath, {
|
||||
readonly: true
|
||||
readonly: !updateOrderNumbers
|
||||
});
|
||||
let sql = "select feeCategoryId, feeCategory" +
|
||||
let sql = "select feeCategoryId, feeCategory, orderNumber" +
|
||||
" from FeeCategories" +
|
||||
" where recordDelete_timeMillis is null";
|
||||
let sqlParameters = [];
|
||||
|
|
@ -26,14 +27,23 @@ export const getFeeCategories = (filters, options) => {
|
|||
" order by orderNumber, feeCategory")
|
||||
.all(sqlParameters);
|
||||
if (options.includeFees) {
|
||||
let expectedFeeCategoryOrderNumber = -1;
|
||||
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," +
|
||||
" f.occupancyTypeId, o.occupancyType," +
|
||||
" f.lotTypeId, l.lotType," +
|
||||
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
||||
" f.taxAmount, f.taxPercentage," +
|
||||
" f.includeQuantity, f.quantityUnit," +
|
||||
" f.isRequired" +
|
||||
" f.isRequired, f.orderNumber" +
|
||||
" from Fees f" +
|
||||
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
||||
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
||||
|
|
@ -52,6 +62,19 @@ export const getFeeCategories = (filters, options) => {
|
|||
feeCategory.fees = database.prepare(sql +
|
||||
" order by f.orderNumber, f.feeName")
|
||||
.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();
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
readonly: true
|
||||
readonly: !updateOrderNumbers
|
||||
});
|
||||
|
||||
let sql = "select feeCategoryId, feeCategory" +
|
||||
let sql = "select feeCategoryId, feeCategory, orderNumber" +
|
||||
" from FeeCategories" +
|
||||
" where recordDelete_timeMillis is null";
|
||||
|
||||
|
|
@ -52,22 +54,35 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
|
|||
.all(sqlParameters);
|
||||
|
||||
if (options.includeFees) {
|
||||
|
||||
|
||||
let expectedFeeCategoryOrderNumber = -1;
|
||||
|
||||
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," +
|
||||
" f.occupancyTypeId, o.occupancyType," +
|
||||
" f.lotTypeId, l.lotType," +
|
||||
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
||||
" f.taxAmount, f.taxPercentage," +
|
||||
" f.includeQuantity, f.quantityUnit," +
|
||||
" f.isRequired" +
|
||||
" f.isRequired, f.orderNumber" +
|
||||
" from Fees f" +
|
||||
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
||||
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
||||
" where f.recordDelete_timeMillis is null" +
|
||||
" and f.feeCategoryId = ?";
|
||||
|
||||
|
||||
sqlParameters = [];
|
||||
|
||||
sqlParameters.push(feeCategory.feeCategoryId);
|
||||
|
|
@ -87,6 +102,26 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
|
|||
feeCategory.fees = database.prepare(sql +
|
||||
" order by f.orderNumber, f.feeName")
|
||||
.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveFeeCategoryDown: (feeCategoryId: number | string) => boolean;
|
||||
export default moveFeeCategoryDown;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveFeeCategoryUp: (feeCategoryId: number | string) => boolean;
|
||||
export default moveFeeCategoryUp;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveFeeDown: (feeId: number | string) => boolean;
|
||||
export default moveFeeDown;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveFeeUp: (feeId: number | string) => boolean;
|
||||
export default moveFeeUp;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
|
||||
let feeCategories = exports.feeCategories;
|
||||
delete exports.feeCategories;
|
||||
const renderFeeCategories = () => {
|
||||
if (feeCategories.length === 0) {
|
||||
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
|
||||
|
|
@ -55,13 +56,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
const panelElement = document.createElement("div");
|
||||
panelElement.className = "panel";
|
||||
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.dataset.feeId = fee.feeId.toString();
|
||||
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
||||
("<div class=\"column is-half\">" +
|
||||
"<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>" +
|
||||
"</p>" +
|
||||
"<p class=\"tags\">" +
|
||||
|
|
@ -98,7 +99,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
"") +
|
||||
"</div>") +
|
||||
"</div>";
|
||||
panelBlockElement.addEventListener("click", openEditFee);
|
||||
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
feeCategoryContainerElement.append(panelElement);
|
||||
|
|
@ -311,8 +312,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
};
|
||||
const openEditFee = (clickEvent) => {
|
||||
clickEvent.preventDefault();
|
||||
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
|
||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId);
|
||||
const feeContainerElement = clickEvent.currentTarget.closest(".container--fee");
|
||||
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
||||
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId);
|
||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ declare const bulmaJS: BulmaJS;
|
|||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement;
|
||||
|
||||
let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories;
|
||||
delete exports.feeCategories;
|
||||
|
||||
const renderFeeCategories = () => {
|
||||
|
||||
|
|
@ -85,14 +86,14 @@ declare const bulmaJS: BulmaJS;
|
|||
|
||||
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.dataset.feeId = fee.feeId.toString();
|
||||
|
||||
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
||||
("<div class=\"column is-half\">" +
|
||||
"<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>" +
|
||||
"</p>" +
|
||||
"<p class=\"tags\">" +
|
||||
|
|
@ -130,7 +131,7 @@ declare const bulmaJS: BulmaJS;
|
|||
"</div>") +
|
||||
"</div>";
|
||||
|
||||
panelBlockElement.addEventListener("click", openEditFee);
|
||||
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
||||
|
||||
panelElement.append(panelBlockElement);
|
||||
}
|
||||
|
|
@ -435,8 +436,10 @@ declare const bulmaJS: BulmaJS;
|
|||
const openEditFee = (clickEvent: Event) => {
|
||||
clickEvent.preventDefault();
|
||||
|
||||
const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId, 10);
|
||||
const feeCategoryId = Number.parseInt(((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId);
|
||||
const feeContainerElement = (clickEvent.currentTarget as HTMLElement).closest(".container--fee") as HTMLElement;
|
||||
|
||||
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) => {
|
||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
|||
import { Router } from "express";
|
||||
import handler_search from "../handlers/workOrders-get/search.js";
|
||||
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||
import handler_view from "../handlers/workOrders-get/view.js";
|
||||
export const router = Router();
|
||||
router.get("/", handler_search);
|
||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||
router.get("/:workOrderId", handler_view);
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ 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";
|
||||
|
||||
import handler_view from "../handlers/workOrders-get/view.js";
|
||||
|
||||
|
||||
export const router = Router();
|
||||
|
|
@ -20,4 +21,9 @@ router.post("/doSearchWorkOrders",
|
|||
handler_doSearchWorkOrders);
|
||||
|
||||
|
||||
router.get("/:workOrderId",
|
||||
handler_view);
|
||||
|
||||
|
||||
|
||||
export default router;
|
||||
|
|
@ -101,6 +101,7 @@ export interface FeeCategory extends Record {
|
|||
feeCategoryId?: number;
|
||||
feeCategory?: string;
|
||||
fees?: Fee[];
|
||||
orderNumber?: number;
|
||||
}
|
||||
export interface Fee extends Record {
|
||||
feeId?: number;
|
||||
|
|
@ -119,6 +120,7 @@ export interface Fee extends Record {
|
|||
taxAmount?: number;
|
||||
taxPercentage?: number;
|
||||
isRequired?: boolean;
|
||||
orderNumber?: number;
|
||||
}
|
||||
export interface LotOccupancyFee extends Fee, Record {
|
||||
lotOccupancyId?: number;
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@ export interface FeeCategory extends Record {
|
|||
feeCategoryId ? : number;
|
||||
feeCategory ? : string;
|
||||
fees ? : Fee[];
|
||||
orderNumber ? : number;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -171,6 +172,8 @@ export interface Fee extends Record {
|
|||
taxPercentage ? : number;
|
||||
|
||||
isRequired ? : boolean;
|
||||
|
||||
orderNumber ? : number;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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'); -%>
|
||||
Loading…
Reference in New Issue