show conflicting milestones when scheduling

closes #87
deepsource-autofix-76c6eb20
Dan Gowans 2024-06-25 13:42:51 -04:00
parent 5a4de85190
commit 20d3d89558
10 changed files with 527 additions and 250 deletions

View File

@ -1,9 +1,10 @@
import { type DateString } from '@cityssm/utils-datetime';
import type { PoolConnection } from 'better-sqlite-pool'; import type { PoolConnection } from 'better-sqlite-pool';
import type { WorkOrderMilestone } from '../types/recordTypes.js'; import type { WorkOrderMilestone } from '../types/recordTypes.js';
export interface WorkOrderMilestoneFilters { export interface WorkOrderMilestoneFilters {
workOrderId?: number | string; workOrderId?: number | string;
workOrderMilestoneDateFilter?: 'upcomingMissed' | 'recent' | 'date' | 'blank' | 'notBlank'; workOrderMilestoneDateFilter?: 'upcomingMissed' | 'recent' | 'date' | 'blank' | 'notBlank';
workOrderMilestoneDateString?: string; workOrderMilestoneDateString?: '' | DateString;
workOrderTypeIds?: string; workOrderTypeIds?: string;
workOrderMilestoneTypeIds?: string; workOrderMilestoneTypeIds?: string;
} }

View File

@ -42,11 +42,12 @@ function buildWhereClause(filters) {
break; break;
} }
} }
if ((filters.workOrderMilestoneDateString ?? '') !== '') { if (filters.workOrderMilestoneDateString !== undefined && filters.workOrderMilestoneDateString !== '') {
sqlWhereClause += ' and m.workOrderMilestoneDate = ?'; sqlWhereClause += ' and m.workOrderMilestoneDate = ?';
sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString)); sqlParameters.push(dateStringToInteger(filters.workOrderMilestoneDateString));
} }
if ((filters.workOrderTypeIds ?? '') !== '' && if (filters.workOrderTypeIds !== undefined &&
filters.workOrderTypeIds !== '' &&
commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) { commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)) {
sqlWhereClause += ` and w.workOrderTypeId in (${filters.workOrderTypeIds})`; sqlWhereClause += ` and w.workOrderTypeId in (${filters.workOrderTypeIds})`;
} }

View File

@ -23,7 +23,7 @@ export interface WorkOrderMilestoneFilters {
| 'date' | 'date'
| 'blank' | 'blank'
| 'notBlank' | 'notBlank'
workOrderMilestoneDateString?: string workOrderMilestoneDateString?: '' | DateString
workOrderTypeIds?: string workOrderTypeIds?: string
workOrderMilestoneTypeIds?: string workOrderMilestoneTypeIds?: string
} }
@ -33,6 +33,7 @@ interface WorkOrderMilestoneOptions {
orderBy: 'completion' | 'date' orderBy: 'completion' | 'date'
} }
// eslint-disable-next-line security/detect-unsafe-regex
const commaSeparatedNumbersRegex = /^\d+(?:,\d+)*$/ const commaSeparatedNumbersRegex = /^\d+(?:,\d+)*$/
function buildWhereClause(filters: WorkOrderMilestoneFilters): { function buildWhereClause(filters: WorkOrderMilestoneFilters): {
@ -98,16 +99,17 @@ function buildWhereClause(filters: WorkOrderMilestoneFilters): {
} }
} }
if ((filters.workOrderMilestoneDateString ?? '') !== '') { if (filters.workOrderMilestoneDateString !== undefined && filters.workOrderMilestoneDateString !== '') {
sqlWhereClause += ' and m.workOrderMilestoneDate = ?' sqlWhereClause += ' and m.workOrderMilestoneDate = ?'
sqlParameters.push( sqlParameters.push(
dateStringToInteger(filters.workOrderMilestoneDateString as DateString) dateStringToInteger(filters.workOrderMilestoneDateString)
) )
} }
if ( if (
(filters.workOrderTypeIds ?? '') !== '' && filters.workOrderTypeIds !== undefined &&
commaSeparatedNumbersRegex.test(filters.workOrderTypeIds!) filters.workOrderTypeIds !== '' &&
commaSeparatedNumbersRegex.test(filters.workOrderTypeIds)
) { ) {
sqlWhereClause += ` and w.workOrderTypeId in (${filters.workOrderTypeIds})` sqlWhereClause += ` and w.workOrderTypeId in (${filters.workOrderTypeIds})`
} }
@ -115,7 +117,7 @@ function buildWhereClause(filters: WorkOrderMilestoneFilters): {
if ( if (
filters.workOrderMilestoneTypeIds !== undefined && filters.workOrderMilestoneTypeIds !== undefined &&
filters.workOrderMilestoneTypeIds !== '' && filters.workOrderMilestoneTypeIds !== '' &&
commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds!) commaSeparatedNumbersRegex.test(filters.workOrderMilestoneTypeIds)
) { ) {
sqlWhereClause += ` and m.workOrderMilestoneTypeId in (${filters.workOrderMilestoneTypeIds})` sqlWhereClause += ` and m.workOrderMilestoneTypeId in (${filters.workOrderMilestoneTypeIds})`
} }

View File

