work order type maintenance
parent
37c2f39ea0
commit
e8106c5229
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = (_request, response) => {
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
const lotStatuses = getLotStatuses();
|
||||
const lotOccupantTypes = getLotOccupantTypes();
|
||||
response.render("admin-tables", {
|
||||
headTitle: "Config Table Management",
|
||||
workOrderTypes,
|
||||
lotStatuses,
|
||||
lotOccupantTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import { getLotOccupantTypes, getLotStatuses, getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = (_request, response) => {
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
const lotStatuses = getLotStatuses();
|
||||
const lotOccupantTypes = getLotOccupantTypes();
|
||||
|
||||
response.render("admin-tables", {
|
||||
headTitle: "Config Table Management",
|
||||
workOrderTypes,
|
||||
lotStatuses,
|
||||
lotOccupantTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import { addWorkOrderType } from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = async (request, response) => {
|
||||
const workOrderTypeId = addWorkOrderType(request.body, request.session);
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.json({
|
||||
success: true,
|
||||
workOrderTypeId,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
addWorkOrderType
|
||||
} from "../../helpers/lotOccupancyDB/addWorkOrderType.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const workOrderTypeId = addWorkOrderType(request.body, request.session);
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.json({
|
||||
success: true,
|
||||
workOrderTypeId,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import { deleteWorkOrderType } from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = async (request, response) => {
|
||||
const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session);
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
deleteWorkOrderType
|
||||
} from "../../helpers/lotOccupancyDB/deleteWorkOrderType.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const success = deleteWorkOrderType(request.body.workOrderTypeId, request.session);
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import { moveWorkOrderTypeDown } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = async (request, response) => {
|
||||
const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
moveWorkOrderTypeDown
|
||||
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeDown.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const success = moveWorkOrderTypeDown(request.body.workOrderTypeId);
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import { moveWorkOrderTypeUp } from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = async (request, response) => {
|
||||
const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
moveWorkOrderTypeUp
|
||||
} from "../../helpers/lotOccupancyDB/moveWorkOrderTypeUp.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const success = moveWorkOrderTypeUp(request.body.workOrderTypeId);
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type { RequestHandler } from "express";
|
||||
export declare const handler: RequestHandler;
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
import { updateWorkOrderType } from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
|
||||
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
|
||||
export const handler = async (request, response) => {
|
||||
const success = updateWorkOrderType(request.body, request.session);
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
export default handler;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import type {
|
||||
RequestHandler
|
||||
} from "express";
|
||||
|
||||
import {
|
||||
updateWorkOrderType
|
||||
} from "../../helpers/lotOccupancyDB/updateWorkOrderType.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes
|
||||
} from "../../helpers/functions.cache.js";
|
||||
|
||||
|
||||
export const handler: RequestHandler = async (request, response) => {
|
||||
|
||||
const success = updateWorkOrderType(request.body, request.session);
|
||||
|
||||
const workOrderTypes = getWorkOrderTypes();
|
||||
|
||||
response.json({
|
||||
success,
|
||||
workOrderTypes
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export default handler;
|
||||
|
|
@ -15,3 +15,5 @@ export declare function getOccupancyTypes(): recordTypes.OccupancyType[];
|
|||
export declare function getOccupancyTypeById(occupancyTypeId: number): recordTypes.OccupancyType;
|
||||
export declare function getOccupancyTypeByOccupancyType(occupancyTypeString: string): recordTypes.OccupancyType;
|
||||
export declare function clearOccupancyTypesCache(): void;
|
||||
export declare function getWorkOrderTypes(): recordTypes.WorkOrderType[];
|
||||
export declare function clearWorkOrderTypesCache(): void;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import { getLotOccupantTypes as getLotOccupantTypesFromDatabase } from "./lotOcc
|
|||
import { getLotStatuses as getLotStatusesFromDatabase } from "./lotOccupancyDB/getLotStatuses.js";
|
||||
import { getLotTypes as getLotTypesFromDatabase } from "./lotOccupancyDB/getLotTypes.js";
|
||||
import { getOccupancyTypes as getOccupancyTypesFromDatabase } from "./lotOccupancyDB/getOccupancyTypes.js";
|
||||
import { getWorkOrderTypes as getWorkOrderTypesFromDatabase } from "./lotOccupancyDB/getWorkOrderTypes.js";
|
||||
import { getOccupancyType } from "./lotOccupancyDB/getOccupancyType.js";
|
||||
let lotOccupantTypes;
|
||||
export function getLotOccupantTypes() {
|
||||
|
|
@ -102,3 +103,13 @@ export function clearOccupancyTypesCache() {
|
|||
occupancyTypes = undefined;
|
||||
occupancyTypeMap.clear();
|
||||
}
|
||||
let workOrderTypes;
|
||||
export function getWorkOrderTypes() {
|
||||
if (!workOrderTypes) {
|
||||
workOrderTypes = getWorkOrderTypesFromDatabase();
|
||||
}
|
||||
return workOrderTypes;
|
||||
}
|
||||
export function clearWorkOrderTypesCache() {
|
||||
workOrderTypes = undefined;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,10 @@ import {
|
|||
getOccupancyTypes as getOccupancyTypesFromDatabase
|
||||
} from "./lotOccupancyDB/getOccupancyTypes.js";
|
||||
|
||||
import {
|
||||
getWorkOrderTypes as getWorkOrderTypesFromDatabase
|
||||
} from "./lotOccupancyDB/getWorkOrderTypes.js";
|
||||
|
||||
import {
|
||||
getOccupancyType
|
||||
} from "./lotOccupancyDB/getOccupancyType.js";
|
||||
|
|
@ -188,3 +192,22 @@ export function clearOccupancyTypesCache() {
|
|||
occupancyTypes = undefined;
|
||||
occupancyTypeMap.clear();
|
||||
}
|
||||
|
||||
/*
|
||||
* Work Order Types
|
||||
*/
|
||||
|
||||
let workOrderTypes: recordTypes.WorkOrderType[];
|
||||
|
||||
export function getWorkOrderTypes() {
|
||||
|
||||
if (!workOrderTypes) {
|
||||
workOrderTypes = getWorkOrderTypesFromDatabase();
|
||||
}
|
||||
|
||||
return workOrderTypes;
|
||||
}
|
||||
|
||||
export function clearWorkOrderTypesCache() {
|
||||
workOrderTypes = undefined;
|
||||
}
|
||||
|
|
@ -4,8 +4,11 @@ import {
|
|||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
clearLotTypesCache
|
||||
} from "../functions.cache.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import { clearLotTypesCache } from "../functions.cache.js";
|
||||
|
||||
|
||||
interface AddLotTypeForm {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
interface AddWorkOrderTypeForm {
|
||||
workOrderType: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
export declare const addWorkOrderType: (workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => number;
|
||||
export default addWorkOrderType;
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
export const addWorkOrderType = (workOrderTypeForm, requestSession) => {
|
||||
const database = sqlite(databasePath);
|
||||
const rightNowMillis = Date.now();
|
||||
const result = database
|
||||
.prepare("insert into WorkOrderTypes (" +
|
||||
"workOrderType, orderNumber," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderTypeForm.workOrderType, (workOrderTypeForm.orderNumber || -1), requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
|
||||
database.close();
|
||||
clearWorkOrderTypesCache();
|
||||
return result.lastInsertRowid;
|
||||
};
|
||||
export default addWorkOrderType;
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
clearWorkOrderTypesCache
|
||||
} from "../functions.cache.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
||||
interface AddWorkOrderTypeForm {
|
||||
workOrderType: string;
|
||||
orderNumber ? : number;
|
||||
}
|
||||
|
||||
|
||||
export const addWorkOrderType =
|
||||
(workOrderTypeForm: AddWorkOrderTypeForm, requestSession: recordTypes.PartialSession): number => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const rightNowMillis = Date.now();
|
||||
|
||||
const result = database
|
||||
.prepare("insert into WorkOrderTypes (" +
|
||||
"workOrderType, orderNumber," +
|
||||
" recordCreate_userName, recordCreate_timeMillis," +
|
||||
" recordUpdate_userName, recordUpdate_timeMillis)" +
|
||||
" values (?, ?, ?, ?, ?, ?)")
|
||||
.run(workOrderTypeForm.workOrderType,
|
||||
(workOrderTypeForm.orderNumber || -1),
|
||||
requestSession.user.userName,
|
||||
rightNowMillis,
|
||||
requestSession.user.userName,
|
||||
rightNowMillis);
|
||||
|
||||
database.close();
|
||||
|
||||
clearWorkOrderTypesCache();
|
||||
|
||||
return result.lastInsertRowid as number;
|
||||
};
|
||||
|
||||
|
||||
export default addWorkOrderType;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
export declare const deleteWorkOrderType: (workOrderTypeId: number | string, requestSession: recordTypes.PartialSession) => boolean;
|
||||
export default deleteWorkOrderType;
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
export const deleteWorkOrderType = (workOrderTypeId, requestSession) => {
|
||||
const database = sqlite(databasePath);
|
||||
const rightNowMillis = Date.now();
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set recordDelete_userName = ?," +
|
||||
" recordDelete_timeMillis = ?" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(requestSession.user.userName, rightNowMillis, workOrderTypeId);
|
||||
database.close();
|
||||
clearWorkOrderTypesCache();
|
||||
return (result.changes > 0);
|
||||
};
|
||||
export default deleteWorkOrderType;
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
|
||||
|
||||
export const deleteWorkOrderType =
|
||||
(workOrderTypeId: number | string,
|
||||
requestSession: recordTypes.PartialSession): boolean => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const rightNowMillis = Date.now();
|
||||
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set recordDelete_userName = ?," +
|
||||
" recordDelete_timeMillis = ?" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(requestSession.user.userName,
|
||||
rightNowMillis,
|
||||
workOrderTypeId);
|
||||
|
||||
database.close();
|
||||
|
||||
clearWorkOrderTypesCache();
|
||||
|
||||
return (result.changes > 0);
|
||||
};
|
||||
|
||||
|
||||
export default deleteWorkOrderType;
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
export declare const getWorkOrderTypes: () => recordTypes.WorkOrderType[];
|
||||
export default getWorkOrderTypes;
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
export const getWorkOrderTypes = () => {
|
||||
const database = sqlite(databasePath);
|
||||
const workOrderTypes = database
|
||||
.prepare("select workOrderTypeId, workOrderType, orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" order by orderNumber, workOrderType")
|
||||
.all();
|
||||
let expectedOrderNumber = 0;
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
if (workOrderType.orderNumber !== expectedOrderNumber) {
|
||||
database.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ?" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(expectedOrderNumber, workOrderType.workOrderTypeId);
|
||||
workOrderType.orderNumber = expectedOrderNumber;
|
||||
}
|
||||
expectedOrderNumber += 1;
|
||||
}
|
||||
database.close();
|
||||
return workOrderTypes;
|
||||
};
|
||||
export default getWorkOrderTypes;
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
|
||||
|
||||
export const getWorkOrderTypes = (): recordTypes.WorkOrderType[] => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const workOrderTypes: recordTypes.WorkOrderType[] = database
|
||||
.prepare("select workOrderTypeId, workOrderType, orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" order by orderNumber, workOrderType")
|
||||
.all();
|
||||
|
||||
let expectedOrderNumber = 0;
|
||||
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
|
||||
if (workOrderType.orderNumber !== expectedOrderNumber) {
|
||||
|
||||
database.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ?" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(expectedOrderNumber,
|
||||
workOrderType.workOrderTypeId);
|
||||
|
||||
workOrderType.orderNumber = expectedOrderNumber;
|
||||
}
|
||||
|
||||
expectedOrderNumber += 1;
|
||||
}
|
||||
|
||||
database.close();
|
||||
|
||||
return workOrderTypes;
|
||||
};
|
||||
|
||||
|
||||
export default getWorkOrderTypes;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveWorkOrderTypeDown: (workOrderTypeId: number | string) => boolean;
|
||||
export default moveWorkOrderTypeDown;
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
export const moveWorkOrderTypeDown = (workOrderTypeId) => {
|
||||
const database = sqlite(databasePath);
|
||||
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where workOrderTypeId = ?")
|
||||
.get(workOrderTypeId)
|
||||
.orderNumber;
|
||||
database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = orderNumber - 1" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and orderNumber = ? + 1")
|
||||
.run(currentOrderNumber);
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ? + 1" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(currentOrderNumber, workOrderTypeId);
|
||||
database.close();
|
||||
clearWorkOrderTypesCache();
|
||||
return result.changes > 0;
|
||||
};
|
||||
export default moveWorkOrderTypeDown;
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
clearWorkOrderTypesCache
|
||||
} from "../functions.cache.js";
|
||||
|
||||
|
||||
export const moveWorkOrderTypeDown =
|
||||
(workOrderTypeId: number | string): boolean => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where workOrderTypeId = ?")
|
||||
.get(workOrderTypeId)
|
||||
.orderNumber;
|
||||
|
||||
database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = orderNumber - 1" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and orderNumber = ? + 1")
|
||||
.run(currentOrderNumber);
|
||||
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ? + 1" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(currentOrderNumber, workOrderTypeId);
|
||||
|
||||
database.close();
|
||||
|
||||
clearWorkOrderTypesCache();
|
||||
|
||||
return result.changes > 0;
|
||||
};
|
||||
|
||||
|
||||
export default moveWorkOrderTypeDown;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export declare const moveWorkOrderTypeUp: (workOrderTypeId: number | string) => boolean;
|
||||
export default moveWorkOrderTypeUp;
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
export const moveWorkOrderTypeUp = (workOrderTypeId) => {
|
||||
const database = sqlite(databasePath);
|
||||
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where workOrderTypeId = ?")
|
||||
.get(workOrderTypeId)
|
||||
.orderNumber;
|
||||
if (currentOrderNumber <= 0) {
|
||||
database.close();
|
||||
return true;
|
||||
}
|
||||
database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = orderNumber + 1" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and orderNumber = ? - 1")
|
||||
.run(currentOrderNumber);
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ? - 1" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(currentOrderNumber, workOrderTypeId);
|
||||
database.close();
|
||||
clearWorkOrderTypesCache();
|
||||
return result.changes > 0;
|
||||
};
|
||||
export default moveWorkOrderTypeUp;
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import {
|
||||
clearWorkOrderTypesCache
|
||||
} from "../functions.cache.js";
|
||||
|
||||
|
||||
export const moveWorkOrderTypeUp =
|
||||
(workOrderTypeId: number | string): boolean => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||
" from WorkOrderTypes" +
|
||||
" where workOrderTypeId = ?")
|
||||
.get(workOrderTypeId)
|
||||
.orderNumber;
|
||||
|
||||
if (currentOrderNumber <= 0) {
|
||||
database.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = orderNumber + 1" +
|
||||
" where recordDelete_timeMillis is null" +
|
||||
" and orderNumber = ? - 1")
|
||||
.run(currentOrderNumber);
|
||||
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set orderNumber = ? - 1" +
|
||||
" where workOrderTypeId = ?")
|
||||
.run(currentOrderNumber, workOrderTypeId);
|
||||
|
||||
database.close();
|
||||
|
||||
clearWorkOrderTypesCache();
|
||||
|
||||
return result.changes > 0;
|
||||
};
|
||||
|
||||
|
||||
export default moveWorkOrderTypeUp;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import type * as recordTypes from "../../types/recordTypes";
|
||||
interface UpdateWorkOrderTypeForm {
|
||||
workOrderTypeId: number | string;
|
||||
workOrderType: string;
|
||||
}
|
||||
export declare const updateWorkOrderType: (workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession) => boolean;
|
||||
export default updateWorkOrderType;
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
export const updateWorkOrderType = (workOrderTypeForm, requestSession) => {
|
||||
const database = sqlite(databasePath);
|
||||
const rightNowMillis = Date.now();
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set workOrderType = ?," +
|
||||
" recordUpdate_userName = ?," +
|
||||
" recordUpdate_timeMillis = ?" +
|
||||
" where workOrderTypeId = ?" +
|
||||
" and recordDelete_timeMillis is null")
|
||||
.run(workOrderTypeForm.workOrderType, requestSession.user.userName, rightNowMillis, workOrderTypeForm.workOrderTypeId);
|
||||
database.close();
|
||||
clearWorkOrderTypesCache();
|
||||
return result.changes > 0;
|
||||
};
|
||||
export default updateWorkOrderType;
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import sqlite from "better-sqlite3";
|
||||
|
||||
import {
|
||||
lotOccupancyDB as databasePath
|
||||
} from "../../data/databasePaths.js";
|
||||
|
||||
import type * as recordTypes from "../../types/recordTypes";
|
||||
import { clearWorkOrderTypesCache } from "../functions.cache.js";
|
||||
|
||||
|
||||
interface UpdateWorkOrderTypeForm {
|
||||
workOrderTypeId: number | string;
|
||||
workOrderType: string;
|
||||
}
|
||||
|
||||
|
||||
export const updateWorkOrderType =
|
||||
(workOrderTypeForm: UpdateWorkOrderTypeForm, requestSession: recordTypes.PartialSession): boolean => {
|
||||
|
||||
const database = sqlite(databasePath);
|
||||
|
||||
const rightNowMillis = Date.now();
|
||||
|
||||
const result = database
|
||||
.prepare("update WorkOrderTypes" +
|
||||
" set workOrderType = ?," +
|
||||
" recordUpdate_userName = ?," +
|
||||
" recordUpdate_timeMillis = ?" +
|
||||
" where workOrderTypeId = ?" +
|
||||
" and recordDelete_timeMillis is null")
|
||||
.run(workOrderTypeForm.workOrderType,
|
||||
requestSession.user.userName,
|
||||
rightNowMillis,
|
||||
workOrderTypeForm.workOrderTypeId);
|
||||
|
||||
database.close();
|
||||
|
||||
clearWorkOrderTypesCache();
|
||||
|
||||
return result.changes > 0;
|
||||
};
|
||||
|
||||
|
||||
export default updateWorkOrderType;
|
||||
|
|
@ -0,0 +1 @@
|
|||
export {};
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
(() => {
|
||||
const los = exports.los;
|
||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
let workOrderTypes = exports.workOrderTypes;
|
||||
delete exports.workOrderTypes;
|
||||
const updateWorkOrderType = (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderType", submitEvent.currentTarget, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const deleteWorkOrderType = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
const doDelete = () => {
|
||||
cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderType", {
|
||||
workOrderTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
if (workOrderTypes.length === 0) {
|
||||
renderWorkOrderTypes();
|
||||
}
|
||||
else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Type",
|
||||
message: "Are you sure you want to delete this work order type?<br />" +
|
||||
"Note that no work orders will be removed.",
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Type",
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderTypeUp = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeUp", {
|
||||
workOrderTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const moveWorkOrderTypeDown = (clickEvent) => {
|
||||
const tableRowElement = clickEvent.currentTarget.closest("tr");
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeDown", {
|
||||
workOrderTypeId
|
||||
}, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const renderWorkOrderTypes = () => {
|
||||
const containerElement = document.querySelector("#container--workOrderTypes");
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = "<tr>" +
|
||||
"<td colspan=\"2\">" +
|
||||
"<div class=\"message is-warning\">" +
|
||||
"<p class=\"message-body\">There are no active work order types.</p>" +
|
||||
"</div>" +
|
||||
"</td>" +
|
||||
"</tr>";
|
||||
return;
|
||||
}
|
||||
containerElement.innerHTML = "";
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
const tableRowElement = document.createElement("tr");
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||
tableRowElement.innerHTML = "<td>" +
|
||||
"<form>" +
|
||||
"<input name=\"workOrderTypeId\" type=\"hidden\" value=\"" + workOrderType.workOrderTypeId.toString() + "\" />" +
|
||||
("<div class=\"field has-addons\">" +
|
||||
"<div class=\"control\">" +
|
||||
"<input class=\"input\" name=\"workOrderType\" type=\"text\" value=\"" + cityssm.escapeHTML(workOrderType.workOrderType) + "\" maxlength=\"100\" required />" +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
"<td class=\"is-nowrap\">" +
|
||||
"<div class=\"field is-grouped\">" +
|
||||
"<div class=\"control\">" +
|
||||
("<div class=\"field has-addons\">" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button button--moveWorkOrderTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button button--moveWorkOrderTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button is-danger is-light button--deleteWorkOrderType\" data-tooltip=\"Delete Work Order Type\" type=\"button\" aria-label=\"Delete Work Order Type\">" +
|
||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown);
|
||||
tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType);
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
};
|
||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent) => {
|
||||
submitEvent.preventDefault();
|
||||
const formElement = submitEvent.currentTarget;
|
||||
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType", formElement, (responseJSON) => {
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
}
|
||||
else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
renderWorkOrderTypes();
|
||||
})();
|
||||
|
|
@ -0,0 +1,273 @@
|
|||
/* eslint-disable unicorn/prefer-module */
|
||||
|
||||
import type * as globalTypes from "../types/globalTypes";
|
||||
import type * as recordTypes from "../types/recordTypes";
|
||||
|
||||
import type {
|
||||
cityssmGlobal
|
||||
} from "@cityssm/bulma-webapp-js/src/types";
|
||||
|
||||
import type {
|
||||
BulmaJS
|
||||
} from "@cityssm/bulma-js/types";
|
||||
|
||||
declare const cityssm: cityssmGlobal;
|
||||
declare const bulmaJS: BulmaJS;
|
||||
|
||||
|
||||
(() => {
|
||||
const los = (exports.los as globalTypes.LOS);
|
||||
|
||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||
|
||||
/*
|
||||
* Work Order Types
|
||||
*/
|
||||
|
||||
let workOrderTypes: recordTypes.WorkOrderType[] = exports.workOrderTypes;
|
||||
delete exports.workOrderTypes;
|
||||
|
||||
const updateWorkOrderType = (submitEvent: SubmitEvent) => {
|
||||
|
||||
submitEvent.preventDefault();
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/admin/doUpdateWorkOrderType",
|
||||
submitEvent.currentTarget,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
workOrderTypes ? : recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
if (responseJSON.success) {
|
||||
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Updated Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Updating Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const deleteWorkOrderType = (clickEvent: Event) => {
|
||||
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr");
|
||||
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
|
||||
const doDelete = () => {
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/admin/doDeleteWorkOrderType", {
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
workOrderTypes ? : recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
|
||||
if (workOrderTypes.length === 0) {
|
||||
renderWorkOrderTypes();
|
||||
} else {
|
||||
tableRowElement.remove();
|
||||
}
|
||||
|
||||
bulmaJS.alert({
|
||||
message: "Work Order Type Deleted Successfully",
|
||||
contextualColorName: "success"
|
||||
});
|
||||
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Deleting Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
bulmaJS.confirm({
|
||||
title: "Delete Work Order Type",
|
||||
message: "Are you sure you want to delete this work order type?<br />" +
|
||||
"Note that no work orders will be removed.",
|
||||
messageIsHtml: true,
|
||||
contextualColorName: "warning",
|
||||
okButton: {
|
||||
text: "Yes, Delete Work Order Type",
|
||||
callbackFunction: doDelete
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const moveWorkOrderTypeUp = (clickEvent: Event) => {
|
||||
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr");
|
||||
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeUp", {
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
workOrderTypes ? : recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const moveWorkOrderTypeDown = (clickEvent: Event) => {
|
||||
|
||||
const tableRowElement = (clickEvent.currentTarget as HTMLElement).closest("tr");
|
||||
|
||||
const workOrderTypeId = tableRowElement.dataset.workOrderTypeId;
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/admin/doMoveWorkOrderTypeDown", {
|
||||
workOrderTypeId
|
||||
},
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
workOrderTypes ? : recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Moving Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const renderWorkOrderTypes = () => {
|
||||
|
||||
const containerElement = document.querySelector("#container--workOrderTypes") as HTMLTableSectionElement;
|
||||
|
||||
if (workOrderTypes.length === 0) {
|
||||
containerElement.innerHTML = "<tr>" +
|
||||
"<td colspan=\"2\">" +
|
||||
"<div class=\"message is-warning\">" +
|
||||
"<p class=\"message-body\">There are no active work order types.</p>" +
|
||||
"</div>" +
|
||||
"</td>" +
|
||||
"</tr>";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
containerElement.innerHTML = "";
|
||||
|
||||
for (const workOrderType of workOrderTypes) {
|
||||
|
||||
const tableRowElement = document.createElement("tr");
|
||||
|
||||
tableRowElement.dataset.workOrderTypeId = workOrderType.workOrderTypeId.toString();
|
||||
|
||||
tableRowElement.innerHTML = "<td>" +
|
||||
"<form>" +
|
||||
"<input name=\"workOrderTypeId\" type=\"hidden\" value=\"" + workOrderType.workOrderTypeId.toString() + "\" />" +
|
||||
("<div class=\"field has-addons\">" +
|
||||
"<div class=\"control\">" +
|
||||
"<input class=\"input\" name=\"workOrderType\" type=\"text\" value=\"" + cityssm.escapeHTML(workOrderType.workOrderType) + "\" maxlength=\"100\" required />" +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button is-success\" type=\"submit\"><i class=\"fas fa-save\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</form>" +
|
||||
"</td>" +
|
||||
"<td class=\"is-nowrap\">" +
|
||||
"<div class=\"field is-grouped\">" +
|
||||
"<div class=\"control\">" +
|
||||
("<div class=\"field has-addons\">" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button button--moveWorkOrderTypeUp\" data-tooltip=\"Move Up\" type=\"button\" aria-label=\"Move Up\"><i class=\"fas fa-arrow-up\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button button--moveWorkOrderTypeDown\" data-tooltip=\"Move Down\" type=\"button\" aria-label=\"Move Down\"><i class=\"fas fa-arrow-down\" aria-hidden=\"true\"></i></button>" +
|
||||
"</div>" +
|
||||
"</div>") +
|
||||
"</div>" +
|
||||
"<div class=\"control\">" +
|
||||
"<button class=\"button is-danger is-light button--deleteWorkOrderType\" data-tooltip=\"Delete Work Order Type\" type=\"button\" aria-label=\"Delete Work Order Type\">" +
|
||||
"<i class=\"fas fa-trash\" aria-hidden=\"true\"></i>" +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</td>";
|
||||
|
||||
tableRowElement.querySelector("form").addEventListener("submit", updateWorkOrderType);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click", moveWorkOrderTypeUp);
|
||||
tableRowElement.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click", moveWorkOrderTypeDown);
|
||||
tableRowElement.querySelector(".button--deleteWorkOrderType").addEventListener("click", deleteWorkOrderType);
|
||||
|
||||
containerElement.append(tableRowElement);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
document.querySelector("#form--addWorkOrderType").addEventListener("submit", (submitEvent: SubmitEvent) => {
|
||||
|
||||
submitEvent.preventDefault();
|
||||
|
||||
const formElement = submitEvent.currentTarget as HTMLFormElement;
|
||||
|
||||
cityssm.postJSON(urlPrefix + "/admin/doAddWorkOrderType",
|
||||
formElement,
|
||||
(responseJSON: {
|
||||
success: boolean;
|
||||
errorMessage ? : string;
|
||||
workOrderTypes ? : recordTypes.WorkOrderType[];
|
||||
}) => {
|
||||
|
||||
if (responseJSON.success) {
|
||||
workOrderTypes = responseJSON.workOrderTypes;
|
||||
renderWorkOrderTypes();
|
||||
formElement.reset();
|
||||
formElement.querySelector("input").focus();
|
||||
} else {
|
||||
bulmaJS.alert({
|
||||
title: "Error Adding Work Order Type",
|
||||
message: responseJSON.errorMessage,
|
||||
contextualColorName: "danger"
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
renderWorkOrderTypes();
|
||||
|
||||
})();
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{exports.los;const e=document.querySelector("main").dataset.urlPrefix;let r=exports.workOrderTypes;delete exports.workOrderTypes;const t=t=>{t.preventDefault(),cityssm.postJSON(e+"/admin/doUpdateWorkOrderType",t.currentTarget,e=>{e.success?(r=e.workOrderTypes,bulmaJS.alert({message:"Work Order Type Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Updating Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},o=t=>{const o=t.currentTarget.closest("tr"),s=o.dataset.workOrderTypeId;bulmaJS.confirm({title:"Delete Work Order Type",message:"Are you sure you want to delete this work order type?<br />Note that no work orders will be removed.",messageIsHtml:!0,contextualColorName:"warning",okButton:{text:"Yes, Delete Work Order Type",callbackFunction:()=>{cityssm.postJSON(e+"/admin/doDeleteWorkOrderType",{workOrderTypeId:s},e=>{e.success?(0===(r=e.workOrderTypes).length?d():o.remove(),bulmaJS.alert({message:"Work Order Type Deleted Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Deleting Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}}})},s=t=>{const o=t.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeUp",{workOrderTypeId:o},e=>{e.success?(r=e.workOrderTypes,d()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},a=t=>{const o=t.currentTarget.closest("tr").dataset.workOrderTypeId;cityssm.postJSON(e+"/admin/doMoveWorkOrderTypeDown",{workOrderTypeId:o},e=>{e.success?(r=e.workOrderTypes,d()):bulmaJS.alert({title:"Error Moving Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})},d=()=>{const e=document.querySelector("#container--workOrderTypes");if(0!==r.length){e.innerHTML="";for(const d of r){const r=document.createElement("tr");r.dataset.workOrderTypeId=d.workOrderTypeId.toString(),r.innerHTML='<td><form><input name="workOrderTypeId" type="hidden" value="'+d.workOrderTypeId.toString()+'" /><div class="field has-addons"><div class="control"><input class="input" name="workOrderType" type="text" value="'+cityssm.escapeHTML(d.workOrderType)+'" maxlength="100" required /></div><div class="control"><button class="button is-success" type="submit"><i class="fas fa-save" aria-hidden="true"></i></button></div></div></form></td><td class="is-nowrap"><div class="field is-grouped"><div class="control"><div class="field has-addons"><div class="control"><button class="button button--moveWorkOrderTypeUp" data-tooltip="Move Up" type="button" aria-label="Move Up"><i class="fas fa-arrow-up" aria-hidden="true"></i></button></div><div class="control"><button class="button button--moveWorkOrderTypeDown" data-tooltip="Move Down" type="button" aria-label="Move Down"><i class="fas fa-arrow-down" aria-hidden="true"></i></button></div></div></div><div class="control"><button class="button is-danger is-light button--deleteWorkOrderType" data-tooltip="Delete Work Order Type" type="button" aria-label="Delete Work Order Type"><i class="fas fa-trash" aria-hidden="true"></i></button></div></div></td>',r.querySelector("form").addEventListener("submit",t),r.querySelector(".button--moveWorkOrderTypeUp").addEventListener("click",s),r.querySelector(".button--moveWorkOrderTypeDown").addEventListener("click",a),r.querySelector(".button--deleteWorkOrderType").addEventListener("click",o),e.append(r)}}else e.innerHTML='<tr><td colspan="2"><div class="message is-warning"><p class="message-body">There are no active work order types.</p></div></td></tr>'};document.querySelector("#form--addWorkOrderType").addEventListener("submit",t=>{t.preventDefault();const o=t.currentTarget;cityssm.postJSON(e+"/admin/doAddWorkOrderType",o,e=>{e.success?(r=e.workOrderTypes,d(),o.reset(),o.querySelector("input").focus()):bulmaJS.alert({title:"Error Adding Work Order Type",message:e.errorMessage,contextualColorName:"danger"})})}),d()})();
|
||||
|
|
@ -7,6 +7,12 @@ import handler_doDeleteFeeCategory from "../handlers/admin-post/doDeleteFeeCateg
|
|||
import handler_doAddFee from "../handlers/admin-post/doAddFee.js";
|
||||
import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js";
|
||||
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
||||
import handler_tables from "../handlers/admin-get/tables.js";
|
||||
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
||||
import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js";
|
||||
import handler_doMoveWorkOrderTypeUp from "../handlers/admin-post/doMoveWorkOrderTypeUp.js";
|
||||
import handler_doMoveWorkOrderTypeDown from "../handlers/admin-post/doMoveWorkOrderTypeDown.js";
|
||||
import handler_doDeleteWorkOrderType from "../handlers/admin-post/doDeleteWorkOrderType.js";
|
||||
export const router = Router();
|
||||
router.get("/fees", permissionHandlers.adminGetHandler, handler_fees);
|
||||
router.post("/doAddFeeCategory", permissionHandlers.adminPostHandler, handler_doAddFeeCategory);
|
||||
|
|
@ -15,4 +21,10 @@ router.post("/doDeleteFeeCategory", permissionHandlers.adminPostHandler, handler
|
|||
router.post("/doAddFee", permissionHandlers.adminPostHandler, handler_doAddFee);
|
||||
router.post("/doUpdateFee", permissionHandlers.adminPostHandler, handler_doUpdateFee);
|
||||
router.post("/doDeleteFee", permissionHandlers.adminPostHandler, handler_doDeleteFee);
|
||||
router.get("/tables", permissionHandlers.adminGetHandler, handler_tables);
|
||||
router.post("/doAddWorkOrderType", permissionHandlers.adminPostHandler, handler_doAddWorkOrderType);
|
||||
router.post("/doUpdateWorkOrderType", permissionHandlers.adminPostHandler, handler_doUpdateWorkOrderType);
|
||||
router.post("/doMoveWorkOrderTypeUp", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeUp);
|
||||
router.post("/doMoveWorkOrderTypeDown", permissionHandlers.adminPostHandler, handler_doMoveWorkOrderTypeDown);
|
||||
router.post("/doDeleteWorkOrderType", permissionHandlers.adminPostHandler, handler_doDeleteWorkOrderType);
|
||||
export default router;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,14 @@ import handler_doAddFee from "../handlers/admin-post/doAddFee.js";
|
|||
import handler_doUpdateFee from "../handlers/admin-post/doUpdateFee.js";
|
||||
import handler_doDeleteFee from "../handlers/admin-post/doDeleteFee.js";
|
||||
|
||||
import handler_tables from "../handlers/admin-get/tables.js";
|
||||
|
||||
import handler_doAddWorkOrderType from "../handlers/admin-post/doAddWorkOrderType.js";
|
||||
import handler_doUpdateWorkOrderType from "../handlers/admin-post/doUpdateWorkOrderType.js";
|
||||
import handler_doMoveWorkOrderTypeUp from "../handlers/admin-post/doMoveWorkOrderTypeUp.js";
|
||||
import handler_doMoveWorkOrderTypeDown from "../handlers/admin-post/doMoveWorkOrderTypeDown.js";
|
||||
import handler_doDeleteWorkOrderType from "../handlers/admin-post/doDeleteWorkOrderType.js";
|
||||
|
||||
|
||||
export const router = Router();
|
||||
|
||||
|
|
@ -47,5 +55,31 @@ router.post("/doDeleteFee",
|
|||
permissionHandlers.adminPostHandler,
|
||||
handler_doDeleteFee);
|
||||
|
||||
// Config Tables
|
||||
|
||||
router.get("/tables",
|
||||
permissionHandlers.adminGetHandler,
|
||||
handler_tables);
|
||||
|
||||
router.post("/doAddWorkOrderType",
|
||||
permissionHandlers.adminPostHandler,
|
||||
handler_doAddWorkOrderType);
|
||||
|
||||
router.post("/doUpdateWorkOrderType",
|
||||
permissionHandlers.adminPostHandler,
|
||||
handler_doUpdateWorkOrderType);
|
||||
|
||||
router.post("/doMoveWorkOrderTypeUp",
|
||||
permissionHandlers.adminPostHandler,
|
||||
handler_doMoveWorkOrderTypeUp);
|
||||
|
||||
router.post("/doMoveWorkOrderTypeDown",
|
||||
permissionHandlers.adminPostHandler,
|
||||
handler_doMoveWorkOrderTypeDown);
|
||||
|
||||
router.post("/doDeleteWorkOrderType",
|
||||
permissionHandlers.adminPostHandler,
|
||||
handler_doDeleteWorkOrderType);
|
||||
|
||||
|
||||
export default router;
|
||||
|
|
@ -185,6 +185,11 @@ export interface LotOccupancy extends Record {
|
|||
lotOccupancyFees?: LotOccupancyFee[];
|
||||
lotOccupancyTransactions?: LotOccupancyTransaction[];
|
||||
}
|
||||
export interface WorkOrderType extends Record {
|
||||
workOrderTypeId?: number;
|
||||
workOrderType?: string;
|
||||
orderNumber?: number;
|
||||
}
|
||||
export interface User {
|
||||
userName: string;
|
||||
userProperties?: UserProperties;
|
||||
|
|
|
|||
|
|
@ -264,6 +264,18 @@ export interface LotOccupancy extends Record {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* WORK ORDER TYPES
|
||||
*/
|
||||
|
||||
|
||||
export interface WorkOrderType extends Record {
|
||||
workOrderTypeId ? : number;
|
||||
workOrderType ? : string;
|
||||
orderNumber ? : number;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* USER TYPES
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
<%- include('_header'); -%>
|
||||
|
||||
<nav class="breadcrumb">
|
||||
<ul>
|
||||
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||
<li>
|
||||
<a href="#">
|
||||
|
||||
<span class="icon is-small"><i class="fas fa-cog" aria-hidden="true"></i></span>
|
||||
<span>Administrator Tools</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="is-active">
|
||||
<a href="#" aria-current="page">
|
||||
Config Table Management
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<h1 class="title is-1">
|
||||
Config Table Management
|
||||
</h1>
|
||||
|
||||
<div class="tabs is-boxed">
|
||||
<ul>
|
||||
<li class="is-active">
|
||||
<a href="#tab--workOrderTypes">
|
||||
<span class="icon is-small"><i class="fas fa-table" aria-hidden="true"></i></span>
|
||||
<span>Work Order Types</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#tab--lotStatuses">
|
||||
<span class="icon is-small"><i class="fas fa-table" aria-hidden="true"></i></span>
|
||||
<span><%= configFunctions.getProperty("aliases.lot") %> Statuses</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#tab--lotOccupantTypes">
|
||||
<span class="icon is-small"><i class="fas fa-table" aria-hidden="true"></i></span>
|
||||
<span><%= configFunctions.getProperty("aliases.lot") %> <%= configFunctions.getProperty("aliases.occupant") %> Types</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tabs-container">
|
||||
<div id="tab--workOrderTypes">
|
||||
<h2 class="title is-4">Work Order Types</h2>
|
||||
<table class="table is-striped is-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Work Order Type</th>
|
||||
<th class="has-text-centered has-width-1">Options</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<form id="form--addWorkOrderType">
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<input class="input" name="workOrderType" type="text" maxlength="100" placeholder="New Work Order Type" required />
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button is-success" data-tooltip="Add Work Order Type" type="submit" aria-label="Add Work Order Type">
|
||||
<i class="fas fa-plus" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody id="container--workOrderTypes"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="is-hidden" id="tab--lotStatuses">
|
||||
<h2 class="title is-4"><%= configFunctions.getProperty("aliases.lot") %> Statuses</h2>
|
||||
</div>
|
||||
<div class="is-hidden" id="tab--lotOccupantTypes">
|
||||
<h2 class="title is-4"><%= configFunctions.getProperty("aliases.lot") %> <%= configFunctions.getProperty("aliases.occupant") %> Types</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('_footerA'); -%>
|
||||
|
||||
<script>
|
||||
exports.workOrderTypes = <%- JSON.stringify(workOrderTypes) %>;
|
||||
exports.lotStatuses = <%- JSON.stringify(lotStatuses) %>;
|
||||
exports.lotOccupantTypes = <%- JSON.stringify(lotOccupantTypes) %>;
|
||||
</script>
|
||||
|
||||
<script src="<%= urlPrefix %>/javascripts/adminTables.min.js"></script>
|
||||
|
||||
<%- include('_footerB'); -%>
|
||||
|
|
@ -145,6 +145,24 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<i class="fas fa-3x fa-fw fa-table" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="media-content has-text-black">
|
||||
<h2 class="title is-4 is-marginless">
|
||||
<a href="<%= urlPrefix %>/admin/tables">Config Table Management</a>
|
||||
</h2>
|
||||
<p>
|
||||
Manage simple configuration tables fees for
|
||||
work order types,
|
||||
<%= configFunctions.getProperty("aliases.lot").toLowerCase() %> statuses,
|
||||
and <%= configFunctions.getProperty("aliases.lot").toLowerCase() %> <%= configFunctions.getProperty("aliases.occupant").toLowerCase() %> types.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in New Issue