@ -1,15 +1,20 @@
import type { Request, Response } from 'express' import type { Request, Response } from 'express'
import getWorkOrderMilestones from '../../database/getWorkOrderMilestones.js' import getWorkOrderMilestones, {
type WorkOrderMilestoneFilters
} from '../../database/getWorkOrderMilestones.js'
export default async function handler( export default async function handler(
request: Request, request: Request,
response: Response response: Response
): Promise<void> { ): Promise<void> {
const workOrderMilestones = await getWorkOrderMilestones(request.body, { const workOrderMilestones = await getWorkOrderMilestones(
includeWorkOrders: true, request.body as WorkOrderMilestoneFilters,
orderBy: 'date' {
}) includeWorkOrders: true,
orderBy: 'date'
}
)
response.json({ response.json({
workOrderMilestones workOrderMilestones

View File

@ -1,15 +1,15 @@
"use strict"; "use strict";
/* eslint-disable spaced-comment, @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ // eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable unicorn/prefer-module */
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a, _b, _c; var _a, _b, _c, _d;
const los = exports.los; const los = exports.los;
const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value; const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value;
const isCreate = workOrderId === ''; const isCreate = workOrderId === '';
const workOrderFormElement = document.querySelector('#form--workOrderEdit'); const workOrderFormElement = document.querySelector('#form--workOrderEdit');
los.initializeDatePickers(workOrderFormElement los.initializeDatePickers((_a = workOrderFormElement
.querySelector('#workOrderEdit--workOrderOpenDateString') .querySelector('#workOrderEdit--workOrderOpenDateString')) === null || _a === void 0 ? void 0 : _a.closest('.field'));
.closest('.field'));
los.initializeUnlockFieldButtons(workOrderFormElement); los.initializeUnlockFieldButtons(workOrderFormElement);
function setUnsavedChanges() { function setUnsavedChanges() {
var _a; var _a;
@ -59,7 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Work Order Options * Work Order Options
*/ */
function doClose() { function doClose() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', { cityssm.postJSON(`${los.urlPrefix}/workOrders/doCloseWorkOrder`, {
workOrderId workOrderId
}, (rawResponseJSON) => { }, (rawResponseJSON) => {
var _a; var _a;
@ -78,14 +78,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', { cityssm.postJSON(`${los.urlPrefix}/workOrders/doDeleteWorkOrder`, {
workOrderId workOrderId
}, (rawResponseJSON) => { }, (rawResponseJSON) => {
var _a; var _a;
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
if (responseJSON.success) { if (responseJSON.success) {
clearUnsavedChanges(); clearUnsavedChanges();
window.location.href = los.urlPrefix + '/workOrders'; window.location.href = `${los.urlPrefix}/workOrders`;
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -97,8 +97,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
let workOrderMilestones; let workOrderMilestones;
(_a = document (_b = document
.querySelector('#button--closeWorkOrder')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => { .querySelector('#button--closeWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', () => {
const hasOpenMilestones = workOrderMilestones.some((milestone) => { const hasOpenMilestones = workOrderMilestones.some((milestone) => {
return !milestone.workOrderMilestoneCompletionDate; return !milestone.workOrderMilestoneCompletionDate;
}); });
@ -137,8 +137,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
}); });
(_b = document (_c = document
.querySelector('#button--deleteWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => { .querySelector('#button--deleteWorkOrder')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
bulmaJS.confirm({ bulmaJS.confirm({
title: 'Delete Work Order', title: 'Delete Work Order',
@ -914,6 +914,56 @@ Object.defineProperty(exports, "__esModule", { value: true });
/* /*
* Milestones * Milestones
*/ */
function clearPanelBlockElements(panelElement) {
for (const panelBlockElement of panelElement.querySelectorAll('.panel-block')) {
panelBlockElement.remove();
}
}
function refreshConflictingMilestones(workOrderMilestoneDateString, targetPanelElement) {
// Clear panel-block elements
clearPanelBlockElements(targetPanelElement);
// eslint-disable-next-line no-unsanitized/method
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
${los.getLoadingParagraphHTML('Loading conflicting milestones...')}
</div>`);
cityssm.postJSON(`${los.urlPrefix}/workOrders/doGetWorkOrderMilestones`, {
workOrderMilestoneDateFilter: 'date',
workOrderMilestoneDateString
}, (rawResponseJSON) => {
var _a, _b, _c, _d;
const responseJSON = rawResponseJSON;
const workOrderMilestones = responseJSON.workOrderMilestones.filter((possibleMilestone) => {
return possibleMilestone.workOrderId.toString() !== workOrderId;
});
clearPanelBlockElements(targetPanelElement);
for (const milestone of workOrderMilestones) {
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="columns">
<div class="column is-5">
${cityssm.escapeHTML(milestone.workOrderMilestoneTime === 0 ? 'No Time' : (_a = milestone.workOrderMilestoneTimePeriodString) !== null && _a !== void 0 ? _a : '')}<br />
<strong>${cityssm.escapeHTML((_b = milestone.workOrderMilestoneType) !== null && _b !== void 0 ? _b : '')}</strong>
</div>
<div class="column">
${cityssm.escapeHTML((_c = milestone.workOrderNumber) !== null && _c !== void 0 ? _c : '')}<br />
<span class="is-size-7">
${cityssm.escapeHTML((_d = milestone.workOrderDescription) !== null && _d !== void 0 ? _d : '')}
</span>
</div>
</div>
</div>`);
}
if (workOrderMilestones.length === 0) {
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">
There are no milestones on other work orders scheduled for
${cityssm.escapeHTML(workOrderMilestoneDateString)}.
</p>
</div>
</div>`);
}
});
}
function processMilestoneResponse(rawResponseJSON) { function processMilestoneResponse(rawResponseJSON) {
var _a; var _a;
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
@ -1002,9 +1052,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
let workOrderMilestoneDateStringElement;
function doEdit(submitEvent) { function doEdit(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (rawResponseJSON) => { cityssm.postJSON(`${los.urlPrefix}/workOrders/doUpdateWorkOrderMilestone`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -1014,9 +1065,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
cityssm.openHtmlModal('workOrder-editMilestone', { cityssm.openHtmlModal('workOrder-editMilestone', {
onshow(modalElement) { onshow(modalElement) {
var _a, _b, _c, _d, _e;
; ;
modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId; modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString(); modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = (_b = (_a = workOrderMilestone.workOrderMilestoneId) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId'); const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId');
let milestoneTypeFound = false; let milestoneTypeFound = false;
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
@ -1040,21 +1092,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
optionElement.selected = true; optionElement.selected = true;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
; workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString');
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString; workOrderMilestoneDateStringElement.value = (_c = workOrderMilestone.workOrderMilestoneDateString) !== null && _c !== void 0 ? _c : '';
if (workOrderMilestone.workOrderMilestoneTime) { if (workOrderMilestone.workOrderMilestoneTime) {
; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = workOrderMilestone.workOrderMilestoneTimeString; modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = (_d = workOrderMilestone.workOrderMilestoneTimeString) !== null && _d !== void 0 ? _d : '';
} }
; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = workOrderMilestone.workOrderMilestoneDescription; modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = (_e = workOrderMilestone.workOrderMilestoneDescription) !== null && _e !== void 0 ? _e : '';
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
var _a;
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
modalElement.querySelector('form').addEventListener('submit', doEdit); (_a = modalElement.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doEdit);
const conflictingMilestonePanelElement = document.querySelector('#milestoneEdit--conflictingMilestonesPanel');
workOrderMilestoneDateStringElement.addEventListener('change', () => {
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
});
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -1152,10 +1210,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.workOrderMilestones; exports.workOrderMilestones;
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
renderMilestones(); renderMilestones();
(_c = document (_d = document
.querySelector('#button--addMilestone')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', () => { .querySelector('#button--addMilestone')) === null || _d === void 0 ? void 0 : _d.addEventListener('click', () => {
let addModalElement;
let addFormElement; let addFormElement;
let workOrderMilestoneDateStringElement;
let addCloseModalFunction; let addCloseModalFunction;
function doAdd(submitEvent) { function doAdd(submitEvent) {
if (submitEvent) { if (submitEvent) {
@ -1163,7 +1221,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
function _doAdd() { function _doAdd() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (rawResponseJSON) => { cityssm.postJSON(`${los.urlPrefix}/workOrders/doAddWorkOrderMilestone`, addFormElement, (rawResponseJSON) => {
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -1171,7 +1229,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
} }
const milestoneDateString = addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value; const milestoneDateString = workOrderMilestoneDateStringElement.value;
if (milestoneDateString !== '' && if (milestoneDateString !== '' &&
milestoneDateString < currentDateString) { milestoneDateString < currentDateString) {
bulmaJS.confirm({ bulmaJS.confirm({
@ -1200,11 +1258,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
optionElement.textContent = milestoneType.workOrderMilestoneType; optionElement.textContent = milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
; workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString');
modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date(); workOrderMilestoneDateStringElement.valueAsDate = new Date();
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addModalElement = modalElement;
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
@ -1212,6 +1269,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus(); modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus();
addFormElement = modalElement.querySelector('form'); addFormElement = modalElement.querySelector('form');
addFormElement.addEventListener('submit', doAdd); addFormElement.addEventListener('submit', doAdd);
const conflictingMilestonePanelElement = document.querySelector('#milestoneAdd--conflictingMilestonesPanel');
workOrderMilestoneDateStringElement.addEventListener('change', () => {
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
});
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

View File

@ -1,15 +1,15 @@
"use strict"; "use strict";
/* eslint-disable spaced-comment, @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ // eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable unicorn/prefer-module */
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
(() => { (() => {
var _a, _b, _c; var _a, _b, _c, _d;
const los = exports.los; const los = exports.los;
const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value; const workOrderId = document.querySelector('#workOrderEdit--workOrderId').value;
const isCreate = workOrderId === ''; const isCreate = workOrderId === '';
const workOrderFormElement = document.querySelector('#form--workOrderEdit'); const workOrderFormElement = document.querySelector('#form--workOrderEdit');
los.initializeDatePickers(workOrderFormElement los.initializeDatePickers((_a = workOrderFormElement
.querySelector('#workOrderEdit--workOrderOpenDateString') .querySelector('#workOrderEdit--workOrderOpenDateString')) === null || _a === void 0 ? void 0 : _a.closest('.field'));
.closest('.field'));
los.initializeUnlockFieldButtons(workOrderFormElement); los.initializeUnlockFieldButtons(workOrderFormElement);
function setUnsavedChanges() { function setUnsavedChanges() {
var _a; var _a;
@ -59,7 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Work Order Options * Work Order Options
*/ */
function doClose() { function doClose() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doCloseWorkOrder', { cityssm.postJSON(`${los.urlPrefix}/workOrders/doCloseWorkOrder`, {
workOrderId workOrderId
}, (rawResponseJSON) => { }, (rawResponseJSON) => {
var _a; var _a;
@ -78,14 +78,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
function doDelete() { function doDelete() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doDeleteWorkOrder', { cityssm.postJSON(`${los.urlPrefix}/workOrders/doDeleteWorkOrder`, {
workOrderId workOrderId
}, (rawResponseJSON) => { }, (rawResponseJSON) => {
var _a; var _a;
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
if (responseJSON.success) { if (responseJSON.success) {
clearUnsavedChanges(); clearUnsavedChanges();
window.location.href = los.urlPrefix + '/workOrders'; window.location.href = `${los.urlPrefix}/workOrders`;
} }
else { else {
bulmaJS.alert({ bulmaJS.alert({
@ -97,8 +97,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
let workOrderMilestones; let workOrderMilestones;
(_a = document (_b = document
.querySelector('#button--closeWorkOrder')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => { .querySelector('#button--closeWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', () => {
const hasOpenMilestones = workOrderMilestones.some((milestone) => { const hasOpenMilestones = workOrderMilestones.some((milestone) => {
return !milestone.workOrderMilestoneCompletionDate; return !milestone.workOrderMilestoneCompletionDate;
}); });
@ -137,8 +137,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
}); });
} }
}); });
(_b = document (_c = document
.querySelector('#button--deleteWorkOrder')) === null || _b === void 0 ? void 0 : _b.addEventListener('click', (clickEvent) => { .querySelector('#button--deleteWorkOrder')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault(); clickEvent.preventDefault();
bulmaJS.confirm({ bulmaJS.confirm({
title: 'Delete Work Order', title: 'Delete Work Order',
@ -163,6 +163,56 @@ Object.defineProperty(exports, "__esModule", { value: true });
/* /*
* Milestones * Milestones
*/ */
function clearPanelBlockElements(panelElement) {
for (const panelBlockElement of panelElement.querySelectorAll('.panel-block')) {
panelBlockElement.remove();
}
}
function refreshConflictingMilestones(workOrderMilestoneDateString, targetPanelElement) {
// Clear panel-block elements
clearPanelBlockElements(targetPanelElement);
// eslint-disable-next-line no-unsanitized/method
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
${los.getLoadingParagraphHTML('Loading conflicting milestones...')}
</div>`);
cityssm.postJSON(`${los.urlPrefix}/workOrders/doGetWorkOrderMilestones`, {
workOrderMilestoneDateFilter: 'date',
workOrderMilestoneDateString
}, (rawResponseJSON) => {
var _a, _b, _c, _d;
const responseJSON = rawResponseJSON;
const workOrderMilestones = responseJSON.workOrderMilestones.filter((possibleMilestone) => {
return possibleMilestone.workOrderId.toString() !== workOrderId;
});
clearPanelBlockElements(targetPanelElement);
for (const milestone of workOrderMilestones) {
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="columns">
<div class="column is-5">
${cityssm.escapeHTML(milestone.workOrderMilestoneTime === 0 ? 'No Time' : (_a = milestone.workOrderMilestoneTimePeriodString) !== null && _a !== void 0 ? _a : '')}<br />
<strong>${cityssm.escapeHTML((_b = milestone.workOrderMilestoneType) !== null && _b !== void 0 ? _b : '')}</strong>
</div>
<div class="column">
${cityssm.escapeHTML((_c = milestone.workOrderNumber) !== null && _c !== void 0 ? _c : '')}<br />
<span class="is-size-7">
${cityssm.escapeHTML((_d = milestone.workOrderDescription) !== null && _d !== void 0 ? _d : '')}
</span>
</div>
</div>
</div>`);
}
if (workOrderMilestones.length === 0) {
targetPanelElement.insertAdjacentHTML('beforeend', `<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">
There are no milestones on other work orders scheduled for
${cityssm.escapeHTML(workOrderMilestoneDateString)}.
</p>
</div>
</div>`);
}
});
}
function processMilestoneResponse(rawResponseJSON) { function processMilestoneResponse(rawResponseJSON) {
var _a; var _a;
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
@ -251,9 +301,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
return currentMilestone.workOrderMilestoneId === workOrderMilestoneId; return currentMilestone.workOrderMilestoneId === workOrderMilestoneId;
}); });
let editCloseModalFunction; let editCloseModalFunction;
let workOrderMilestoneDateStringElement;
function doEdit(submitEvent) { function doEdit(submitEvent) {
submitEvent.preventDefault(); submitEvent.preventDefault();
cityssm.postJSON(los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', submitEvent.currentTarget, (rawResponseJSON) => { cityssm.postJSON(`${los.urlPrefix}/workOrders/doUpdateWorkOrderMilestone`, submitEvent.currentTarget, (rawResponseJSON) => {
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -263,9 +314,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
cityssm.openHtmlModal('workOrder-editMilestone', { cityssm.openHtmlModal('workOrder-editMilestone', {
onshow(modalElement) { onshow(modalElement) {
var _a, _b, _c, _d, _e;
; ;
modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId; modalElement.querySelector('#milestoneEdit--workOrderId').value = workOrderId;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = workOrderMilestone.workOrderMilestoneId.toString(); modalElement.querySelector('#milestoneEdit--workOrderMilestoneId').value = (_b = (_a = workOrderMilestone.workOrderMilestoneId) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId'); const milestoneTypeElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneTypeId');
let milestoneTypeFound = false; let milestoneTypeFound = false;
for (const milestoneType of exports.workOrderMilestoneTypes) { for (const milestoneType of exports.workOrderMilestoneTypes) {
@ -289,21 +341,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
optionElement.selected = true; optionElement.selected = true;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
; workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString');
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDateString').value = workOrderMilestone.workOrderMilestoneDateString; workOrderMilestoneDateStringElement.value = (_c = workOrderMilestone.workOrderMilestoneDateString) !== null && _c !== void 0 ? _c : '';
if (workOrderMilestone.workOrderMilestoneTime) { if (workOrderMilestone.workOrderMilestoneTime) {
; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = workOrderMilestone.workOrderMilestoneTimeString; modalElement.querySelector('#milestoneEdit--workOrderMilestoneTimeString').value = (_d = workOrderMilestone.workOrderMilestoneTimeString) !== null && _d !== void 0 ? _d : '';
} }
; ;
modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = workOrderMilestone.workOrderMilestoneDescription; modalElement.querySelector('#milestoneEdit--workOrderMilestoneDescription').value = (_e = workOrderMilestone.workOrderMilestoneDescription) !== null && _e !== void 0 ? _e : '';
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
var _a;
editCloseModalFunction = closeModalFunction; editCloseModalFunction = closeModalFunction;
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
modalElement.querySelector('form').addEventListener('submit', doEdit); (_a = modalElement.querySelector('form')) === null || _a === void 0 ? void 0 : _a.addEventListener('submit', doEdit);
const conflictingMilestonePanelElement = document.querySelector('#milestoneEdit--conflictingMilestonesPanel');
workOrderMilestoneDateStringElement.addEventListener('change', () => {
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
});
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();
@ -401,10 +459,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.workOrderMilestones; exports.workOrderMilestones;
delete exports.workOrderMilestones; delete exports.workOrderMilestones;
renderMilestones(); renderMilestones();
(_c = document (_d = document
.querySelector('#button--addMilestone')) === null || _c === void 0 ? void 0 : _c.addEventListener('click', () => { .querySelector('#button--addMilestone')) === null || _d === void 0 ? void 0 : _d.addEventListener('click', () => {
let addModalElement;
let addFormElement; let addFormElement;
let workOrderMilestoneDateStringElement;
let addCloseModalFunction; let addCloseModalFunction;
function doAdd(submitEvent) { function doAdd(submitEvent) {
if (submitEvent) { if (submitEvent) {
@ -412,7 +470,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
const currentDateString = cityssm.dateToString(new Date()); const currentDateString = cityssm.dateToString(new Date());
function _doAdd() { function _doAdd() {
cityssm.postJSON(los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', addFormElement, (rawResponseJSON) => { cityssm.postJSON(`${los.urlPrefix}/workOrders/doAddWorkOrderMilestone`, addFormElement, (rawResponseJSON) => {
const responseJSON = rawResponseJSON; const responseJSON = rawResponseJSON;
processMilestoneResponse(responseJSON); processMilestoneResponse(responseJSON);
if (responseJSON.success) { if (responseJSON.success) {
@ -420,7 +478,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}); });
} }
const milestoneDateString = addModalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').value; const milestoneDateString = workOrderMilestoneDateStringElement.value;
if (milestoneDateString !== '' && if (milestoneDateString !== '' &&
milestoneDateString < currentDateString) { milestoneDateString < currentDateString) {
bulmaJS.confirm({ bulmaJS.confirm({
@ -449,11 +507,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
optionElement.textContent = milestoneType.workOrderMilestoneType; optionElement.textContent = milestoneType.workOrderMilestoneType;
milestoneTypeElement.append(optionElement); milestoneTypeElement.append(optionElement);
} }
; workOrderMilestoneDateStringElement = modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString');
modalElement.querySelector('#milestoneAdd--workOrderMilestoneDateString').valueAsDate = new Date(); workOrderMilestoneDateStringElement.valueAsDate = new Date();
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addModalElement = modalElement;
addCloseModalFunction = closeModalFunction; addCloseModalFunction = closeModalFunction;
los.initializeDatePickers(modalElement); los.initializeDatePickers(modalElement);
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
@ -461,6 +518,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus(); modalElement.querySelector('#milestoneAdd--workOrderMilestoneTypeId').focus();
addFormElement = modalElement.querySelector('form'); addFormElement = modalElement.querySelector('form');
addFormElement.addEventListener('submit', doAdd); addFormElement.addEventListener('submit', doAdd);
const conflictingMilestonePanelElement = document.querySelector('#milestoneAdd--conflictingMilestonesPanel');
workOrderMilestoneDateStringElement.addEventListener('change', () => {
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
});
refreshConflictingMilestones(workOrderMilestoneDateStringElement.value, conflictingMilestonePanelElement);
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped(); bulmaJS.toggleHtmlClipped();

View File

@ -1,13 +1,16 @@
/* eslint-disable spaced-comment, @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ // eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable unicorn/prefer-module */
import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types' import type { BulmaJS } from '@cityssm/bulma-js/types.js'
import type { BulmaJS } from '@cityssm/bulma-js/types' import type { cityssmGlobal } from '@cityssm/bulma-webapp-js/src/types.js'
import type * as globalTypes from '../../types/globalTypes' import type * as globalTypes from '../../types/globalTypes.js'
import type * as recordTypes from '../../types/recordTypes' import type * as recordTypes from '../../types/recordTypes.js'
declare const cityssm: cityssmGlobal declare const cityssm: cityssmGlobal
declare const bulmaJS: BulmaJS declare const bulmaJS: BulmaJS
declare const exports: Record<string, unknown>
;(() => { ;(() => {
const los = exports.los as globalTypes.LOS const los = exports.los as globalTypes.LOS
@ -23,8 +26,8 @@ declare const bulmaJS: BulmaJS
los.initializeDatePickers( los.initializeDatePickers(
workOrderFormElement workOrderFormElement
.querySelector('#workOrderEdit--workOrderOpenDateString')! .querySelector('#workOrderEdit--workOrderOpenDateString')
.closest('.field') as HTMLElement ?.closest('.field') as HTMLElement
) )
los.initializeUnlockFieldButtons(workOrderFormElement) los.initializeUnlockFieldButtons(workOrderFormElement)
@ -96,7 +99,7 @@ declare const bulmaJS: BulmaJS
function doClose(): void { function doClose(): void {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + '/workOrders/doCloseWorkOrder', `${los.urlPrefix}/workOrders/doCloseWorkOrder`,
{ {
workOrderId workOrderId
}, },
@ -122,7 +125,7 @@ declare const bulmaJS: BulmaJS
function doDelete(): void { function doDelete(): void {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + '/workOrders/doDeleteWorkOrder', `${los.urlPrefix}/workOrders/doDeleteWorkOrder`,
{ {
workOrderId workOrderId
}, },
@ -134,7 +137,7 @@ declare const bulmaJS: BulmaJS
if (responseJSON.success) { if (responseJSON.success) {
clearUnsavedChanges() clearUnsavedChanges()
window.location.href = los.urlPrefix + '/workOrders' window.location.href = `${los.urlPrefix}/workOrders`
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
title: 'Error Deleting Work Order', title: 'Error Deleting Work Order',
@ -225,15 +228,94 @@ declare const bulmaJS: BulmaJS
* Milestones * Milestones
*/ */
function clearPanelBlockElements(panelElement: HTMLElement): void {
for (const panelBlockElement of panelElement.querySelectorAll(
'.panel-block'
)) {
panelBlockElement.remove()
}
}
function refreshConflictingMilestones(
workOrderMilestoneDateString: string,
targetPanelElement: HTMLElement
): void {
// Clear panel-block elements
clearPanelBlockElements(targetPanelElement)
// eslint-disable-next-line no-unsanitized/method
targetPanelElement.insertAdjacentHTML(
'beforeend',
`<div class="panel-block is-block">
${los.getLoadingParagraphHTML('Loading conflicting milestones...')}
</div>`
)
cityssm.postJSON(
`${los.urlPrefix}/workOrders/doGetWorkOrderMilestones`,
{
workOrderMilestoneDateFilter: 'date',
workOrderMilestoneDateString
},
(rawResponseJSON) => {
const responseJSON = rawResponseJSON as {
workOrderMilestones: recordTypes.WorkOrderMilestone[]
}
const workOrderMilestones = responseJSON.workOrderMilestones.filter(
(possibleMilestone) => {
return possibleMilestone.workOrderId.toString() !== workOrderId
}
)
clearPanelBlockElements(targetPanelElement)
for (const milestone of workOrderMilestones) {
targetPanelElement.insertAdjacentHTML(
'beforeend',
`<div class="panel-block is-block">
<div class="columns">
<div class="column is-5">
${cityssm.escapeHTML(milestone.workOrderMilestoneTime === 0 ? 'No Time' : milestone.workOrderMilestoneTimePeriodString ?? '')}<br />
<strong>${cityssm.escapeHTML(milestone.workOrderMilestoneType ?? '')}</strong>
</div>
<div class="column">
${cityssm.escapeHTML(milestone.workOrderNumber ?? '')}<br />
<span class="is-size-7">
${cityssm.escapeHTML(milestone.workOrderDescription ?? '')}
</span>
</div>
</div>
</div>`
)
}
if (workOrderMilestones.length === 0) {
targetPanelElement.insertAdjacentHTML(
'beforeend',
`<div class="panel-block is-block">
<div class="message is-info">
<p class="message-body">
There are no milestones on other work orders scheduled for
${cityssm.escapeHTML(workOrderMilestoneDateString)}.
</p>
</div>
</div>`
)
}
}
)
}
function processMilestoneResponse(rawResponseJSON: unknown): void { function processMilestoneResponse(rawResponseJSON: unknown): void {
const responseJSON = rawResponseJSON as { const responseJSON = rawResponseJSON as {
success: boolean success: boolean
errorMessage?: string errorMessage?: string
workOrderMilestones?: recordTypes.WorkOrderMilestone[] workOrderMilestones: recordTypes.WorkOrderMilestone[]
} }
if (responseJSON.success) { if (responseJSON.success) {
workOrderMilestones = responseJSON.workOrderMilestones! workOrderMilestones = responseJSON.workOrderMilestones
renderMilestones() renderMilestones()
} else { } else {
bulmaJS.alert({ bulmaJS.alert({
@ -370,12 +452,13 @@ declare const bulmaJS: BulmaJS
})! })!
let editCloseModalFunction: () => void let editCloseModalFunction: () => void
let workOrderMilestoneDateStringElement: HTMLInputElement
function doEdit(submitEvent: SubmitEvent): void { function doEdit(submitEvent: SubmitEvent): void {
submitEvent.preventDefault() submitEvent.preventDefault()
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + '/workOrders/doUpdateWorkOrderMilestone', `${los.urlPrefix}/workOrders/doUpdateWorkOrderMilestone`,
submitEvent.currentTarget, submitEvent.currentTarget,
(rawResponseJSON) => { (rawResponseJSON) => {
const responseJSON = rawResponseJSON as { const responseJSON = rawResponseJSON as {
@ -403,7 +486,7 @@ declare const bulmaJS: BulmaJS
modalElement.querySelector( modalElement.querySelector(
'#milestoneEdit--workOrderMilestoneId' '#milestoneEdit--workOrderMilestoneId'
) as HTMLInputElement ) as HTMLInputElement
).value = workOrderMilestone.workOrderMilestoneId!.toString() ).value = workOrderMilestone.workOrderMilestoneId?.toString() ?? ''
const milestoneTypeElement = modalElement.querySelector( const milestoneTypeElement = modalElement.querySelector(
'#milestoneEdit--workOrderMilestoneTypeId' '#milestoneEdit--workOrderMilestoneTypeId'
@ -441,25 +524,27 @@ declare const bulmaJS: BulmaJS
milestoneTypeElement.append(optionElement) milestoneTypeElement.append(optionElement)
} }
;( workOrderMilestoneDateStringElement = (
modalElement.querySelector( modalElement.querySelector(
'#milestoneEdit--workOrderMilestoneDateString' '#milestoneEdit--workOrderMilestoneDateString'
) as HTMLInputElement ) as HTMLInputElement
).value = workOrderMilestone.workOrderMilestoneDateString! )
workOrderMilestoneDateStringElement.value = workOrderMilestone.workOrderMilestoneDateString ?? ''
if (workOrderMilestone.workOrderMilestoneTime) { if (workOrderMilestone.workOrderMilestoneTime) {
;( ;(
modalElement.querySelector( modalElement.querySelector(
'#milestoneEdit--workOrderMilestoneTimeString' '#milestoneEdit--workOrderMilestoneTimeString'
) as HTMLInputElement ) as HTMLInputElement
).value = workOrderMilestone.workOrderMilestoneTimeString! ).value = workOrderMilestone.workOrderMilestoneTimeString ?? ''
} }
;( ;(
modalElement.querySelector( modalElement.querySelector(
'#milestoneEdit--workOrderMilestoneDescription' '#milestoneEdit--workOrderMilestoneDescription'
) as HTMLTextAreaElement ) as HTMLTextAreaElement
).value = workOrderMilestone.workOrderMilestoneDescription! ).value = workOrderMilestone.workOrderMilestoneDescription ?? ''
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
editCloseModalFunction = closeModalFunction editCloseModalFunction = closeModalFunction
@ -468,7 +553,26 @@ declare const bulmaJS: BulmaJS
los.initializeDatePickers(modalElement) los.initializeDatePickers(modalElement)
// los.initializeTimePickers(modalElement); // los.initializeTimePickers(modalElement);
modalElement.querySelector('form')!.addEventListener('submit', doEdit) modalElement.querySelector('form')?.addEventListener('submit', doEdit)
const conflictingMilestonePanelElement = document.querySelector(
'#milestoneEdit--conflictingMilestonesPanel'
) as HTMLElement
workOrderMilestoneDateStringElement.addEventListener(
'change',
() => {
refreshConflictingMilestones(
workOrderMilestoneDateStringElement.value,
conflictingMilestonePanelElement
)
}
)
refreshConflictingMilestones(
workOrderMilestoneDateStringElement.value,
conflictingMilestonePanelElement
)
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped() bulmaJS.toggleHtmlClipped()
@ -588,8 +692,9 @@ declare const bulmaJS: BulmaJS
document document
.querySelector('#button--addMilestone') .querySelector('#button--addMilestone')
?.addEventListener('click', () => { ?.addEventListener('click', () => {
let addModalElement: HTMLElement
let addFormElement: HTMLFormElement let addFormElement: HTMLFormElement
let workOrderMilestoneDateStringElement: HTMLInputElement
let addCloseModalFunction: () => void let addCloseModalFunction: () => void
function doAdd(submitEvent: SubmitEvent): void { function doAdd(submitEvent: SubmitEvent): void {
@ -601,7 +706,7 @@ declare const bulmaJS: BulmaJS
function _doAdd(): void { function _doAdd(): void {
cityssm.postJSON( cityssm.postJSON(
los.urlPrefix + '/workOrders/doAddWorkOrderMilestone', `${los.urlPrefix}/workOrders/doAddWorkOrderMilestone`,
addFormElement, addFormElement,
(rawResponseJSON) => { (rawResponseJSON) => {
const responseJSON = rawResponseJSON as { const responseJSON = rawResponseJSON as {
@ -619,11 +724,7 @@ declare const bulmaJS: BulmaJS
) )
} }
const milestoneDateString = ( const milestoneDateString = workOrderMilestoneDateStringElement.value
addModalElement.querySelector(
'#milestoneAdd--workOrderMilestoneDateString'
) as HTMLInputElement
).value
if ( if (
milestoneDateString !== '' && milestoneDateString !== '' &&
@ -666,14 +767,14 @@ declare const bulmaJS: BulmaJS
milestoneTypeElement.append(optionElement) milestoneTypeElement.append(optionElement)
} }
;( workOrderMilestoneDateStringElement = modalElement.querySelector(
modalElement.querySelector( '#milestoneAdd--workOrderMilestoneDateString'
'#milestoneAdd--workOrderMilestoneDateString' ) as HTMLInputElement
) as HTMLInputElement
).valueAsDate = new Date() workOrderMilestoneDateStringElement.valueAsDate = new Date()
}, },
onshown(modalElement, closeModalFunction) { onshown(modalElement, closeModalFunction) {
addModalElement = modalElement
addCloseModalFunction = closeModalFunction addCloseModalFunction = closeModalFunction
los.initializeDatePickers(modalElement) los.initializeDatePickers(modalElement)
@ -686,8 +787,29 @@ declare const bulmaJS: BulmaJS
) as HTMLSelectElement ) as HTMLSelectElement
).focus() ).focus()
addFormElement = modalElement.querySelector('form')! addFormElement = modalElement.querySelector(
'form'
) as HTMLFormElement
addFormElement.addEventListener('submit', doAdd) addFormElement.addEventListener('submit', doAdd)
const conflictingMilestonePanelElement = document.querySelector(
'#milestoneAdd--conflictingMilestonesPanel'
) as HTMLElement
workOrderMilestoneDateStringElement.addEventListener(
'change',
() => {
refreshConflictingMilestones(
workOrderMilestoneDateStringElement.value,
conflictingMilestonePanelElement
)
}
)
refreshConflictingMilestones(
workOrderMilestoneDateStringElement.value,
conflictingMilestonePanelElement
)
}, },
onremoved() { onremoved() {
bulmaJS.toggleHtmlClipped() bulmaJS.toggleHtmlClipped()

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card"> <div class="modal-card" style="width:1000px">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title">Add Milestone</h3> <h3 class="modal-card-title">Add Milestone</h3>
<button <button
@ -10,84 +10,95 @@
></button> ></button>
</header> </header>
<section class="modal-card-body"> <section class="modal-card-body">
<form id="form--milestoneAdd"> <div class="columns">
<input <div class="column">
id="milestoneAdd--workOrderId" <form id="form--milestoneAdd">
name="workOrderId" <input
type="hidden" id="milestoneAdd--workOrderId"
value="" name="workOrderId"
/> type="hidden"
value=""
<div class="field"> />
<label class="label" for="milestoneAdd--workOrderMilestoneTypeId"
>Milestone Type</label
>
<div class="control">
<div class="select is-fullwidth">
<select
id="milestoneAdd--workOrderMilestoneTypeId"
name="workOrderMilestoneTypeId"
>
<option value="">(No Milestone Type)</option>
</select>
</div>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field"> <div class="field">
<label <label class="label" for="milestoneAdd--workOrderMilestoneTypeId"
class="label" >Milestone Type</label
for="milestoneAdd--workOrderMilestoneDateString"
>Milestone Date</label
> >
<div class="control has-icons-left"> <div class="control">
<input <div class="select is-fullwidth">
class="input" <select
id="milestoneAdd--workOrderMilestoneDateString" id="milestoneAdd--workOrderMilestoneTypeId"
name="workOrderMilestoneDateString" name="workOrderMilestoneTypeId"
type="date" >
/> <option value="">(No Milestone Type)</option>
<span class="icon is-left"> </select>
<i class="fas fa-calendar" aria-hidden="true"></i> </div>
</span>
</div> </div>
</div> </div>
</div> <div class="columns">
<div class="column"> <div class="column">
<div class="field"> <div class="field">
<label <label
class="label" class="label"
for="milestoneAdd--workOrderMilestoneTimeString" for="milestoneAdd--workOrderMilestoneDateString"
>Milestone Time</label >Milestone Date</label
> >
<div class="control has-icons-left"> <div class="control has-icons-left">
<input <input
class="input" class="input"
id="milestoneAdd--workOrderMilestoneTimeString" id="milestoneAdd--workOrderMilestoneDateString"
name="workOrderMilestoneTimeString" name="workOrderMilestoneDateString"
type="time" type="date"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="fas fa-clock" aria-hidden="true"></i> <i class="fas fa-calendar" aria-hidden="true"></i>
</span> </span>
</div>
</div>
</div>
<div class="column">
<div class="field">
<label
class="label"
for="milestoneAdd--workOrderMilestoneTimeString"
>Milestone Time</label
>
<div class="control has-icons-left">
<input
class="input"
id="milestoneAdd--workOrderMilestoneTimeString"
name="workOrderMilestoneTimeString"
type="time"
/>
<span class="icon is-left">
<i class="fas fa-clock" aria-hidden="true"></i>
</span>
</div>
</div>
</div> </div>
</div> </div>
<div class="field">
<label class="label" for="milestoneAdd--workOrderMilestoneDescription"
>Description</label
>
<div class="control">
<textarea
class="textarea"
id="milestoneAdd--workOrderMilestoneDescription"
name="workOrderMilestoneDescription"
></textarea>
</div>
</div>
</form>
</div>
<div class="column">
<div class="panel is-info" id="milestoneAdd--conflictingMilestonesPanel">
<h4 class="panel-heading">
Potentially Conflicting Milestones
</h4>
</div> </div>
</div> </div>
<div class="field"> </div>
<label class="label" for="milestoneAdd--workOrderMilestoneDescription"
>Description</label
>
<div class="control">
<textarea
class="textarea"
id="milestoneAdd--workOrderMilestoneDescription"
name="workOrderMilestoneDescription"
></textarea>
</div>
</div>
</form>
</section> </section>
<footer class="modal-card-foot justify-right"> <footer class="modal-card-foot justify-right">
<button class="button is-success" type="submit" form="form--milestoneAdd"> <button class="button is-success" type="submit" form="form--milestoneAdd">

View File

@ -1,6 +1,6 @@
<div class="modal" role="dialog"> <div class="modal" role="dialog">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card"> <div class="modal-card" style="width:1000px">
<header class="modal-card-head"> <header class="modal-card-head">
<h3 class="modal-card-title">Edit Milestone</h3> <h3 class="modal-card-title">Edit Milestone</h3>
<button <button
@ -10,92 +10,103 @@
></button> ></button>
</header> </header>
<section class="modal-card-body"> <section class="modal-card-body">
<form id="form--milestoneEdit"> <div class="columns">
<input <div class="column">
id="milestoneEdit--workOrderId" <form id="form--milestoneEdit">
name="workOrderId" <input
type="hidden" id="milestoneEdit--workOrderId"
value="" name="workOrderId"
/> type="hidden"
<input value=""
id="milestoneEdit--workOrderMilestoneId" />
name="workOrderMilestoneId" <input
type="hidden" id="milestoneEdit--workOrderMilestoneId"
value="" name="workOrderMilestoneId"
/> type="hidden"
value=""
<div class="field"> />
<label class="label" for="milestoneEdit--workOrderMilestoneTypeId"
>Milestone Type</label <div class="field">
> <label class="label" for="milestoneEdit--workOrderMilestoneTypeId"
<div class="control"> >Milestone Type</label
<div class="select is-fullwidth">
<select
id="milestoneEdit--workOrderMilestoneTypeId"
name="workOrderMilestoneTypeId"
> >
<option value="">(No Milestone Type)</option> <div class="control">
</select> <div class="select is-fullwidth">
<select
id="milestoneEdit--workOrderMilestoneTypeId"
name="workOrderMilestoneTypeId"
>
<option value="">(No Milestone Type)</option>
</select>
</div>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field">
<label
class="label"
for="milestoneEdit--workOrderMilestoneDateString"
>Milestone Date</label
>
<div class="control has-icons-left">
<input
class="input"
id="milestoneEdit--workOrderMilestoneDateString"
name="workOrderMilestoneDateString"
type="date"
/>
<span class="icon is-left">
<i class="fas fa-calendar" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column">
<div class="field">
<label
class="label"
for="milestoneEdit--workOrderMilestoneTimeString"
>Milestone Time</label
>
<div class="control has-icons-left">
<input
class="input"
id="milestoneEdit--workOrderMilestoneTimeString"
name="workOrderMilestoneTimeString"
type="time"
/>
<span class="icon is-left">
<i class="fas fa-clock" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
</div> </div>
</div>
</div>
<div class="columns">
<div class="column">
<div class="field"> <div class="field">
<label <label
class="label" class="label"
for="milestoneEdit--workOrderMilestoneDateString" for="milestoneEdit--workOrderMilestoneDescription"
>Milestone Date</label >Description</label
> >
<div class="control has-icons-left"> <div class="control">
<input <textarea
class="input" class="textarea"
id="milestoneEdit--workOrderMilestoneDateString" id="milestoneEdit--workOrderMilestoneDescription"
name="workOrderMilestoneDateString" name="workOrderMilestoneDescription"
type="date" ></textarea>
/>
<span class="icon is-left">
<i class="fas fa-calendar" aria-hidden="true"></i>
</span>
</div>
</div>
</div>
<div class="column">
<div class="field">
<label
class="label"
for="milestoneEdit--workOrderMilestoneTimeString"
>Milestone Time</label
>
<div class="control has-icons-left">
<input
class="input"
id="milestoneEdit--workOrderMilestoneTimeString"
name="workOrderMilestoneTimeString"
type="time"
/>
<span class="icon is-left">
<i class="fas fa-clock" aria-hidden="true"></i>
</span>
</div> </div>
</div> </div>
</form>
</div>
<div class="column">
<div class="panel is-info" id="milestoneEdit--conflictingMilestonesPanel">
<h4 class="panel-heading">
Potentially Conflicting Milestones
</h4>
</div> </div>
</div> </div>
<div class="field"> </div>
<label
class="label"
for="milestoneEdit--workOrderMilestoneDescription"
>Description</label
>
<div class="control">
<textarea
class="textarea"
id="milestoneEdit--workOrderMilestoneDescription"
name="workOrderMilestoneDescription"
></textarea>
</div>
</div>
</form>
</section> </section>
<footer class="modal-card-foot justify-right"> <footer class="modal-card-foot justify-right">
<button <button

File diff suppressed because one or more lines are too long