From 124cb595a25a1fc7ba6ed2b74b3f7a8a7f66dd7e Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Thu, 29 Dec 2022 10:28:02 -0500 Subject: [PATCH] attempt to reduce complexity starting with lotOccupancyEdit.ts - split panel javascript into separate files - combine with gulp-include - comments now removed during gulp-minify --- .codeclimate.yml | 3 +- gulpfile.js | 9 + gulpfile.ts | 10 + package-lock.json | 211 ++++ package.json | 1 + public-typescript/adminCleanup.js | 1 + public-typescript/adminFees.js | 47 +- public-typescript/adminFees.ts | 39 +- public-typescript/adminLotTypes.js | 1 + public-typescript/adminOccupancyTypes.js | 3 + public-typescript/adminTables.js | 13 + public-typescript/dashboard.js | 1 + public-typescript/lotEdit.js | 5 + public-typescript/lotOccupancyEdit.js | 68 +- .../lotOccupancyEdit.d.ts | 0 .../lotOccupancyEdit/lotOccupancyEdit.js | 834 ++++++++++++++++ .../lotOccupancyEdit.ts | 911 +----------------- .../lotOccupancyEditComments.d.ts | 1 + .../lotOccupancyEditComments.js | 181 ++++ .../lotOccupancyEditComments.ts | 300 ++++++ .../lotOccupancyEditFees.d.ts | 1 + .../lotOccupancyEdit/lotOccupancyEditFees.js | 407 ++++++++ .../lotOccupancyEdit/lotOccupancyEditFees.ts | 605 ++++++++++++ public-typescript/lotOccupancySearch.js | 1 + public-typescript/lotSearch.js | 1 + public-typescript/lotView.js | 1 + public-typescript/main.js | 87 ++ public-typescript/mapEdit.js | 1 + public-typescript/mapSearch.js | 1 + public-typescript/mapView.js | 2 + public-typescript/reportSearch.js | 4 + public-typescript/workOrderEdit.js | 30 + .../workOrderMilestoneCalendar.js | 1 + public-typescript/workOrderOutlook.js | 1 + public-typescript/workOrderSearch.js | 30 + public-typescript/workOrderView.js | 1 + public/javascripts/adminFees.min.js | 2 +- public/javascripts/lotOccupancyEdit.min.js | 2 +- tsconfig.client.json | 6 +- 39 files changed, 2854 insertions(+), 969 deletions(-) rename public-typescript/{ => lotOccupancyEdit}/lotOccupancyEdit.d.ts (100%) create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEdit.js rename public-typescript/{ => lotOccupancyEdit}/lotOccupancyEdit.ts (57%) create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditComments.d.ts create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditFees.d.ts create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js create mode 100644 public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts diff --git a/.codeclimate.yml b/.codeclimate.yml index 57ffcfc5..b838579f 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -14,4 +14,5 @@ exclude_patterns: - "**/node_modules/" - "temp/" - "test/" -- "**/*.d.ts" \ No newline at end of file +- "**/*.d.ts" +- "**/*.js" \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 60d86389..a4fae1aa 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,6 +1,7 @@ import gulp from "gulp"; import changed from "gulp-changed"; import minify from "gulp-minify"; +import include from "gulp-include"; import dartSass from "sass"; import gulpSass from "gulp-sass"; const sass = gulpSass(dartSass); @@ -22,13 +23,21 @@ const publicJavascriptsMinFunction = () => { .pipe(minify({ noSource: true, ext: { min: ".min.js" } })) .pipe(gulp.dest(publicJavascriptsDestination)); }; +const publicJavascriptsLotOccupancyEditFunction = () => { + return gulp.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") + .pipe(include()) + .pipe(gulp.dest("public-typescript")); +}; +gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); gulp.task("public-javascript-min", publicJavascriptsMinFunction); const watchFunction = () => { gulp.watch("public-scss/*.scss", publicSCSSFunction); + gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction); gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction); }; gulp.task("watch", watchFunction); gulp.task("default", () => { + publicJavascriptsLotOccupancyEditFunction(); publicJavascriptsMinFunction(); publicSCSSFunction(); watchFunction(); diff --git a/gulpfile.ts b/gulpfile.ts index c50fe6a5..6d8e24d3 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -3,6 +3,7 @@ import gulp from "gulp"; import changed from "gulp-changed"; import minify from "gulp-minify"; +import include from "gulp-include"; import dartSass from "sass"; import gulpSass from "gulp-sass"; @@ -46,6 +47,13 @@ const publicJavascriptsMinFunction = () => { .pipe(gulp.dest(publicJavascriptsDestination)); }; +const publicJavascriptsLotOccupancyEditFunction = () => { + return gulp.src("public-typescript/lotOccupancyEdit/lotOccupancyEdit.js") + .pipe(include()) + .pipe(gulp.dest("public-typescript")); +}; + +gulp.task("public-javascript-lotOccupancyEdit", publicJavascriptsLotOccupancyEditFunction); gulp.task("public-javascript-min", publicJavascriptsMinFunction); /* @@ -54,6 +62,7 @@ gulp.task("public-javascript-min", publicJavascriptsMinFunction); const watchFunction = () => { gulp.watch("public-scss/*.scss", publicSCSSFunction); + gulp.watch("public-typescript/lotOccupancyEdit/*.js", publicJavascriptsLotOccupancyEditFunction); gulp.watch("public-typescript/*.js", publicJavascriptsMinFunction); }; @@ -64,6 +73,7 @@ gulp.task("watch", watchFunction); */ gulp.task("default", () => { + publicJavascriptsLotOccupancyEditFunction(); publicJavascriptsMinFunction(); publicSCSSFunction(); watchFunction(); diff --git a/package-lock.json b/package-lock.json index bc37dfc2..ccecbfa9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,6 +84,7 @@ "eslint-plugin-unicorn": "^45.0.2", "gulp": "^4.0.2", "gulp-changed": "^4.0.3", + "gulp-include": "^2.4.1", "gulp-minify": "^3.1.0", "gulp-sass": "^5.1.0", "nodemon": "^2.0.20", @@ -3691,6 +3692,12 @@ "node": ">=6.0.0" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -4487,6 +4494,21 @@ "node": ">= 0.6" } }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, "node_modules/eventemitter2": { "version": "6.4.7", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", @@ -5482,6 +5504,12 @@ "node": ">= 0.6" } }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6268,6 +6296,52 @@ "node": ">=0.10.0" } }, + "node_modules/gulp-include": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/gulp-include/-/gulp-include-2.4.1.tgz", + "integrity": "sha512-ARF7H6CD/CCavOcvlLhs6sAY+turxI72Gwp+5X/sMNUha8eJXFloDaZ93nnSKIh0K8VR7b7PURHdXrIhFhQ9gg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.2.4", + "event-stream": "^4.0.1", + "glob": "^7.1.3", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "strip-bom": "^2.0.0", + "vinyl": "^2.2.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "node_modules/gulp-include/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/gulp-include/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/gulp-include/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/gulp-minify": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz", @@ -8087,6 +8161,12 @@ "node": ">=0.10.0" } }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -9290,6 +9370,15 @@ "node": ">=8" } }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -10844,6 +10933,18 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -11001,6 +11102,16 @@ "npm": ">=6" } }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "node_modules/stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", @@ -15302,6 +15413,12 @@ "esutils": "^2.0.2" } }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -15923,6 +16040,21 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, "eventemitter2": { "version": "6.4.7", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", @@ -16714,6 +16846,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -17334,6 +17472,45 @@ } } }, + "gulp-include": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/gulp-include/-/gulp-include-2.4.1.tgz", + "integrity": "sha512-ARF7H6CD/CCavOcvlLhs6sAY+turxI72Gwp+5X/sMNUha8eJXFloDaZ93nnSKIh0K8VR7b7PURHdXrIhFhQ9gg==", + "dev": true, + "requires": { + "ansi-colors": "^3.2.4", + "event-stream": "^4.0.1", + "glob": "^7.1.3", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "strip-bom": "^2.0.0", + "vinyl": "^2.2.0", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "gulp-minify": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz", @@ -18696,6 +18873,12 @@ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -19597,6 +19780,15 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -20799,6 +20991,15 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -20920,6 +21121,16 @@ "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", "dev": true }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", diff --git a/package.json b/package.json index d836726b..665f0516 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "eslint-plugin-unicorn": "^45.0.2", "gulp": "^4.0.2", "gulp-changed": "^4.0.3", + "gulp-include": "^2.4.1", "gulp-minify": "^3.1.0", "gulp-sass": "^5.1.0", "nodemon": "^2.0.20", diff --git a/public-typescript/adminCleanup.js b/public-typescript/adminCleanup.js index da9cea91..a6d8b838 100644 --- a/public-typescript/adminCleanup.js +++ b/public-typescript/adminCleanup.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/adminFees.js b/public-typescript/adminFees.js index 22bb3f00..70fbc6ba 100644 --- a/public-typescript/adminFees.js +++ b/public-typescript/adminFees.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; @@ -80,6 +81,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const panelBlockElement = document.createElement("div"); panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.dataset.feeId = fee.feeId.toString(); + const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId; panelBlockElement.innerHTML = '
' + ('
' + @@ -91,23 +93,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + "" + "

" + - '

' + - (fee.isRequired ? 'Required' : "") + - (fee.occupancyTypeId - ? ' ' + - cityssm.escapeHTML(fee.occupancyType || "") + - "" + (hasTagsBlock + ? '

' + + (fee.isRequired + ? 'Required' + : "") + + (fee.occupancyTypeId + ? ' ' + + cityssm.escapeHTML(fee.occupancyType || "") + + "" + : "") + + (fee.lotTypeId + ? ' ' + + cityssm.escapeHTML(fee.lotType || "") + + "" + : "") + + "

" : "") + - (fee.lotTypeId - ? ' ' + - cityssm.escapeHTML(fee.lotType || "") + - "" - : "") + - "

" + "
") + ('
' + '
' + @@ -167,6 +173,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); feeCategoriesContainerElement.append(feeCategoryContainerElement); } }; + /* + * Fee Categories + */ document.querySelector("#button--addFeeCategory").addEventListener("click", () => { let addCloseModalFunction; const doAddFeeCategory = (submitEvent) => { @@ -306,6 +315,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; + /* + * Fees + */ const openAddFee = (clickEvent) => { const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId, 10); let addCloseModalFunction; @@ -605,5 +617,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); }; + /* + * Initialize + */ renderFeeCategories(); })(); diff --git a/public-typescript/adminFees.ts b/public-typescript/adminFees.ts index cb52b193..aa52bd85 100644 --- a/public-typescript/adminFees.ts +++ b/public-typescript/adminFees.ts @@ -102,9 +102,12 @@ declare const bulmaJS: BulmaJS; } else { for (const fee of feeCategory.fees!) { const panelBlockElement = document.createElement("div"); + panelBlockElement.className = "panel-block is-block container--fee"; panelBlockElement.dataset.feeId = fee.feeId!.toString(); + const hasTagsBlock = fee.isRequired || fee.occupancyTypeId || fee.lotTypeId; + panelBlockElement.innerHTML = '
' + ('
' + @@ -116,23 +119,27 @@ declare const bulmaJS: BulmaJS; cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + "" + "

" + - '

' + - (fee.isRequired ? 'Required' : "") + - (fee.occupancyTypeId - ? ' ' + - cityssm.escapeHTML(fee.occupancyType || "") + - "" + (hasTagsBlock + ? '

' + + (fee.isRequired + ? 'Required' + : "") + + (fee.occupancyTypeId + ? ' ' + + cityssm.escapeHTML(fee.occupancyType || "") + + "" + : "") + + (fee.lotTypeId + ? ' ' + + cityssm.escapeHTML(fee.lotType || "") + + "" + : "") + + "

" : "") + - (fee.lotTypeId - ? ' ' + - cityssm.escapeHTML(fee.lotType || "") + - "" - : "") + - "

" + "
") + ('
' + '
' + diff --git a/public-typescript/adminLotTypes.js b/public-typescript/adminLotTypes.js index 514b06ba..bd0032cf 100644 --- a/public-typescript/adminLotTypes.js +++ b/public-typescript/adminLotTypes.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/adminOccupancyTypes.js b/public-typescript/adminOccupancyTypes.js index 1a5168c4..59665b25 100644 --- a/public-typescript/adminOccupancyTypes.js +++ b/public-typescript/adminOccupancyTypes.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; @@ -486,6 +487,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); return; } for (const occupancyType of occupancyTypes) { + // Types and Fields { const occupancyTypeContainer = document.createElement("div"); occupancyTypeContainer.className = "panel container--occupancyType"; @@ -555,6 +557,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); occupancyTypeContainer.querySelector(".button--moveOccupancyTypeDown").addEventListener("click", moveOccupancyTypeDown); occupancyTypesContainerElement.append(occupancyTypeContainer); } + // Prints { const occupancyTypePrintContainer = document.createElement("div"); occupancyTypePrintContainer.className = "panel container--occupancyTypePrintList"; diff --git a/public-typescript/adminTables.js b/public-typescript/adminTables.js index 3e279560..660f9741 100644 --- a/public-typescript/adminTables.js +++ b/public-typescript/adminTables.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; @@ -8,6 +9,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); inputElement.closest(".field").querySelectorAll(".button.is-static")[1].innerHTML = ''; }; + /* + * Work Order Types + */ let workOrderTypes = exports.workOrderTypes; delete exports.workOrderTypes; const updateWorkOrderType = (submitEvent) => { @@ -191,6 +195,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderWorkOrderTypes(); + /* + * Work Order Milestone Types + */ let workOrderMilestoneTypes = exports.workOrderMilestoneTypes; delete exports.workOrderMilestoneTypes; const updateWorkOrderMilestoneType = (submitEvent) => { @@ -375,6 +382,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderWorkOrderMilestoneTypes(); + /* + * Lot Statuses + */ let lotStatuses = exports.lotStatuses; delete exports.lotStatuses; const updateLotStatus = (submitEvent) => { @@ -563,6 +573,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderLotStatuses(); + /* + * Lot Occupant Types + */ let lotOccupantTypes = exports.lotOccupantTypes; delete exports.lotOccupantTypes; const updateLotOccupantType = (submitEvent) => { diff --git a/public-typescript/dashboard.js b/public-typescript/dashboard.js index 43a5c83e..396af7f2 100644 --- a/public-typescript/dashboard.js +++ b/public-typescript/dashboard.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/lotEdit.js b/public-typescript/lotEdit.js index bbf3a31b..5c181cc7 100644 --- a/public-typescript/lotEdit.js +++ b/public-typescript/lotEdit.js @@ -1,9 +1,11 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; const lotId = document.querySelector("#lot--lotId").value; const isCreate = lotId === ""; + // Main form let hasUnsavedChanges = false; let refreshAfterSave = isCreate; const setUnsavedChanges = () => { @@ -81,6 +83,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); } + // Lot Type const lotTypeIdElement = document.querySelector("#lot--lotTypeId"); if (isCreate) { const lotFieldsContainerElement = document.querySelector("#container--lotFields"); @@ -189,6 +192,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } + // Comments let lotComments = exports.lotComments; delete exports.lotComments; const openEditLotComment = (clickEvent) => { @@ -234,6 +238,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); modalElement.querySelector("#lotCommentEdit--lotComment").focus(); editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener("submit", editComment); diff --git a/public-typescript/lotOccupancyEdit.js b/public-typescript/lotOccupancyEdit.js index b21c87de..3722009a 100644 --- a/public-typescript/lotOccupancyEdit.js +++ b/public-typescript/lotOccupancyEdit.js @@ -1,10 +1,14 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { var _a, _b, _c; const los = exports.los; const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId").value; const isCreate = lotOccupancyId === ""; + /* + * Main form + */ let hasUnsavedChanges = false; let refreshAfterSave = isCreate; const setUnsavedChanges = () => { @@ -187,6 +191,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); } + // Occupancy Type const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId"); if (isCreate) { const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields"); @@ -295,6 +300,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }); } + // Lot Selector const lotNameElement = document.querySelector("#lotOccupancy--lotName"); lotNameElement.addEventListener("click", (clickEvent) => { const currentLotName = clickEvent.currentTarget.value; @@ -387,6 +393,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); lotSelectModalElement = modalElement; lotSelectCloseModalFunction = closeModalFunction; bulmaJS.init(modalElement); + // search Tab const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName"); if (document.querySelector("#lotOccupancy--lotId").value !== "") { @@ -405,6 +412,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); submitEvent.preventDefault(); }); searchLots(); + // Create Tab if (exports.lotNamePattern) { const regex = exports.lotNamePattern; modalElement.querySelector("#lotCreate--lotName").pattern = regex.source; @@ -463,6 +471,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); setUnsavedChanges(); } }); + // Start Date los.initializeDatePickers(formElement); document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => { const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker; @@ -470,6 +479,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); endDatePicker.refresh(); }); los.initializeUnlockFieldButtons(formElement); + /* + * Occupants + */ if (isCreate) { const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId"); lotOccupantTypeIdElement.addEventListener("change", () => { @@ -807,12 +819,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); renderLotOccupancyOccupants(); } + /* + * Comments + */ if (!isCreate) { + "use strict"; + /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ + Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyComments = exports.lotOccupancyComments; delete exports.lotOccupancyComments; const openEditLotOccupancyComment = (clickEvent) => { - const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset - .lotOccupancyCommentId, 10); + const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; }); @@ -854,6 +871,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(); editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener("submit", editComment); @@ -865,8 +883,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; const deleteLotOccupancyComment = (clickEvent) => { - const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset - .lotOccupancyCommentId, 10); + const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); const doDelete = () => { cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", { lotOccupancyId, @@ -987,8 +1004,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderLotOccupancyComments(); + } + /* + * Fees / Transactions + */ if (!isCreate) { + "use strict"; + /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ + Object.defineProperty(exports, "__esModule", { value: true }); let lotOccupancyFees = exports.lotOccupancyFees; delete exports.lotOccupancyFees; const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees"); @@ -996,8 +1020,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); let feeGrandTotal = 0; for (const lotOccupancyFee of lotOccupancyFees) { feeGrandTotal += - (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * - lotOccupancyFee.quantity; + (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity; } return feeGrandTotal; }; @@ -1064,9 +1087,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const tableRowElement = document.createElement("tr"); tableRowElement.className = "container--lotOccupancyFee"; tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString(); - tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity - ? "1" - : "0"; + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; tableRowElement.innerHTML = '' + "" + ""); - tableRowElement - .querySelector("button") - .addEventListener("click", deleteLotOccupancyFee); + tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee); lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement); feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity; taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity; @@ -1149,9 +1168,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { quantityCloseModalFunction = closeModalFunction; quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity"); - modalElement - .querySelector("form") - .addEventListener("submit", doSetQuantity); + modalElement.querySelector("form").addEventListener("submit", doSetQuantity); } }); }; @@ -1173,16 +1190,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); } }; const filterFees = () => { - const filterStringPieces = feeFilterElement.value - .trim() - .toLowerCase() - .split(" "); + const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); feeFilterResultsElement.innerHTML = ""; for (const feeCategory of feeCategories) { const categoryContainerElement = document.createElement("div"); categoryContainerElement.className = "container--feeCategory"; - categoryContainerElement.dataset.feeCategoryId = - feeCategory.feeCategoryId.toString(); + categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); categoryContainerElement.innerHTML = '

' + cityssm.escapeHTML(feeCategory.feeCategory || "") + @@ -1215,9 +1228,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); cityssm.escapeHTML(fee.feeName || "") + "
" + "" + - cityssm - .escapeHTML(fee.feeDescription || "") - .replace(/\n/g, "
") + + cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + "
"; panelBlockElement.addEventListener("click", tryAddFee); categoryContainerElement.querySelector(".panel").append(panelBlockElement); @@ -1348,9 +1359,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); tableRowElement .querySelector("button") .addEventListener("click", deleteLotOccupancyTransaction); - lotOccupancyTransactionsContainerElement - .querySelector("tbody") - .append(tableRowElement); + lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement); } lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2); const feeGrandTotal = getFeeGrandTotal(); @@ -1400,9 +1409,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); addCloseModalFunction = closeModalFunction; - modalElement - .querySelector("form") - .addEventListener("submit", doAddTransaction); + modalElement.querySelector("form").addEventListener("submit", doAddTransaction); }, onremoved: () => { bulmaJS.toggleHtmlClipped(); @@ -1410,5 +1417,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); renderLotOccupancyFees(); + } })(); diff --git a/public-typescript/lotOccupancyEdit.d.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.d.ts similarity index 100% rename from public-typescript/lotOccupancyEdit.d.ts rename to public-typescript/lotOccupancyEdit/lotOccupancyEdit.d.ts diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js new file mode 100644 index 00000000..d973494a --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.js @@ -0,0 +1,834 @@ +"use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ +Object.defineProperty(exports, "__esModule", { value: true }); +(() => { + var _a, _b, _c; + const los = exports.los; + const lotOccupancyId = document.querySelector("#lotOccupancy--lotOccupancyId").value; + const isCreate = lotOccupancyId === ""; + /* + * Main form + */ + let hasUnsavedChanges = false; + let refreshAfterSave = isCreate; + const setUnsavedChanges = () => { + if (!hasUnsavedChanges) { + hasUnsavedChanges = true; + cityssm.enableNavBlocker(); + } + }; + const clearUnsavedChanges = () => { + hasUnsavedChanges = false; + cityssm.disableNavBlocker(); + }; + const formElement = document.querySelector("#form--lotOccupancy"); + formElement.addEventListener("submit", (formEvent) => { + formEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + + "/lotOccupancies/" + + (isCreate ? "doCreateLotOccupancy" : "doUpdateLotOccupancy"), formElement, (responseJSON) => { + if (responseJSON.success) { + clearUnsavedChanges(); + if (isCreate || refreshAfterSave) { + window.location.href = + los.urlPrefix + + "/lotOccupancies/" + + responseJSON.lotOccupancyId + + "/edit?t=" + + Date.now(); + } + else { + bulmaJS.alert({ + message: exports.aliases.occupancy + " Updated Successfully", + contextualColorName: "success" + }); + } + } + else { + bulmaJS.alert({ + title: "Error Saving " + exports.aliases.occupancy, + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }); + const formInputElements = formElement.querySelectorAll("input, select"); + for (const formInputElement of formInputElements) { + formInputElement.addEventListener("change", setUnsavedChanges); + } + if (!isCreate) { + const doCopy = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doCopyLotOccupancy", { + lotOccupancyId + }, (responseJSON) => { + var _a; + if (responseJSON.success) { + cityssm.disableNavBlocker(); + window.location.href = + los.urlPrefix + + "/lotOccupancies/" + + ((_a = responseJSON.lotOccupancyId) === null || _a === void 0 ? void 0 : _a.toString()) + + "/edit"; + } + else { + bulmaJS.alert({ + title: "Error Copying Record", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + (_a = document + .querySelector("#button--copyLotOccupancy")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (clickEvent) => { + clickEvent.preventDefault(); + if (hasUnsavedChanges) { + bulmaJS.alert({ + title: "Unsaved Changes", + message: "Please save all unsaved changes before continuing.", + contextualColorName: "warning" + }); + } + else { + bulmaJS.confirm({ + title: "Copy " + exports.aliases.occupancy + " Record as New", + message: "Are you sure you want to copy this record to a new record?", + contextualColorName: "info", + okButton: { + text: "Yes, Copy", + callbackFunction: doCopy + } + }); + } + }); + (_b = document + .querySelector("#button--deleteLotOccupancy")) === null || _b === void 0 ? void 0 : _b.addEventListener("click", (clickEvent) => { + clickEvent.preventDefault(); + const doDelete = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancy", { + lotOccupancyId + }, (responseJSON) => { + if (responseJSON.success) { + cityssm.disableNavBlocker(); + window.location.href = + los.urlPrefix + "/lotOccupancies?t=" + Date.now(); + } + else { + bulmaJS.alert({ + title: "Error Deleting Record", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete " + exports.aliases.occupancy + " Record", + message: "Are you sure you want to delete this record?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete", + callbackFunction: doDelete + } + }); + }); + (_c = document + .querySelector("#button--createWorkOrder")) === null || _c === void 0 ? void 0 : _c.addEventListener("click", (clickEvent) => { + clickEvent.preventDefault(); + let createCloseModalFunction; + const doCreate = (formEvent) => { + formEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + "/workOrders/doCreateWorkOrder", formEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + createCloseModalFunction(); + bulmaJS.confirm({ + title: "Work Order Created Successfully", + message: "Would you like to open the work order now?", + contextualColorName: "success", + okButton: { + text: "Yes, Open the Work Order", + callbackFunction: () => { + window.location.href = + los.urlPrefix + + "/workOrders/" + + responseJSON.workOrderId + + "/edit"; + } + } + }); + } + else { + bulmaJS.alert({ + title: "Error Creating Work Order", + message: responseJSON.errorMessage, + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-createWorkOrder", { + onshow: (modalElement) => { + modalElement.querySelector("#workOrderCreate--lotOccupancyId").value = lotOccupancyId; + modalElement.querySelector("#workOrderCreate--workOrderOpenDateString").value = cityssm.dateToString(new Date()); + const workOrderTypeSelectElement = modalElement.querySelector("#workOrderCreate--workOrderTypeId"); + const workOrderTypes = exports.workOrderTypes; + if (workOrderTypes.length === 1) { + workOrderTypeSelectElement.innerHTML = ""; + } + for (const workOrderType of workOrderTypes) { + const optionElement = document.createElement("option"); + optionElement.value = workOrderType.workOrderTypeId.toString(); + optionElement.textContent = workOrderType.workOrderType; + workOrderTypeSelectElement.append(optionElement); + } + }, + onshown: (modalElement, closeModalFunction) => { + var _a; + createCloseModalFunction = closeModalFunction; + (_a = modalElement.querySelector("form")) === null || _a === void 0 ? void 0 : _a.addEventListener("submit", doCreate); + } + }); + }); + } + // Occupancy Type + const occupancyTypeIdElement = document.querySelector("#lotOccupancy--occupancyTypeId"); + if (isCreate) { + const lotOccupancyFieldsContainerElement = document.querySelector("#container--lotOccupancyFields"); + occupancyTypeIdElement.addEventListener("change", () => { + if (occupancyTypeIdElement.value === "") { + lotOccupancyFieldsContainerElement.innerHTML = + '
' + + '

Select the ' + + exports.aliases.occupancy.toLowerCase() + + " type to load the available fields.

" + + "
"; + return; + } + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetOccupancyTypeFields", { + occupancyTypeId: occupancyTypeIdElement.value + }, (responseJSON) => { + if (responseJSON.occupancyTypeFields.length === 0) { + lotOccupancyFieldsContainerElement.innerHTML = + '
' + + '

There are no additional fields for this ' + + exports.aliases.occupancy.toLowerCase() + + " type.

" + + "
"; + return; + } + lotOccupancyFieldsContainerElement.innerHTML = ""; + let occupancyTypeFieldIds = ""; + for (const occupancyTypeField of responseJSON.occupancyTypeFields) { + occupancyTypeFieldIds += "," + occupancyTypeField.occupancyTypeFieldId; + const fieldName = "lotOccupancyFieldValue_" + occupancyTypeField.occupancyTypeFieldId; + const fieldId = "lotOccupancy--" + fieldName; + const fieldElement = document.createElement("div"); + fieldElement.className = "field"; + fieldElement.innerHTML = + '' + + '
'; + fieldElement.querySelector("label").textContent = + occupancyTypeField.occupancyTypeField; + if (occupancyTypeField.occupancyTypeFieldValues === "") { + const inputElement = document.createElement("input"); + inputElement.className = "input"; + inputElement.id = fieldId; + inputElement.name = fieldName; + inputElement.type = "text"; + inputElement.required = occupancyTypeField.isRequired; + inputElement.minLength = occupancyTypeField.minimumLength; + inputElement.maxLength = occupancyTypeField.maximumLength; + if (occupancyTypeField.pattern && occupancyTypeField.pattern !== "") { + inputElement.pattern = occupancyTypeField.pattern; + } + fieldElement.querySelector(".control").append(inputElement); + } + else { + fieldElement.querySelector(".control").innerHTML = + '
"; + const selectElement = fieldElement.querySelector("select"); + selectElement.required = occupancyTypeField.isRequired; + const optionValues = occupancyTypeField.occupancyTypeFieldValues.split("\n"); + for (const optionValue of optionValues) { + const optionElement = document.createElement("option"); + optionElement.value = optionValue; + optionElement.textContent = optionValue; + selectElement.append(optionElement); + } + } + lotOccupancyFieldsContainerElement.append(fieldElement); + } + lotOccupancyFieldsContainerElement.insertAdjacentHTML("beforeend", ''); + }); + }); + } + else { + const originalOccupancyTypeId = occupancyTypeIdElement.value; + occupancyTypeIdElement.addEventListener("change", () => { + if (occupancyTypeIdElement.value !== originalOccupancyTypeId) { + bulmaJS.confirm({ + title: "Confirm Change", + message: "Are you sure you want to change the " + + exports.aliases.occupancy.toLowerCase() + + " type?\n" + + "This change affects the additional fields associated with this record, and may also affect the available fees.", + contextualColorName: "warning", + okButton: { + text: "Yes, Keep the Change", + callbackFunction: () => { + refreshAfterSave = true; + } + }, + cancelButton: { + text: "Revert the Change", + callbackFunction: () => { + occupancyTypeIdElement.value = originalOccupancyTypeId; + } + } + }); + } + }); + } + // Lot Selector + const lotNameElement = document.querySelector("#lotOccupancy--lotName"); + lotNameElement.addEventListener("click", (clickEvent) => { + const currentLotName = clickEvent.currentTarget.value; + let lotSelectCloseModalFunction; + let lotSelectModalElement; + let lotSelectFormElement; + let lotSelectResultsElement; + const renderSelectedLotAndClose = (lotId, lotName) => { + document.querySelector("#lotOccupancy--lotId").value = + lotId.toString(); + document.querySelector("#lotOccupancy--lotName").value = lotName; + setUnsavedChanges(); + lotSelectCloseModalFunction(); + }; + const selectExistingLot = (clickEvent) => { + clickEvent.preventDefault(); + const selectedLotElement = clickEvent.currentTarget; + renderSelectedLotAndClose(selectedLotElement.dataset.lotId, selectedLotElement.dataset.lotName); + }; + const searchLots = () => { + lotSelectResultsElement.innerHTML = + '

' + + '
' + + "Searching..." + + "

"; + cityssm.postJSON(los.urlPrefix + "/lots/doSearchLots", lotSelectFormElement, (responseJSON) => { + if (responseJSON.count === 0) { + lotSelectResultsElement.innerHTML = + '
' + + '

' + + "No results." + + "

" + + "
"; + return; + } + const panelElement = document.createElement("div"); + panelElement.className = "panel"; + for (const lot of responseJSON.lots) { + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block"; + panelBlockElement.href = "#"; + panelBlockElement.dataset.lotId = lot.lotId.toString(); + panelBlockElement.dataset.lotName = lot.lotName; + panelBlockElement.innerHTML = + '
' + + ('
' + + cityssm.escapeHTML(lot.lotName || "") + + "
" + + '' + + cityssm.escapeHTML(lot.mapName || "") + + "" + + "
") + + ('
' + + cityssm.escapeHTML(lot.lotStatus) + + "
" + + '' + + (lot.lotOccupancyCount > 0 ? "Currently Occupied" : "") + + "" + + "
") + + "
"; + panelBlockElement.addEventListener("click", selectExistingLot); + panelElement.append(panelBlockElement); + } + lotSelectResultsElement.innerHTML = ""; + lotSelectResultsElement.append(panelElement); + }); + }; + const createLotAndSelect = (submitEvent) => { + submitEvent.preventDefault(); + const lotName = lotSelectModalElement.querySelector("#lotCreate--lotName").value; + cityssm.postJSON(los.urlPrefix + "/lots/doCreateLot", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + renderSelectedLotAndClose(responseJSON.lotId, lotName); + } + else { + bulmaJS.alert({ + title: "Error Creating " + exports.aliases.lot, + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-selectLot", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + lotSelectModalElement = modalElement; + lotSelectCloseModalFunction = closeModalFunction; + bulmaJS.init(modalElement); + // search Tab + const lotNameFilterElement = modalElement.querySelector("#lotSelect--lotName"); + if (document.querySelector("#lotOccupancy--lotId").value !== + "") { + lotNameFilterElement.value = currentLotName; + } + lotNameFilterElement.focus(); + lotNameFilterElement.addEventListener("change", searchLots); + const occupancyStatusFilterElement = modalElement.querySelector("#lotSelect--occupancyStatus"); + occupancyStatusFilterElement.addEventListener("change", searchLots); + if (currentLotName !== "") { + occupancyStatusFilterElement.value = ""; + } + lotSelectFormElement = modalElement.querySelector("#form--lotSelect"); + lotSelectResultsElement = modalElement.querySelector("#resultsContainer--lotSelect"); + lotSelectFormElement.addEventListener("submit", (submitEvent) => { + submitEvent.preventDefault(); + }); + searchLots(); + // Create Tab + if (exports.lotNamePattern) { + const regex = exports.lotNamePattern; + modalElement.querySelector("#lotCreate--lotName").pattern = regex.source; + } + const lotTypeElement = modalElement.querySelector("#lotCreate--lotTypeId"); + for (const lotType of exports.lotTypes) { + const optionElement = document.createElement("option"); + optionElement.value = lotType.lotTypeId.toString(); + optionElement.textContent = lotType.lotType; + lotTypeElement.append(optionElement); + } + const lotStatusElement = modalElement.querySelector("#lotCreate--lotStatusId"); + for (const lotStatus of exports.lotStatuses) { + const optionElement = document.createElement("option"); + optionElement.value = lotStatus.lotStatusId.toString(); + optionElement.textContent = lotStatus.lotStatus; + lotStatusElement.append(optionElement); + } + const mapElement = modalElement.querySelector("#lotCreate--mapId"); + for (const map of exports.maps) { + const optionElement = document.createElement("option"); + optionElement.value = map.mapId.toString(); + optionElement.textContent = map.mapName || "(No Name)"; + mapElement.append(optionElement); + } + modalElement.querySelector("#form--lotCreate").addEventListener("submit", createLotAndSelect); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }); + document.querySelector(".is-lot-view-button").addEventListener("click", () => { + const lotId = document.querySelector("#lotOccupancy--lotId") + .value; + if (lotId) { + window.open(los.urlPrefix + "/lots/" + lotId); + } + else { + bulmaJS.alert({ + message: "No " + exports.aliases.lot.toLowerCase() + " selected.", + contextualColorName: "info" + }); + } + }); + document.querySelector(".is-clear-lot-button").addEventListener("click", () => { + if (lotNameElement.disabled) { + bulmaJS.alert({ + message: "You need to unlock the field before clearing it.", + contextualColorName: "info" + }); + } + else { + lotNameElement.value = "(No " + exports.aliases.lot + ")"; + document.querySelector("#lotOccupancy--lotId").value = ""; + setUnsavedChanges(); + } + }); + // Start Date + los.initializeDatePickers(formElement); + document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change", () => { + const endDatePicker = document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker; + endDatePicker.min = document.querySelector("#lotOccupancy--occupancyStartDateString").value; + endDatePicker.refresh(); + }); + los.initializeUnlockFieldButtons(formElement); + /* + * Occupants + */ + if (isCreate) { + const lotOccupantTypeIdElement = document.querySelector("#lotOccupancy--lotOccupantTypeId"); + lotOccupantTypeIdElement.addEventListener("change", () => { + const occupantFields = formElement.querySelectorAll("[data-table='LotOccupancyOccupant']"); + for (const occupantField of occupantFields) { + occupantField.disabled = (lotOccupantTypeIdElement.value === ""); + } + }); + } + else { + let lotOccupancyOccupants = exports.lotOccupancyOccupants; + delete exports.lotOccupancyOccupants; + const openEditLotOccupancyOccupant = (clickEvent) => { + const lotOccupantIndex = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupantIndex, 10); + const lotOccupancyOccupant = lotOccupancyOccupants.find((currentLotOccupancyOccupant) => { + return currentLotOccupancyOccupant.lotOccupantIndex === lotOccupantIndex; + }); + let editFormElement; + let editCloseModalFunction; + const editOccupant = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyOccupant", editFormElement, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; + editCloseModalFunction(); + renderLotOccupancyOccupants(); + } + else { + bulmaJS.alert({ + title: "Error Updating " + exports.aliases.occupant, + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-editOccupant", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value = lotOccupancyId; + modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value = lotOccupantIndex.toString(); + const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId"); + let lotOccupantTypeSelected = false; + for (const lotOccupantType of exports.lotOccupantTypes) { + const optionElement = document.createElement("option"); + optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); + optionElement.textContent = lotOccupantType.lotOccupantType; + if (lotOccupantType.lotOccupantTypeId === + lotOccupancyOccupant.lotOccupantTypeId) { + optionElement.selected = true; + lotOccupantTypeSelected = true; + } + lotOccupantTypeSelectElement.append(optionElement); + } + if (!lotOccupantTypeSelected) { + const optionElement = document.createElement("option"); + optionElement.value = lotOccupancyOccupant.lotOccupantTypeId.toString(); + optionElement.textContent = lotOccupancyOccupant.lotOccupantType; + optionElement.selected = true; + lotOccupantTypeSelectElement.append(optionElement); + } + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantName").value = lotOccupancyOccupant.occupantName; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value = lotOccupancyOccupant.occupantAddress1; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value = lotOccupancyOccupant.occupantAddress2; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantCity").value = lotOccupancyOccupant.occupantCity; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value = lotOccupancyOccupant.occupantProvince; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value = lotOccupancyOccupant.occupantPostalCode; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value = lotOccupancyOccupant.occupantPhoneNumber; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value = lotOccupancyOccupant.occupantEmailAddress; + modalElement.querySelector("#lotOccupancyOccupantEdit--occupantComment").value = lotOccupancyOccupant.occupantComment; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + modalElement.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(); + editFormElement = modalElement.querySelector("form"); + editFormElement.addEventListener("submit", editOccupant); + editCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }; + const deleteLotOccupancyOccupant = (clickEvent) => { + const lotOccupantIndex = clickEvent.currentTarget.closest("tr") + .dataset.lotOccupantIndex; + const doDelete = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyOccupant", { + lotOccupancyId, + lotOccupantIndex + }, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; + renderLotOccupancyOccupants(); + } + else { + bulmaJS.alert({ + title: "Error Removing " + exports.aliases.occupant, + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Remove " + exports.aliases.occupant + "?", + message: "Are you sure you want to remove this " + + exports.aliases.occupant.toLowerCase() + + "?", + okButton: { + text: "Yes, Remove " + exports.aliases.occupant, + callbackFunction: doDelete + }, + contextualColorName: "warning" + }); + }; + const renderLotOccupancyOccupants = () => { + const occupantsContainer = document.querySelector("#container--lotOccupancyOccupants"); + cityssm.clearElement(occupantsContainer); + if (lotOccupancyOccupants.length === 0) { + occupantsContainer.innerHTML = + '
' + + '

There are no ' + + exports.aliases.occupants.toLowerCase() + + " associated with this record.

" + + "
"; + return; + } + const tableElement = document.createElement("table"); + tableElement.className = "table is-fullwidth is-striped is-hoverable"; + tableElement.innerHTML = + "" + + ("" + exports.aliases.occupant + "") + + "Address" + + "Other Contact" + + "Comment" + + 'Options' + + "" + + ""; + for (const lotOccupancyOccupant of lotOccupancyOccupants) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.lotOccupantIndex = + lotOccupancyOccupant.lotOccupantIndex.toString(); + tableRowElement.innerHTML = + "" + + cityssm.escapeHTML(lotOccupancyOccupant.occupantName || "(No Name)") + + "
" + + ('' + + "" + + " " + cityssm.escapeHTML(lotOccupancyOccupant.lotOccupantType) + "" + + "") + + "" + + ("" + + (lotOccupancyOccupant.occupantAddress1 + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress1) + "
" + : "") + + (lotOccupancyOccupant.occupantAddress2 + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantAddress2) + "
" + : "") + + (lotOccupancyOccupant.occupantCity + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantCity) + ", " + : "") + + cityssm.escapeHTML(lotOccupancyOccupant.occupantProvince || "") + + "
" + + cityssm.escapeHTML(lotOccupancyOccupant.occupantPostalCode || "") + + "") + + ("" + + (lotOccupancyOccupant.occupantPhoneNumber + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantPhoneNumber) + + "
" + : "") + + (lotOccupancyOccupant.occupantEmailAddress + ? cityssm.escapeHTML(lotOccupancyOccupant.occupantEmailAddress) + : "") + + "") + + ("" + cityssm.escapeHTML(lotOccupancyOccupant.occupantComment) + "") + + ('' + + '
' + + ('") + + ('") + + "
" + + ""); + tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotOccupancyOccupant); + tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotOccupancyOccupant); + tableElement.querySelector("tbody").append(tableRowElement); + } + occupantsContainer.append(tableElement); + }; + document.querySelector("#button--addOccupant").addEventListener("click", () => { + let addCloseModalFunction; + let addFormElement; + let searchFormElement; + let searchResultsElement; + const addOccupant = (formOrObject) => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyOccupant", formOrObject, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyOccupants = responseJSON.lotOccupancyOccupants; + addCloseModalFunction(); + renderLotOccupancyOccupants(); + } + else { + bulmaJS.alert({ + title: "Error Adding " + exports.aliases.occupant, + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + const addOccupantFromForm = (submitEvent) => { + submitEvent.preventDefault(); + addOccupant(addFormElement); + }; + let pastOccupantSearchResults = []; + const addOccupantFromCopy = (clickEvent) => { + clickEvent.preventDefault(); + const panelBlockElement = clickEvent.currentTarget; + const occupant = pastOccupantSearchResults[Number.parseInt(panelBlockElement.dataset.index, 10)]; + const lotOccupantTypeId = panelBlockElement + .closest(".modal") + .querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value; + if (lotOccupantTypeId === "") { + bulmaJS.alert({ + title: "No " + exports.aliases.occupant + " Type Selected", + message: "Select a type to apply to the newly added " + + exports.aliases.occupant.toLowerCase() + + ".", + contextualColorName: "warning" + }); + } + else { + occupant.lotOccupantTypeId = Number.parseInt(lotOccupantTypeId, 10); + occupant.lotOccupancyId = Number.parseInt(lotOccupancyId, 10); + addOccupant(occupant); + } + }; + const searchOccupants = (event) => { + event.preventDefault(); + if (searchFormElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").value === "") { + searchResultsElement.innerHTML = + '
' + + '

Enter a partial name or address in the search field above.

' + + "
"; + return; + } + searchResultsElement.innerHTML = + '
' + + '
' + + "Searching..." + + "
"; + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doSearchPastOccupants", searchFormElement, (responseJSON) => { + pastOccupantSearchResults = responseJSON.occupants; + const panelElement = document.createElement("div"); + panelElement.className = "panel"; + for (const [index, occupant] of pastOccupantSearchResults.entries()) { + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block"; + panelBlockElement.dataset.index = index.toString(); + panelBlockElement.innerHTML = + "" + + cityssm.escapeHTML(occupant.occupantName || "") + + "" + + "
" + + '
' + + ('
' + + cityssm.escapeHTML(occupant.occupantAddress1 || "") + + "
" + + (occupant.occupantAddress2 + ? cityssm.escapeHTML(occupant.occupantAddress2) + + "
" + : "") + + cityssm.escapeHTML(occupant.occupantCity || "") + + ", " + + cityssm.escapeHTML(occupant.occupantProvince || "") + + "
" + + cityssm.escapeHTML(occupant.occupantPostalCode || "") + + "
") + + ('
' + + (occupant.occupantPhoneNumber + ? cityssm.escapeHTML(occupant.occupantPhoneNumber) + + "
" + : "") + + cityssm.escapeHTML(occupant.occupantEmailAddress || "") + + "
" + + "
") + + "
"; + panelBlockElement.addEventListener("click", addOccupantFromCopy); + panelElement.append(panelBlockElement); + } + searchResultsElement.innerHTML = ""; + searchResultsElement.append(panelElement); + }); + }; + cityssm.openHtmlModal("lotOccupancy-addOccupant", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value = lotOccupancyId; + const lotOccupantTypeSelectElement = modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"); + const lotOccupantTypeCopySelectElement = modalElement.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId"); + for (const lotOccupantType of exports.lotOccupantTypes) { + const optionElement = document.createElement("option"); + optionElement.value = lotOccupantType.lotOccupantTypeId.toString(); + optionElement.textContent = lotOccupantType.lotOccupantType; + lotOccupantTypeSelectElement.append(optionElement); + lotOccupantTypeCopySelectElement.append(optionElement.cloneNode(true)); + } + modalElement.querySelector("#lotOccupancyOccupantAdd--occupantCity").value = exports.occupantCityDefault; + modalElement.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value = exports.occupantProvinceDefault; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + bulmaJS.init(modalElement); + modalElement.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(); + addFormElement = modalElement.querySelector("#form--lotOccupancyOccupantAdd"); + addFormElement.addEventListener("submit", addOccupantFromForm); + searchResultsElement = modalElement.querySelector("#lotOccupancyOccupantCopy--searchResults"); + searchFormElement = modalElement.querySelector("#form--lotOccupancyOccupantCopy"); + searchFormElement.addEventListener("submit", (formEvent) => { + formEvent.preventDefault(); + }); + modalElement.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change", searchOccupants); + addCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + }); + renderLotOccupancyOccupants(); + } + /* + * Comments + */ + if (!isCreate) { + //=include lotOccupancyEditComments.js + } + /* + * Fees / Transactions + */ + if (!isCreate) { + //=include lotOccupancyEditFees.js + } +})(); diff --git a/public-typescript/lotOccupancyEdit.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts similarity index 57% rename from public-typescript/lotOccupancyEdit.ts rename to public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts index a54cdd68..d2bc2af5 100644 --- a/public-typescript/lotOccupancyEdit.ts +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ -import type * as globalTypes from "../types/globalTypes"; -import type * as recordTypes from "../types/recordTypes"; +import type * as globalTypes from "../../types/globalTypes"; +import type * as recordTypes from "../../types/recordTypes"; import type { cityssmGlobal } from "@cityssm/bulma-webapp-js/src/types"; @@ -1262,907 +1262,14 @@ declare const bulmaJS: BulmaJS; */ if (!isCreate) { - let lotOccupancyComments: recordTypes.LotOccupancyComment[] = exports.lotOccupancyComments; - delete exports.lotOccupancyComments; - - const openEditLotOccupancyComment = (clickEvent: Event) => { - const lotOccupancyCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset - .lotOccupancyCommentId!, - 10 - ); - - const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { - return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; - })!; - - let editFormElement: HTMLFormElement; - let editCloseModalFunction: () => void; - - const editComment = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", - editFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments?: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments!; - editCloseModalFunction(); - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Updating Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-editComment", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId; - ( - modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyCommentId" - ) as HTMLInputElement - ).value = lotOccupancyCommentId.toString(); - - ( - modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyComment" - ) as HTMLInputElement - ).value = lotOccupancyComment.lotOccupancyComment!; - - const lotOccupancyCommentDateStringElement = modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyCommentDateString" - ) as HTMLInputElement; - - lotOccupancyCommentDateStringElement.value = - lotOccupancyComment.lotOccupancyCommentDateString!; - - const currentDateString = cityssm.dateToString(new Date()); - - lotOccupancyCommentDateStringElement.max = - lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString - ? currentDateString - : lotOccupancyComment.lotOccupancyCommentDateString!; - - ( - modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyCommentTimeString" - ) as HTMLInputElement - ).value = lotOccupancyComment.lotOccupancyCommentTimeString!; - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - los.initializeDatePickers(modalElement); - // los.initializeTimePickers(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyCommentEdit--lotOccupancyComment" - ) as HTMLTextAreaElement - ).focus(); - - editFormElement = modalElement.querySelector("form")!; - editFormElement.addEventListener("submit", editComment); - - editCloseModalFunction = closeModalFunction; - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - }; - - const deleteLotOccupancyComment = (clickEvent: Event) => { - const lotOccupancyCommentId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset - .lotOccupancyCommentId!, - 10 - ); - - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", - { - lotOccupancyId, - lotOccupancyCommentId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments; - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Removing Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Remove Comment?", - message: "Are you sure you want to remove this comment?", - okButton: { - text: "Yes, Remove Comment", - callbackFunction: doDelete - }, - contextualColorName: "warning" - }); - }; - - const renderLotOccupancyComments = () => { - const containerElement = document.querySelector( - "#container--lotOccupancyComments" - ) as HTMLElement; - - if (lotOccupancyComments.length === 0) { - containerElement.innerHTML = - '
' + - '

There are no comments associated with this record.

' + - "
"; - return; - } - - const tableElement = document.createElement("table"); - tableElement.className = "table is-fullwidth is-striped is-hoverable"; - tableElement.innerHTML = - "" + - "Commentor" + - "Comment Date" + - "Comment" + - 'Options' + - "" + - ""; - - for (const lotOccupancyComment of lotOccupancyComments) { - const tableRowElement = document.createElement("tr"); - tableRowElement.dataset.lotOccupancyCommentId = - lotOccupancyComment.lotOccupancyCommentId!.toString(); - - tableRowElement.innerHTML = - "" + - cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + - "" + - "" + - lotOccupancyComment.lotOccupancyCommentDateString + - (lotOccupancyComment.lotOccupancyCommentTime === 0 - ? "" - : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + - "" + - "" + - cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + - "" + - ('' + - '
' + - ('") + - ('") + - "
" + - ""); - - ( - tableRowElement.querySelector(".button--edit") as HTMLButtonElement - ).addEventListener("click", openEditLotOccupancyComment); - - ( - tableRowElement.querySelector(".button--delete") as HTMLButtonElement - ).addEventListener("click", deleteLotOccupancyComment); - - tableElement.querySelector("tbody")!.append(tableRowElement); - } - - containerElement.innerHTML = ""; - containerElement.append(tableElement); - }; - - (document.querySelector("#button--addComment") as HTMLButtonElement).addEventListener( - "click", - () => { - let addFormElement: HTMLFormElement; - let addCloseModalFunction: () => void; - - const addComment = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", - addFormElement, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyComments?: recordTypes.LotOccupancyComment[]; - }) => { - if (responseJSON.success) { - lotOccupancyComments = responseJSON.lotOccupancyComments!; - addCloseModalFunction(); - renderLotOccupancyComments(); - } else { - bulmaJS.alert({ - title: "Error Adding Comment", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-addComment", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyCommentAdd--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId; - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - ( - modalElement.querySelector( - "#lotOccupancyCommentAdd--lotOccupancyComment" - ) as HTMLTextAreaElement - ).focus(); - - addFormElement = modalElement.querySelector("form")!; - addFormElement.addEventListener("submit", addComment); - - addCloseModalFunction = closeModalFunction; - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - } - ); - - renderLotOccupancyComments(); + //=include lotOccupancyEditComments.js } - + /* - * Fees / Transactions - */ - - if (!isCreate) { - let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees; - delete exports.lotOccupancyFees; - - const lotOccupancyFeesContainerElement = document.querySelector( - "#container--lotOccupancyFees" - ) as HTMLElement; - - const getFeeGrandTotal = (): number => { - let feeGrandTotal = 0; - - for (const lotOccupancyFee of lotOccupancyFees) { - feeGrandTotal += - (lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * - lotOccupancyFee.quantity!; - } - - return feeGrandTotal; - }; - - const deleteLotOccupancyFee = (clickEvent: Event) => { - const feeId = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--lotOccupancyFee" - ) as HTMLElement - ).dataset.feeId; - - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", - { - lotOccupancyId, - feeId - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyFees?: recordTypes.LotOccupancyFee[]; - }) => { - if (responseJSON.success) { - lotOccupancyFees = responseJSON.lotOccupancyFees!; - renderLotOccupancyFees(); - } else { - bulmaJS.alert({ - title: "Error Deleting Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Fee", - message: "Are you sure you want to delete this fee?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Fee", - callbackFunction: doDelete - } - }); - }; - - const renderLotOccupancyFees = () => { - if (lotOccupancyFees.length === 0) { - lotOccupancyFeesContainerElement.innerHTML = - '
' + - '

There are no fees associated with this record.

' + - "
"; - - renderLotOccupancyTransactions(); - - return; - } - - lotOccupancyFeesContainerElement.innerHTML = - '' + - ("" + - "" + - '' + - '' + - '' + - '' + - '' + - '' + - "") + - "" + - ("" + - '' + - '' + - '' + - "") + - "
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; - - let feeAmountTotal = 0; - let taxAmountTotal = 0; - - for (const lotOccupancyFee of lotOccupancyFees) { - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyFee"; - tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString(); - tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity - ? "1" - : "0"; - - tableRowElement.innerHTML = - '' + - cityssm.escapeHTML(lotOccupancyFee.feeName || "") + - "" + - (lotOccupancyFee.quantity === 1 - ? "" - : '$' + - lotOccupancyFee.feeAmount!.toFixed(2) + - "" + - "×" + - '' + - lotOccupancyFee.quantity + - "" + - "=") + - '$' + - (lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) + - "" + - ('' + - '" + - ""); - - tableRowElement - .querySelector("button")! - .addEventListener("click", deleteLotOccupancyFee); - - lotOccupancyFeesContainerElement.querySelector("tbody")!.append(tableRowElement); - - feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!; - taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!; - } - - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--feeAmountTotal" - ) as HTMLElement - ).textContent = "$" + feeAmountTotal.toFixed(2); - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--taxAmountTotal" - ) as HTMLElement - ).textContent = "$" + taxAmountTotal.toFixed(2); - ( - lotOccupancyFeesContainerElement.querySelector( - "#lotOccupancyFees--grandTotal" - ) as HTMLElement - ).textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); - - renderLotOccupancyTransactions(); - }; - - (document.querySelector("#button--addFee") as HTMLButtonElement).addEventListener( - "click", - () => { - if (hasUnsavedChanges) { - bulmaJS.alert({ - message: "Please save all unsaved changes before adding fees.", - contextualColorName: "warning" - }); - return; - } - - let feeCategories: recordTypes.FeeCategory[]; - - let feeFilterElement: HTMLInputElement; - let feeFilterResultsElement: HTMLElement; - - const doAddFee = (feeId: number, quantity: number | string = 1) => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", - { - lotOccupancyId, - feeId, - quantity - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyFees?: recordTypes.LotOccupancyFee[]; - }) => { - if (responseJSON.success) { - lotOccupancyFees = responseJSON.lotOccupancyFees!; - renderLotOccupancyFees(); - filterFees(); - } else { - bulmaJS.alert({ - title: "Error Adding Fee", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => { - let quantityElement: HTMLInputElement; - let quantityCloseModalFunction: () => void; - - const doSetQuantity = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - doAddFee(fee.feeId!, quantityElement.value); - quantityCloseModalFunction(); - }; - - cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { - onshow: (modalElement) => { - ( - modalElement.querySelector( - "#lotOccupancyFeeQuantity--quantityUnit" - ) as HTMLElement - ).textContent = fee.quantityUnit!; - }, - onshown: (modalElement, closeModalFunction) => { - quantityCloseModalFunction = closeModalFunction; - - quantityElement = modalElement.querySelector( - "#lotOccupancyFeeQuantity--quantity" - ) as HTMLInputElement; - - modalElement - .querySelector("form")! - .addEventListener("submit", doSetQuantity); - } - }); - }; - - const tryAddFee = (clickEvent: Event) => { - clickEvent.preventDefault(); - - const feeId = Number.parseInt( - (clickEvent.currentTarget as HTMLElement).dataset.feeId!, - 10 - ); - const feeCategoryId = Number.parseInt( - ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--feeCategory" - ) as HTMLElement - ).dataset.feeCategoryId!, - 10 - ); - - const feeCategory = feeCategories.find((currentFeeCategory) => { - return currentFeeCategory.feeCategoryId === feeCategoryId; - })!; - - const fee = feeCategory.fees!.find((currentFee) => { - return currentFee.feeId === feeId; - })!; - - if (fee.includeQuantity) { - doSetQuantityAndAddFee(fee); - } else { - doAddFee(feeId); - } - }; - - const filterFees = () => { - const filterStringPieces = feeFilterElement.value - .trim() - .toLowerCase() - .split(" "); - - feeFilterResultsElement.innerHTML = ""; - - for (const feeCategory of feeCategories) { - const categoryContainerElement = document.createElement("div"); - categoryContainerElement.className = "container--feeCategory"; - categoryContainerElement.dataset.feeCategoryId = - feeCategory.feeCategoryId!.toString(); - categoryContainerElement.innerHTML = - '

' + - cityssm.escapeHTML(feeCategory.feeCategory || "") + - "

" + - '
'; - - let hasFees = false; - - for (const fee of feeCategory.fees!) { - if ( - lotOccupancyFeesContainerElement.querySelector( - ".container--lotOccupancyFee[data-fee-id='" + - fee.feeId + - "'][data-include-quantity='0']" - ) - ) { - continue; - } - - let includeFee = true; - - for (const filterStringPiece of filterStringPieces) { - if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) { - includeFee = false; - break; - } - } - - if (!includeFee) { - continue; - } - - hasFees = true; - - const panelBlockElement = document.createElement("a"); - panelBlockElement.className = "panel-block is-block container--fee"; - panelBlockElement.dataset.feeId = fee.feeId!.toString(); - panelBlockElement.href = "#"; - - panelBlockElement.innerHTML = - "" + - cityssm.escapeHTML(fee.feeName || "") + - "
" + - "" + - cityssm - .escapeHTML(fee.feeDescription || "") - .replace(/\n/g, "
") + - "
"; - - panelBlockElement.addEventListener("click", tryAddFee); - - ( - categoryContainerElement.querySelector(".panel") as HTMLElement - ).append(panelBlockElement); - } - - if (hasFees) { - feeFilterResultsElement.append(categoryContainerElement); - } - } - }; - - cityssm.openHtmlModal("lotOccupancy-addFee", { - onshow: (modalElement) => { - feeFilterElement = modalElement.querySelector( - "#feeSelect--feeName" - ) as HTMLInputElement; - - feeFilterResultsElement = modalElement.querySelector( - "#resultsContainer--feeSelect" - ) as HTMLElement; - - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doGetFees", - { - lotOccupancyId - }, - (responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => { - feeCategories = responseJSON.feeCategories; - - feeFilterElement.disabled = false; - feeFilterElement.addEventListener("keyup", filterFees); - feeFilterElement.focus(); - - filterFees(); - } - ); - }, - onshown: () => { - bulmaJS.toggleHtmlClipped(); - }, - onhidden: () => { - renderLotOccupancyFees(); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - } - ); - - let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] = - exports.lotOccupancyTransactions; - delete exports.lotOccupancyTransactions; - - const lotOccupancyTransactionsContainerElement = document.querySelector( - "#container--lotOccupancyTransactions" - ) as HTMLElement; - - const getTransactionGrandTotal = (): number => { - let transactionGrandTotal = 0; - - for (const lotOccupancyTransaction of lotOccupancyTransactions) { - transactionGrandTotal += lotOccupancyTransaction.transactionAmount; - } - - return transactionGrandTotal; - }; - - const deleteLotOccupancyTransaction = (clickEvent: Event) => { - const transactionIndex = ( - (clickEvent.currentTarget as HTMLElement).closest( - ".container--lotOccupancyTransaction" - ) as HTMLElement - ).dataset.transactionIndex; - - const doDelete = () => { - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", - { - lotOccupancyId, - transactionIndex - }, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; - }) => { - if (responseJSON.success) { - lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; - renderLotOccupancyTransactions(); - } else { - bulmaJS.alert({ - title: "Error Deleting Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - bulmaJS.confirm({ - title: "Delete Trasnaction", - message: "Are you sure you want to delete this transaction?", - contextualColorName: "warning", - okButton: { - text: "Yes, Delete Transaction", - callbackFunction: doDelete - } - }); - }; - - const renderLotOccupancyTransactions = () => { - if (lotOccupancyTransactions.length === 0) { - lotOccupancyTransactionsContainerElement.innerHTML = - '
' + - '

There are no transactions associated with this record.

' + - "
"; - - return; - } - - lotOccupancyTransactionsContainerElement.innerHTML = - '' + - "" + - '' + - "" + - '' + - '' + - "" + - "" + - ("" + - '' + - '' + - '' + - "") + - "
Date" + - cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + - "AmountOptions
Transaction Total
"; - - let transactionGrandTotal = 0; - - for (const lotOccupancyTransaction of lotOccupancyTransactions) { - transactionGrandTotal += lotOccupancyTransaction.transactionAmount; - - const tableRowElement = document.createElement("tr"); - tableRowElement.className = "container--lotOccupancyTransaction"; - tableRowElement.dataset.transactionIndex = - lotOccupancyTransaction.transactionIndex!.toString(); - - tableRowElement.innerHTML = - "" + - lotOccupancyTransaction.transactionDateString + - "" + - ("" + - cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + - "
" + - "" + - cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + - "" + - "") + - ('$' + - lotOccupancyTransaction.transactionAmount.toFixed(2) + - "") + - ('' + - '" + - ""); - - tableRowElement - .querySelector("button")! - .addEventListener("click", deleteLotOccupancyTransaction); - - lotOccupancyTransactionsContainerElement - .querySelector("tbody")! - .append(tableRowElement); - } - - ( - lotOccupancyTransactionsContainerElement.querySelector( - "#lotOccupancyTransactions--grandTotal" - ) as HTMLElement - ).textContent = "$" + transactionGrandTotal.toFixed(2); - - const feeGrandTotal = getFeeGrandTotal(); - - if (feeGrandTotal > transactionGrandTotal) { - lotOccupancyTransactionsContainerElement.insertAdjacentHTML( - "afterbegin", - '
' + - '
' + - '
' + - '
Outstanding Balance
' + - '
$' + - (feeGrandTotal - transactionGrandTotal).toFixed(2) + - "
" + - "
" + - "
" + - "
" - ); - } - }; - - (document.querySelector("#button--addTransaction") as HTMLButtonElement).addEventListener( - "click", - () => { - let addCloseModalFunction: () => void; - - const doAddTransaction = (submitEvent: SubmitEvent) => { - submitEvent.preventDefault(); - - cityssm.postJSON( - los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", - submitEvent.currentTarget, - (responseJSON: { - success: boolean; - errorMessage?: string; - lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; - }) => { - if (responseJSON.success) { - lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; - addCloseModalFunction(); - renderLotOccupancyTransactions(); - } else { - bulmaJS.confirm({ - title: "Error Adding Transaction", - message: responseJSON.errorMessage || "", - contextualColorName: "danger" - }); - } - } - ); - }; - - cityssm.openHtmlModal("lotOccupancy-addTransaction", { - onshow: (modalElement) => { - los.populateAliases(modalElement); - - ( - modalElement.querySelector( - "#lotOccupancyTransactionAdd--lotOccupancyId" - ) as HTMLInputElement - ).value = lotOccupancyId.toString(); - - const feeGrandTotal = getFeeGrandTotal(); - const transactionGrandTotal = getTransactionGrandTotal(); - - const transactionAmountElement = modalElement.querySelector( - "#lotOccupancyTransactionAdd--transactionAmount" - ) as HTMLInputElement; - - transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); - transactionAmountElement.max = Math.max( - feeGrandTotal - transactionGrandTotal, - 0 - ).toFixed(2); - transactionAmountElement.value = Math.max( - feeGrandTotal - transactionGrandTotal, - 0 - ).toFixed(2); - }, - onshown: (modalElement, closeModalFunction) => { - bulmaJS.toggleHtmlClipped(); - - addCloseModalFunction = closeModalFunction; - - modalElement - .querySelector("form")! - .addEventListener("submit", doAddTransaction); - }, - onremoved: () => { - bulmaJS.toggleHtmlClipped(); - } - }); - } - ); - - renderLotOccupancyFees(); + * Fees / Transactions + */ + + if (!isCreate) { + //=include lotOccupancyEditFees.js } })(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.d.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js new file mode 100644 index 00000000..dcc39df5 --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.js @@ -0,0 +1,181 @@ +"use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ +Object.defineProperty(exports, "__esModule", { value: true }); +let lotOccupancyComments = exports.lotOccupancyComments; +delete exports.lotOccupancyComments; +const openEditLotOccupancyComment = (clickEvent) => { + const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); + const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { + return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; + }); + let editFormElement; + let editCloseModalFunction; + const editComment = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", editFormElement, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments; + editCloseModalFunction(); + renderLotOccupancyComments(); + } + else { + bulmaJS.alert({ + title: "Error Updating Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-editComment", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value = lotOccupancyId; + modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value = lotOccupancyCommentId.toString(); + modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value = lotOccupancyComment.lotOccupancyComment; + const lotOccupancyCommentDateStringElement = modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString"); + lotOccupancyCommentDateStringElement.value = + lotOccupancyComment.lotOccupancyCommentDateString; + const currentDateString = cityssm.dateToString(new Date()); + lotOccupancyCommentDateStringElement.max = + lotOccupancyComment.lotOccupancyCommentDateString <= currentDateString + ? currentDateString + : lotOccupancyComment.lotOccupancyCommentDateString; + modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value = lotOccupancyComment.lotOccupancyCommentTimeString; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); + modalElement.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(); + editFormElement = modalElement.querySelector("form"); + editFormElement.addEventListener("submit", editComment); + editCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}; +const deleteLotOccupancyComment = (clickEvent) => { + const lotOccupancyCommentId = Number.parseInt(clickEvent.currentTarget.closest("tr").dataset.lotOccupancyCommentId, 10); + const doDelete = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", { + lotOccupancyId, + lotOccupancyCommentId + }, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments; + renderLotOccupancyComments(); + } + else { + bulmaJS.alert({ + title: "Error Removing Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Remove Comment?", + message: "Are you sure you want to remove this comment?", + okButton: { + text: "Yes, Remove Comment", + callbackFunction: doDelete + }, + contextualColorName: "warning" + }); +}; +const renderLotOccupancyComments = () => { + const containerElement = document.querySelector("#container--lotOccupancyComments"); + if (lotOccupancyComments.length === 0) { + containerElement.innerHTML = + '
' + + '

There are no comments associated with this record.

' + + "
"; + return; + } + const tableElement = document.createElement("table"); + tableElement.className = "table is-fullwidth is-striped is-hoverable"; + tableElement.innerHTML = + "" + + "Commentor" + + "Comment Date" + + "Comment" + + 'Options' + + "" + + ""; + for (const lotOccupancyComment of lotOccupancyComments) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.lotOccupancyCommentId = + lotOccupancyComment.lotOccupancyCommentId.toString(); + tableRowElement.innerHTML = + "" + + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + + "" + + "" + + lotOccupancyComment.lotOccupancyCommentDateString + + (lotOccupancyComment.lotOccupancyCommentTime === 0 + ? "" + : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + + "" + + "" + + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + + "" + + ('' + + '
' + + ('") + + ('") + + "
" + + ""); + tableRowElement.querySelector(".button--edit").addEventListener("click", openEditLotOccupancyComment); + tableRowElement.querySelector(".button--delete").addEventListener("click", deleteLotOccupancyComment); + tableElement.querySelector("tbody").append(tableRowElement); + } + containerElement.innerHTML = ""; + containerElement.append(tableElement); +}; +document.querySelector("#button--addComment").addEventListener("click", () => { + let addFormElement; + let addCloseModalFunction; + const addComment = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", addFormElement, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments; + addCloseModalFunction(); + renderLotOccupancyComments(); + } + else { + bulmaJS.alert({ + title: "Error Adding Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-addComment", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value = lotOccupancyId; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + modalElement.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(); + addFormElement = modalElement.querySelector("form"); + addFormElement.addEventListener("submit", addComment); + addCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}); +renderLotOccupancyComments(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts new file mode 100644 index 00000000..ccd03cee --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts @@ -0,0 +1,300 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion, 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; + +declare const los: globalTypes.LOS; + +declare const lotOccupancyId: string; + +let lotOccupancyComments: recordTypes.LotOccupancyComment[] = exports.lotOccupancyComments; +delete exports.lotOccupancyComments; + +const openEditLotOccupancyComment = (clickEvent: Event) => { + const lotOccupancyCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, + 10 + ); + + const lotOccupancyComment = lotOccupancyComments.find((currentLotOccupancyComment) => { + return currentLotOccupancyComment.lotOccupancyCommentId === lotOccupancyCommentId; + })!; + + let editFormElement: HTMLFormElement; + let editCloseModalFunction: () => void; + + const editComment = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doUpdateLotOccupancyComment", + editFormElement, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyComments?: recordTypes.LotOccupancyComment[]; + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments!; + editCloseModalFunction(); + renderLotOccupancyComments(); + } else { + bulmaJS.alert({ + title: "Error Updating Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + cityssm.openHtmlModal("lotOccupancy-editComment", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + + ( + modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyId" + ) as HTMLInputElement + ).value = lotOccupancyId; + ( + modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyCommentId" + ) as HTMLInputElement + ).value = lotOccupancyCommentId.toString(); + + ( + modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyComment" + ) as HTMLInputElement + ).value = lotOccupancyComment.lotOccupancyComment!; + + const lotOccupancyCommentDateStringElement = modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyCommentDateString" + ) as HTMLInputElement; + + lotOccupancyCommentDateStringElement.value = + lotOccupancyComment.lotOccupancyCommentDateString!; + + const currentDateString = cityssm.dateToString(new Date()); + + lotOccupancyCommentDateStringElement.max = + lotOccupancyComment.lotOccupancyCommentDateString! <= currentDateString + ? currentDateString + : lotOccupancyComment.lotOccupancyCommentDateString!; + + ( + modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyCommentTimeString" + ) as HTMLInputElement + ).value = lotOccupancyComment.lotOccupancyCommentTimeString!; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + + los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); + + ( + modalElement.querySelector( + "#lotOccupancyCommentEdit--lotOccupancyComment" + ) as HTMLTextAreaElement + ).focus(); + + editFormElement = modalElement.querySelector("form")!; + editFormElement.addEventListener("submit", editComment); + + editCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}; + +const deleteLotOccupancyComment = (clickEvent: Event) => { + const lotOccupancyCommentId = Number.parseInt( + (clickEvent.currentTarget as HTMLElement).closest("tr")!.dataset.lotOccupancyCommentId!, + 10 + ); + + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyComment", + { + lotOccupancyId, + lotOccupancyCommentId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyComments: recordTypes.LotOccupancyComment[]; + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments; + renderLotOccupancyComments(); + } else { + bulmaJS.alert({ + title: "Error Removing Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + bulmaJS.confirm({ + title: "Remove Comment?", + message: "Are you sure you want to remove this comment?", + okButton: { + text: "Yes, Remove Comment", + callbackFunction: doDelete + }, + contextualColorName: "warning" + }); +}; + +const renderLotOccupancyComments = () => { + const containerElement = document.querySelector( + "#container--lotOccupancyComments" + ) as HTMLElement; + + if (lotOccupancyComments.length === 0) { + containerElement.innerHTML = + '
' + + '

There are no comments associated with this record.

' + + "
"; + return; + } + + const tableElement = document.createElement("table"); + tableElement.className = "table is-fullwidth is-striped is-hoverable"; + tableElement.innerHTML = + "" + + "Commentor" + + "Comment Date" + + "Comment" + + 'Options' + + "" + + ""; + + for (const lotOccupancyComment of lotOccupancyComments) { + const tableRowElement = document.createElement("tr"); + tableRowElement.dataset.lotOccupancyCommentId = + lotOccupancyComment.lotOccupancyCommentId!.toString(); + + tableRowElement.innerHTML = + "" + + cityssm.escapeHTML(lotOccupancyComment.recordCreate_userName || "") + + "" + + "" + + lotOccupancyComment.lotOccupancyCommentDateString + + (lotOccupancyComment.lotOccupancyCommentTime === 0 + ? "" + : " " + lotOccupancyComment.lotOccupancyCommentTimeString) + + "" + + "" + + cityssm.escapeHTML(lotOccupancyComment.lotOccupancyComment || "") + + "" + + ('' + + '
' + + ('") + + ('") + + "
" + + ""); + + (tableRowElement.querySelector(".button--edit") as HTMLButtonElement).addEventListener( + "click", + openEditLotOccupancyComment + ); + + (tableRowElement.querySelector(".button--delete") as HTMLButtonElement).addEventListener( + "click", + deleteLotOccupancyComment + ); + + tableElement.querySelector("tbody")!.append(tableRowElement); + } + + containerElement.innerHTML = ""; + containerElement.append(tableElement); +}; + +(document.querySelector("#button--addComment") as HTMLButtonElement).addEventListener( + "click", + () => { + let addFormElement: HTMLFormElement; + let addCloseModalFunction: () => void; + + const addComment = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doAddLotOccupancyComment", + addFormElement, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyComments?: recordTypes.LotOccupancyComment[]; + }) => { + if (responseJSON.success) { + lotOccupancyComments = responseJSON.lotOccupancyComments!; + addCloseModalFunction(); + renderLotOccupancyComments(); + } else { + bulmaJS.alert({ + title: "Error Adding Comment", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + cityssm.openHtmlModal("lotOccupancy-addComment", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + + ( + modalElement.querySelector( + "#lotOccupancyCommentAdd--lotOccupancyId" + ) as HTMLInputElement + ).value = lotOccupancyId; + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + + ( + modalElement.querySelector( + "#lotOccupancyCommentAdd--lotOccupancyComment" + ) as HTMLTextAreaElement + ).focus(); + + addFormElement = modalElement.querySelector("form")!; + addFormElement.addEventListener("submit", addComment); + + addCloseModalFunction = closeModalFunction; + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + } +); + +renderLotOccupancyComments(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.d.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js new file mode 100644 index 00000000..d659351d --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.js @@ -0,0 +1,407 @@ +"use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ +Object.defineProperty(exports, "__esModule", { value: true }); +let lotOccupancyFees = exports.lotOccupancyFees; +delete exports.lotOccupancyFees; +const lotOccupancyFeesContainerElement = document.querySelector("#container--lotOccupancyFees"); +const getFeeGrandTotal = () => { + let feeGrandTotal = 0; + for (const lotOccupancyFee of lotOccupancyFees) { + feeGrandTotal += + (lotOccupancyFee.feeAmount + lotOccupancyFee.taxAmount) * lotOccupancyFee.quantity; + } + return feeGrandTotal; +}; +const deleteLotOccupancyFee = (clickEvent) => { + const feeId = clickEvent.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId; + const doDelete = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", { + lotOccupancyId, + feeId + }, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees; + renderLotOccupancyFees(); + } + else { + bulmaJS.alert({ + title: "Error Deleting Fee", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete Fee", + message: "Are you sure you want to delete this fee?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Fee", + callbackFunction: doDelete + } + }); +}; +const renderLotOccupancyFees = () => { + if (lotOccupancyFees.length === 0) { + lotOccupancyFeesContainerElement.innerHTML = + '
' + + '

There are no fees associated with this record.

' + + "
"; + renderLotOccupancyTransactions(); + return; + } + lotOccupancyFeesContainerElement.innerHTML = + '' + + ("" + + "" + + '' + + '' + + '' + + '' + + '' + + '' + + "") + + "" + + ("" + + '' + + '' + + '' + + "") + + "
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; + let feeAmountTotal = 0; + let taxAmountTotal = 0; + for (const lotOccupancyFee of lotOccupancyFees) { + const tableRowElement = document.createElement("tr"); + tableRowElement.className = "container--lotOccupancyFee"; + tableRowElement.dataset.feeId = lotOccupancyFee.feeId.toString(); + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotOccupancyFee.feeName || "") + + "" + + (lotOccupancyFee.quantity === 1 + ? "" + : '$' + + lotOccupancyFee.feeAmount.toFixed(2) + + "" + + "×" + + '' + + lotOccupancyFee.quantity + + "" + + "=") + + '$' + + (lotOccupancyFee.feeAmount * lotOccupancyFee.quantity).toFixed(2) + + "" + + ('' + + '" + + ""); + tableRowElement.querySelector("button").addEventListener("click", deleteLotOccupancyFee); + lotOccupancyFeesContainerElement.querySelector("tbody").append(tableRowElement); + feeAmountTotal += lotOccupancyFee.feeAmount * lotOccupancyFee.quantity; + taxAmountTotal += lotOccupancyFee.taxAmount * lotOccupancyFee.quantity; + } + lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--feeAmountTotal").textContent = "$" + feeAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--taxAmountTotal").textContent = "$" + taxAmountTotal.toFixed(2); + lotOccupancyFeesContainerElement.querySelector("#lotOccupancyFees--grandTotal").textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); + renderLotOccupancyTransactions(); +}; +document.querySelector("#button--addFee").addEventListener("click", () => { + if (hasUnsavedChanges) { + bulmaJS.alert({ + message: "Please save all unsaved changes before adding fees.", + contextualColorName: "warning" + }); + return; + } + let feeCategories; + let feeFilterElement; + let feeFilterResultsElement; + const doAddFee = (feeId, quantity = 1) => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", { + lotOccupancyId, + feeId, + quantity + }, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees; + renderLotOccupancyFees(); + filterFees(); + } + else { + bulmaJS.alert({ + title: "Error Adding Fee", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + const doSetQuantityAndAddFee = (fee) => { + let quantityElement; + let quantityCloseModalFunction; + const doSetQuantity = (submitEvent) => { + submitEvent.preventDefault(); + doAddFee(fee.feeId, quantityElement.value); + quantityCloseModalFunction(); + }; + cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { + onshow: (modalElement) => { + modalElement.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent = fee.quantityUnit; + }, + onshown: (modalElement, closeModalFunction) => { + quantityCloseModalFunction = closeModalFunction; + quantityElement = modalElement.querySelector("#lotOccupancyFeeQuantity--quantity"); + modalElement.querySelector("form").addEventListener("submit", doSetQuantity); + } + }); + }; + const tryAddFee = (clickEvent) => { + clickEvent.preventDefault(); + const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10); + const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId, 10); + const feeCategory = feeCategories.find((currentFeeCategory) => { + return currentFeeCategory.feeCategoryId === feeCategoryId; + }); + const fee = feeCategory.fees.find((currentFee) => { + return currentFee.feeId === feeId; + }); + if (fee.includeQuantity) { + doSetQuantityAndAddFee(fee); + } + else { + doAddFee(feeId); + } + }; + const filterFees = () => { + const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); + feeFilterResultsElement.innerHTML = ""; + for (const feeCategory of feeCategories) { + const categoryContainerElement = document.createElement("div"); + categoryContainerElement.className = "container--feeCategory"; + categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId.toString(); + categoryContainerElement.innerHTML = + '

' + + cityssm.escapeHTML(feeCategory.feeCategory || "") + + "

" + + '
'; + let hasFees = false; + for (const fee of feeCategory.fees) { + if (lotOccupancyFeesContainerElement.querySelector(".container--lotOccupancyFee[data-fee-id='" + + fee.feeId + + "'][data-include-quantity='0']")) { + continue; + } + let includeFee = true; + for (const filterStringPiece of filterStringPieces) { + if (!fee.feeName.toLowerCase().includes(filterStringPiece)) { + includeFee = false; + break; + } + } + if (!includeFee) { + continue; + } + hasFees = true; + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block container--fee"; + panelBlockElement.dataset.feeId = fee.feeId.toString(); + panelBlockElement.href = "#"; + panelBlockElement.innerHTML = + "" + + cityssm.escapeHTML(fee.feeName || "") + + "
" + + "" + + cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + + "
"; + panelBlockElement.addEventListener("click", tryAddFee); + categoryContainerElement.querySelector(".panel").append(panelBlockElement); + } + if (hasFees) { + feeFilterResultsElement.append(categoryContainerElement); + } + } + }; + cityssm.openHtmlModal("lotOccupancy-addFee", { + onshow: (modalElement) => { + feeFilterElement = modalElement.querySelector("#feeSelect--feeName"); + feeFilterResultsElement = modalElement.querySelector("#resultsContainer--feeSelect"); + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doGetFees", { + lotOccupancyId + }, (responseJSON) => { + feeCategories = responseJSON.feeCategories; + feeFilterElement.disabled = false; + feeFilterElement.addEventListener("keyup", filterFees); + feeFilterElement.focus(); + filterFees(); + }); + }, + onshown: () => { + bulmaJS.toggleHtmlClipped(); + }, + onhidden: () => { + renderLotOccupancyFees(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}); +let lotOccupancyTransactions = exports.lotOccupancyTransactions; +delete exports.lotOccupancyTransactions; +const lotOccupancyTransactionsContainerElement = document.querySelector("#container--lotOccupancyTransactions"); +const getTransactionGrandTotal = () => { + let transactionGrandTotal = 0; + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount; + } + return transactionGrandTotal; +}; +const deleteLotOccupancyTransaction = (clickEvent) => { + const transactionIndex = clickEvent.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex; + const doDelete = () => { + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", { + lotOccupancyId, + transactionIndex + }, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions; + renderLotOccupancyTransactions(); + } + else { + bulmaJS.alert({ + title: "Error Deleting Transaction", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + bulmaJS.confirm({ + title: "Delete Trasnaction", + message: "Are you sure you want to delete this transaction?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Transaction", + callbackFunction: doDelete + } + }); +}; +const renderLotOccupancyTransactions = () => { + if (lotOccupancyTransactions.length === 0) { + lotOccupancyTransactionsContainerElement.innerHTML = + '
' + + '

There are no transactions associated with this record.

' + + "
"; + return; + } + lotOccupancyTransactionsContainerElement.innerHTML = + '' + + "" + + '' + + "" + + '' + + '' + + "" + + "" + + ("" + + '' + + '' + + '' + + "") + + "
Date" + + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + + "AmountOptions
Transaction Total
"; + let transactionGrandTotal = 0; + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount; + const tableRowElement = document.createElement("tr"); + tableRowElement.className = "container--lotOccupancyTransaction"; + tableRowElement.dataset.transactionIndex = + lotOccupancyTransaction.transactionIndex.toString(); + tableRowElement.innerHTML = + "" + + lotOccupancyTransaction.transactionDateString + + "" + + ("" + + cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + + "
" + + "" + + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + + "" + + "") + + ('$' + + lotOccupancyTransaction.transactionAmount.toFixed(2) + + "") + + ('' + + '" + + ""); + tableRowElement + .querySelector("button") + .addEventListener("click", deleteLotOccupancyTransaction); + lotOccupancyTransactionsContainerElement.querySelector("tbody").append(tableRowElement); + } + lotOccupancyTransactionsContainerElement.querySelector("#lotOccupancyTransactions--grandTotal").textContent = "$" + transactionGrandTotal.toFixed(2); + const feeGrandTotal = getFeeGrandTotal(); + if (feeGrandTotal > transactionGrandTotal) { + lotOccupancyTransactionsContainerElement.insertAdjacentHTML("afterbegin", '
' + + '
' + + '
' + + '
Outstanding Balance
' + + '
$' + + (feeGrandTotal - transactionGrandTotal).toFixed(2) + + "
" + + "
" + + "
" + + "
"); + } +}; +document.querySelector("#button--addTransaction").addEventListener("click", () => { + let addCloseModalFunction; + const doAddTransaction = (submitEvent) => { + submitEvent.preventDefault(); + cityssm.postJSON(los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", submitEvent.currentTarget, (responseJSON) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions; + addCloseModalFunction(); + renderLotOccupancyTransactions(); + } + else { + bulmaJS.confirm({ + title: "Error Adding Transaction", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + }); + }; + cityssm.openHtmlModal("lotOccupancy-addTransaction", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + modalElement.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value = lotOccupancyId.toString(); + const feeGrandTotal = getFeeGrandTotal(); + const transactionGrandTotal = getTransactionGrandTotal(); + const transactionAmountElement = modalElement.querySelector("#lotOccupancyTransactionAdd--transactionAmount"); + transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); + transactionAmountElement.max = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); + transactionAmountElement.value = Math.max(feeGrandTotal - transactionGrandTotal, 0).toFixed(2); + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + addCloseModalFunction = closeModalFunction; + modalElement.querySelector("form").addEventListener("submit", doAddTransaction); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}); +renderLotOccupancyFees(); diff --git a/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts new file mode 100644 index 00000000..92780699 --- /dev/null +++ b/public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts @@ -0,0 +1,605 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion, 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; + +declare const los: globalTypes.LOS; + +declare const lotOccupancyId: string; +declare const hasUnsavedChanges: boolean; + +let lotOccupancyFees: recordTypes.LotOccupancyFee[] = exports.lotOccupancyFees; +delete exports.lotOccupancyFees; + +const lotOccupancyFeesContainerElement = document.querySelector( + "#container--lotOccupancyFees" +) as HTMLElement; + +const getFeeGrandTotal = (): number => { + let feeGrandTotal = 0; + + for (const lotOccupancyFee of lotOccupancyFees) { + feeGrandTotal += + (lotOccupancyFee.feeAmount! + lotOccupancyFee.taxAmount!) * lotOccupancyFee.quantity!; + } + + return feeGrandTotal; +}; + +const deleteLotOccupancyFee = (clickEvent: Event) => { + const feeId = ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--lotOccupancyFee" + ) as HTMLElement + ).dataset.feeId; + + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyFee", + { + lotOccupancyId, + feeId + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyFees?: recordTypes.LotOccupancyFee[]; + }) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees!; + renderLotOccupancyFees(); + } else { + bulmaJS.alert({ + title: "Error Deleting Fee", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + bulmaJS.confirm({ + title: "Delete Fee", + message: "Are you sure you want to delete this fee?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Fee", + callbackFunction: doDelete + } + }); +}; + +const renderLotOccupancyFees = () => { + if (lotOccupancyFees.length === 0) { + lotOccupancyFeesContainerElement.innerHTML = + '
' + + '

There are no fees associated with this record.

' + + "
"; + + renderLotOccupancyTransactions(); + + return; + } + + lotOccupancyFeesContainerElement.innerHTML = + '' + + ("" + + "" + + '' + + '' + + '' + + '' + + '' + + '' + + "") + + "" + + ("" + + '' + + '' + + '' + + "") + + "
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
"; + + let feeAmountTotal = 0; + let taxAmountTotal = 0; + + for (const lotOccupancyFee of lotOccupancyFees) { + const tableRowElement = document.createElement("tr"); + tableRowElement.className = "container--lotOccupancyFee"; + tableRowElement.dataset.feeId = lotOccupancyFee.feeId!.toString(); + tableRowElement.dataset.includeQuantity = lotOccupancyFee.includeQuantity ? "1" : "0"; + + tableRowElement.innerHTML = + '' + + cityssm.escapeHTML(lotOccupancyFee.feeName || "") + + "" + + (lotOccupancyFee.quantity === 1 + ? "" + : '$' + + lotOccupancyFee.feeAmount!.toFixed(2) + + "" + + "×" + + '' + + lotOccupancyFee.quantity + + "" + + "=") + + '$' + + (lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!).toFixed(2) + + "" + + ('' + + '" + + ""); + + tableRowElement.querySelector("button")!.addEventListener("click", deleteLotOccupancyFee); + + lotOccupancyFeesContainerElement.querySelector("tbody")!.append(tableRowElement); + + feeAmountTotal += lotOccupancyFee.feeAmount! * lotOccupancyFee.quantity!; + taxAmountTotal += lotOccupancyFee.taxAmount! * lotOccupancyFee.quantity!; + } + + ( + lotOccupancyFeesContainerElement.querySelector( + "#lotOccupancyFees--feeAmountTotal" + ) as HTMLElement + ).textContent = "$" + feeAmountTotal.toFixed(2); + ( + lotOccupancyFeesContainerElement.querySelector( + "#lotOccupancyFees--taxAmountTotal" + ) as HTMLElement + ).textContent = "$" + taxAmountTotal.toFixed(2); + ( + lotOccupancyFeesContainerElement.querySelector( + "#lotOccupancyFees--grandTotal" + ) as HTMLElement + ).textContent = "$" + (feeAmountTotal + taxAmountTotal).toFixed(2); + + renderLotOccupancyTransactions(); +}; + +(document.querySelector("#button--addFee") as HTMLButtonElement).addEventListener("click", () => { + if (hasUnsavedChanges) { + bulmaJS.alert({ + message: "Please save all unsaved changes before adding fees.", + contextualColorName: "warning" + }); + return; + } + + let feeCategories: recordTypes.FeeCategory[]; + + let feeFilterElement: HTMLInputElement; + let feeFilterResultsElement: HTMLElement; + + const doAddFee = (feeId: number, quantity: number | string = 1) => { + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doAddLotOccupancyFee", + { + lotOccupancyId, + feeId, + quantity + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyFees?: recordTypes.LotOccupancyFee[]; + }) => { + if (responseJSON.success) { + lotOccupancyFees = responseJSON.lotOccupancyFees!; + renderLotOccupancyFees(); + filterFees(); + } else { + bulmaJS.alert({ + title: "Error Adding Fee", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + const doSetQuantityAndAddFee = (fee: recordTypes.Fee) => { + let quantityElement: HTMLInputElement; + let quantityCloseModalFunction: () => void; + + const doSetQuantity = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + doAddFee(fee.feeId!, quantityElement.value); + quantityCloseModalFunction(); + }; + + cityssm.openHtmlModal("lotOccupancy-setFeeQuantity", { + onshow: (modalElement) => { + ( + modalElement.querySelector( + "#lotOccupancyFeeQuantity--quantityUnit" + ) as HTMLElement + ).textContent = fee.quantityUnit!; + }, + onshown: (modalElement, closeModalFunction) => { + quantityCloseModalFunction = closeModalFunction; + + quantityElement = modalElement.querySelector( + "#lotOccupancyFeeQuantity--quantity" + ) as HTMLInputElement; + + modalElement.querySelector("form")!.addEventListener("submit", doSetQuantity); + } + }); + }; + + const tryAddFee = (clickEvent: Event) => { + clickEvent.preventDefault(); + + const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId!, 10); + const feeCategoryId = Number.parseInt( + ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--feeCategory" + ) as HTMLElement + ).dataset.feeCategoryId!, + 10 + ); + + const feeCategory = feeCategories.find((currentFeeCategory) => { + return currentFeeCategory.feeCategoryId === feeCategoryId; + })!; + + const fee = feeCategory.fees!.find((currentFee) => { + return currentFee.feeId === feeId; + })!; + + if (fee.includeQuantity) { + doSetQuantityAndAddFee(fee); + } else { + doAddFee(feeId); + } + }; + + const filterFees = () => { + const filterStringPieces = feeFilterElement.value.trim().toLowerCase().split(" "); + + feeFilterResultsElement.innerHTML = ""; + + for (const feeCategory of feeCategories) { + const categoryContainerElement = document.createElement("div"); + categoryContainerElement.className = "container--feeCategory"; + categoryContainerElement.dataset.feeCategoryId = feeCategory.feeCategoryId!.toString(); + categoryContainerElement.innerHTML = + '

' + + cityssm.escapeHTML(feeCategory.feeCategory || "") + + "

" + + '
'; + + let hasFees = false; + + for (const fee of feeCategory.fees!) { + if ( + lotOccupancyFeesContainerElement.querySelector( + ".container--lotOccupancyFee[data-fee-id='" + + fee.feeId + + "'][data-include-quantity='0']" + ) + ) { + continue; + } + + let includeFee = true; + + for (const filterStringPiece of filterStringPieces) { + if (!fee.feeName!.toLowerCase().includes(filterStringPiece)) { + includeFee = false; + break; + } + } + + if (!includeFee) { + continue; + } + + hasFees = true; + + const panelBlockElement = document.createElement("a"); + panelBlockElement.className = "panel-block is-block container--fee"; + panelBlockElement.dataset.feeId = fee.feeId!.toString(); + panelBlockElement.href = "#"; + + panelBlockElement.innerHTML = + "" + + cityssm.escapeHTML(fee.feeName || "") + + "
" + + "" + + cityssm.escapeHTML(fee.feeDescription || "").replace(/\n/g, "
") + + "
"; + + panelBlockElement.addEventListener("click", tryAddFee); + + (categoryContainerElement.querySelector(".panel") as HTMLElement).append( + panelBlockElement + ); + } + + if (hasFees) { + feeFilterResultsElement.append(categoryContainerElement); + } + } + }; + + cityssm.openHtmlModal("lotOccupancy-addFee", { + onshow: (modalElement) => { + feeFilterElement = modalElement.querySelector( + "#feeSelect--feeName" + ) as HTMLInputElement; + + feeFilterResultsElement = modalElement.querySelector( + "#resultsContainer--feeSelect" + ) as HTMLElement; + + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doGetFees", + { + lotOccupancyId + }, + (responseJSON: { feeCategories: recordTypes.FeeCategory[] }) => { + feeCategories = responseJSON.feeCategories; + + feeFilterElement.disabled = false; + feeFilterElement.addEventListener("keyup", filterFees); + feeFilterElement.focus(); + + filterFees(); + } + ); + }, + onshown: () => { + bulmaJS.toggleHtmlClipped(); + }, + onhidden: () => { + renderLotOccupancyFees(); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); +}); + +let lotOccupancyTransactions: recordTypes.LotOccupancyTransaction[] = + exports.lotOccupancyTransactions; +delete exports.lotOccupancyTransactions; + +const lotOccupancyTransactionsContainerElement = document.querySelector( + "#container--lotOccupancyTransactions" +) as HTMLElement; + +const getTransactionGrandTotal = (): number => { + let transactionGrandTotal = 0; + + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount; + } + + return transactionGrandTotal; +}; + +const deleteLotOccupancyTransaction = (clickEvent: Event) => { + const transactionIndex = ( + (clickEvent.currentTarget as HTMLElement).closest( + ".container--lotOccupancyTransaction" + ) as HTMLElement + ).dataset.transactionIndex; + + const doDelete = () => { + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doDeleteLotOccupancyTransaction", + { + lotOccupancyId, + transactionIndex + }, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; + }) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; + renderLotOccupancyTransactions(); + } else { + bulmaJS.alert({ + title: "Error Deleting Transaction", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + bulmaJS.confirm({ + title: "Delete Trasnaction", + message: "Are you sure you want to delete this transaction?", + contextualColorName: "warning", + okButton: { + text: "Yes, Delete Transaction", + callbackFunction: doDelete + } + }); +}; + +const renderLotOccupancyTransactions = () => { + if (lotOccupancyTransactions.length === 0) { + lotOccupancyTransactionsContainerElement.innerHTML = + '
' + + '

There are no transactions associated with this record.

' + + "
"; + + return; + } + + lotOccupancyTransactionsContainerElement.innerHTML = + '' + + "" + + '' + + "" + + '' + + '' + + "" + + "" + + ("" + + '' + + '' + + '' + + "") + + "
Date" + + cityssm.escapeHTML(exports.aliases.externalReceiptNumber) + + "AmountOptions
Transaction Total
"; + + let transactionGrandTotal = 0; + + for (const lotOccupancyTransaction of lotOccupancyTransactions) { + transactionGrandTotal += lotOccupancyTransaction.transactionAmount; + + const tableRowElement = document.createElement("tr"); + tableRowElement.className = "container--lotOccupancyTransaction"; + tableRowElement.dataset.transactionIndex = + lotOccupancyTransaction.transactionIndex!.toString(); + + tableRowElement.innerHTML = + "" + + lotOccupancyTransaction.transactionDateString + + "" + + ("" + + cityssm.escapeHTML(lotOccupancyTransaction.externalReceiptNumber || "") + + "
" + + "" + + cityssm.escapeHTML(lotOccupancyTransaction.transactionNote || "") + + "" + + "") + + ('$' + + lotOccupancyTransaction.transactionAmount.toFixed(2) + + "") + + ('' + + '" + + ""); + + tableRowElement + .querySelector("button")! + .addEventListener("click", deleteLotOccupancyTransaction); + + lotOccupancyTransactionsContainerElement.querySelector("tbody")!.append(tableRowElement); + } + + ( + lotOccupancyTransactionsContainerElement.querySelector( + "#lotOccupancyTransactions--grandTotal" + ) as HTMLElement + ).textContent = "$" + transactionGrandTotal.toFixed(2); + + const feeGrandTotal = getFeeGrandTotal(); + + if (feeGrandTotal > transactionGrandTotal) { + lotOccupancyTransactionsContainerElement.insertAdjacentHTML( + "afterbegin", + '
' + + '
' + + '
' + + '
Outstanding Balance
' + + '
$' + + (feeGrandTotal - transactionGrandTotal).toFixed(2) + + "
" + + "
" + + "
" + + "
" + ); + } +}; + +(document.querySelector("#button--addTransaction") as HTMLButtonElement).addEventListener( + "click", + () => { + let addCloseModalFunction: () => void; + + const doAddTransaction = (submitEvent: SubmitEvent) => { + submitEvent.preventDefault(); + + cityssm.postJSON( + los.urlPrefix + "/lotOccupancies/doAddLotOccupancyTransaction", + submitEvent.currentTarget, + (responseJSON: { + success: boolean; + errorMessage?: string; + lotOccupancyTransactions?: recordTypes.LotOccupancyTransaction[]; + }) => { + if (responseJSON.success) { + lotOccupancyTransactions = responseJSON.lotOccupancyTransactions!; + addCloseModalFunction(); + renderLotOccupancyTransactions(); + } else { + bulmaJS.confirm({ + title: "Error Adding Transaction", + message: responseJSON.errorMessage || "", + contextualColorName: "danger" + }); + } + } + ); + }; + + cityssm.openHtmlModal("lotOccupancy-addTransaction", { + onshow: (modalElement) => { + los.populateAliases(modalElement); + + ( + modalElement.querySelector( + "#lotOccupancyTransactionAdd--lotOccupancyId" + ) as HTMLInputElement + ).value = lotOccupancyId.toString(); + + const feeGrandTotal = getFeeGrandTotal(); + const transactionGrandTotal = getTransactionGrandTotal(); + + const transactionAmountElement = modalElement.querySelector( + "#lotOccupancyTransactionAdd--transactionAmount" + ) as HTMLInputElement; + + transactionAmountElement.min = (-1 * transactionGrandTotal).toFixed(2); + transactionAmountElement.max = Math.max( + feeGrandTotal - transactionGrandTotal, + 0 + ).toFixed(2); + transactionAmountElement.value = Math.max( + feeGrandTotal - transactionGrandTotal, + 0 + ).toFixed(2); + }, + onshown: (modalElement, closeModalFunction) => { + bulmaJS.toggleHtmlClipped(); + + addCloseModalFunction = closeModalFunction; + + modalElement.querySelector("form")!.addEventListener("submit", doAddTransaction); + }, + onremoved: () => { + bulmaJS.toggleHtmlClipped(); + } + }); + } +); + +renderLotOccupancyFees(); diff --git a/public-typescript/lotOccupancySearch.js b/public-typescript/lotOccupancySearch.js index 2264340a..0ddf4020 100644 --- a/public-typescript/lotOccupancySearch.js +++ b/public-typescript/lotOccupancySearch.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/lotSearch.js b/public-typescript/lotSearch.js index 1015fa66..e90b1665 100644 --- a/public-typescript/lotSearch.js +++ b/public-typescript/lotSearch.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/lotView.js b/public-typescript/lotView.js index e6ee82f3..f895e781 100644 --- a/public-typescript/lotView.js +++ b/public-typescript/lotView.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const mapContainerElement = document.querySelector("#lot--map"); diff --git a/public-typescript/main.js b/public-typescript/main.js index 6735f221..2eee3802 100644 --- a/public-typescript/main.js +++ b/public-typescript/main.js @@ -1,9 +1,12 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const highlightMap = (mapContainerElement, mapKey, contextualClass) => { + // Search for ID let svgId = mapKey; let svgElementToHighlight; + // eslint-disable-next-line no-constant-condition while (true) { svgElementToHighlight = mapContainerElement.querySelector("#" + svgId); if (svgElementToHighlight || !svgId.includes("-")) { @@ -12,10 +15,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); svgId = svgId.slice(0, Math.max(0, svgId.lastIndexOf("-"))); } if (svgElementToHighlight) { + // eslint-disable-next-line unicorn/no-null svgElementToHighlight.style.fill = ""; svgElementToHighlight.classList.add("highlight", "is-" + contextualClass); const childPathElements = svgElementToHighlight.querySelectorAll("path"); for (const pathElement of childPathElements) { + // eslint-disable-next-line unicorn/no-null pathElement.style.fill = ""; } } @@ -56,29 +61,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); if (dateElement.required) { datePickerOptions.showClearButton = false; } + // apply min date if set if (dateElement.min) { datePickerOptions.minDate = cityssm.dateStringToDate(dateElement.min); } + // apply max date if set if (dateElement.max) { datePickerOptions.maxDate = cityssm.dateStringToDate(dateElement.max); } const cal = exports.bulmaCalendar.attach(dateElement, datePickerOptions)[0]; + // trigger change event on original element cal.on("save", () => { dateElement.value = cal.value(); dateElement.dispatchEvent(new Event("change")); }); + // Disable html scrolling when calendar is open cal.on("show", () => { document.querySelector("html").classList.add("is-clipped"); }); + // Reenable scrolling, if a modal window is not open cal.on("hide", () => { bulmaJS.toggleHtmlClipped(); }); + // Get the datepicker container element const datepickerElement = containerElement.querySelector("#" + cal._id); + // Override the previous and next month button styles const datePickerNavButtonElements = datepickerElement.querySelectorAll(".datepicker-nav button.is-text"); for (const datePickerNavButtonElement of datePickerNavButtonElements) { datePickerNavButtonElement.classList.add("is-" + datePickerBaseOptions.color); datePickerNavButtonElement.classList.remove("is-text"); } + // Override the clear button style const clearButtonElement = datepickerElement.querySelector(".datetimepicker-clear-button"); if (clearButtonElement) { if (dateElement.required) { @@ -91,12 +104,85 @@ Object.defineProperty(exports, "__esModule", { value: true }); ''; } } + // Apply a label const labelElement = document.querySelector("label[for='" + dateElement.id + "']"); if (labelElement) { datepickerElement.querySelector(".datetimepicker-dummy-input").ariaLabel = labelElement.textContent; } } }; + /* + const timePickerBaseOptions: BulmaCalendarOptions = { + type: "time", + timeFormat: "hh:mm", + color: "info", + displayMode: "dialog", + validateLabel: "Set Time", + minuteSteps: 1 + }; + + const initializeTimePickers = (containerElement: HTMLElement) => { + + const timeElements = containerElement.querySelectorAll( + "input[type='time']" + ) as NodeListOf; + + for (const timeElement of timeElements) { + const timePickerOptions = Object.assign({}, timePickerBaseOptions); + + if (timeElement.required) { + timePickerOptions.showClearButton = false; + } + + const cal = exports.bulmaCalendar.attach(timeElement, timePickerOptions)[0]; + + // trigger change event on original element + cal.on("save", () => { + timeElement.value = cal.value(); + timeElement.dispatchEvent(new Event("change")); + }); + + // Disable html scrolling when calendar is open + cal.on("show", () => { + document.querySelector("html")!.classList.add("is-clipped"); + }); + + // Reenable scrolling, if a modal window is not open + cal.on("hide", () => { + bulmaJS.toggleHtmlClipped(); + }); + + // Get the datepicker container element + const timePickerElement = containerElement.querySelector("#" + cal._id) as HTMLElement; + + // Remove "cancel" button + + const timePickerCancelButtonElement = timePickerElement.querySelector( + ".datetimepicker-footer-cancel" + ); + + if (timePickerCancelButtonElement) { + timePickerCancelButtonElement.remove(); + } + + // Override the clear button style + + const clearButtonElement = timePickerElement.querySelector( + ".datetimepicker-clear-button" + ) as HTMLElement; + + if (clearButtonElement) { + if (timeElement.required) { + clearButtonElement.remove(); + } else { + clearButtonElement.dataset.tooltip = "Clear"; + clearButtonElement.innerHTML = + ''; + } + } + } + }; + */ const populateAliases = (containerElement) => { const aliasElements = containerElement.querySelectorAll(".alias"); for (const aliasElement of aliasElements) { @@ -155,6 +241,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); highlightMap, initializeUnlockFieldButtons, initializeDatePickers, + // initializeTimePickers, populateAliases, getRandomColor }; diff --git a/public-typescript/mapEdit.js b/public-typescript/mapEdit.js index 7bdc8f4b..04373e69 100644 --- a/public-typescript/mapEdit.js +++ b/public-typescript/mapEdit.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/mapSearch.js b/public-typescript/mapSearch.js index 461a59ed..8b3f57e8 100644 --- a/public-typescript/mapSearch.js +++ b/public-typescript/mapSearch.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/mapView.js b/public-typescript/mapView.js index 2f267db2..139bcafb 100644 --- a/public-typescript/mapView.js +++ b/public-typescript/mapView.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const mapContainerElement = document.querySelector("#map--leaflet"); @@ -6,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const mapLatitude = Number.parseFloat(mapContainerElement.dataset.mapLatitude); const mapLongitude = Number.parseFloat(mapContainerElement.dataset.mapLongitude); const mapCoordinates = [mapLatitude, mapLongitude]; + // eslint-disable-next-line unicorn/no-array-callback-reference const map = L.map(mapContainerElement); map.setView(mapCoordinates, 15); L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { diff --git a/public-typescript/reportSearch.js b/public-typescript/reportSearch.js index 135ec1a1..85c351b7 100644 --- a/public-typescript/reportSearch.js +++ b/public-typescript/reportSearch.js @@ -1,13 +1,17 @@ +/* eslint-disable unicorn/prefer-module */ (() => { const menuTabElements = document.querySelectorAll(".menu a"); const tabContainerElements = document.querySelectorAll(".tabs-container > div"); const selectTab = (clickEvent) => { clickEvent.preventDefault(); + // Remove .is-active from all tabs for (const menuTabElement of menuTabElements) { menuTabElement.classList.remove("is-active"); } + // Set .is-active on clicked tab const selectedTabElement = clickEvent.currentTarget; selectedTabElement.classList.add("is-active"); + // Hide all but selected tab const selectedTabContainerId = selectedTabElement.href.slice(Math.max(0, selectedTabElement.href.indexOf("#") + 1)); for (const tabContainerElement of tabContainerElements) { if (tabContainerElement.id === selectedTabContainerId) { diff --git a/public-typescript/workOrderEdit.js b/public-typescript/workOrderEdit.js index b54d8909..27d691dd 100644 --- a/public-typescript/workOrderEdit.js +++ b/public-typescript/workOrderEdit.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; @@ -37,6 +38,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); for (const inputElement of inputElements) { inputElement.addEventListener("change", cityssm.enableNavBlocker); } + /* + * Work Order Options + */ let workOrderMilestones; if (!isCreate) { const doClose = () => { @@ -67,6 +71,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); " Either complete the outstanding milestones, or remove them from the work order.", contextualColorName: "warning" }); + /* + // Disable closing work orders with open milestones + bulmaJS.confirm({ + title: "Close Work Order with Outstanding Milestones", + message: + "Are you sure you want to close this work order with outstanding milestones?", + contextualColorName: "danger", + okButton: { + text: "Yes, Close Work Order", + callbackFunction: doClose + } + }); + */ } else { bulmaJS.confirm({ @@ -109,6 +126,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); } + /* + * Related Lots + */ if (!isCreate) { let workOrderLots = exports.workOrderLots; delete exports.workOrderLots; @@ -699,6 +719,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }); } + /* + * Comments + */ let workOrderComments = exports.workOrderComments; delete exports.workOrderComments; const openEditWorkOrderComment = (clickEvent) => { @@ -743,6 +766,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); onshown: (modalElement, closeModalFunction) => { bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); modalElement.querySelector("#workOrderCommentEdit--workOrderComment").focus(); editFormElement = modalElement.querySelector("form"); editFormElement.addEventListener("submit", editComment); @@ -870,6 +894,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); document.querySelector("#workOrderComments--add").addEventListener("click", openAddCommentModal); renderWorkOrderComments(); } + /* + * Milestones + */ if (!isCreate) { workOrderMilestones = exports.workOrderMilestones; delete exports.workOrderMilestones; @@ -1002,6 +1029,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); editCloseModalFunction = closeModalFunction; bulmaJS.toggleHtmlClipped(); los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); modalElement.querySelector("form").addEventListener("submit", doEdit); }, onremoved: () => { @@ -1010,6 +1038,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); }); }; const renderMilestones = () => { + // Clear milestones panel const milestonesPanelElement = document.querySelector("#panel--milestones"); const panelBlockElementsToDelete = milestonesPanelElement.querySelectorAll(".panel-block"); for (const panelBlockToDelete of panelBlockElementsToDelete) { @@ -1139,6 +1168,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); addModalElement = modalElement; addCloseModalFunction = closeModalFunction; los.initializeDatePickers(modalElement); + // los.initializeTimePickers(modalElement); bulmaJS.toggleHtmlClipped(); addFormElement = modalElement.querySelector("form"); addFormElement.addEventListener("submit", doAdd); diff --git a/public-typescript/workOrderMilestoneCalendar.js b/public-typescript/workOrderMilestoneCalendar.js index a34f3dec..b2c25e11 100644 --- a/public-typescript/workOrderMilestoneCalendar.js +++ b/public-typescript/workOrderMilestoneCalendar.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/workOrderOutlook.js b/public-typescript/workOrderOutlook.js index f2ee24f3..9fb12f89 100644 --- a/public-typescript/workOrderOutlook.js +++ b/public-typescript/workOrderOutlook.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public-typescript/workOrderSearch.js b/public-typescript/workOrderSearch.js index c0dfa1ad..a14039ce 100644 --- a/public-typescript/workOrderSearch.js +++ b/public-typescript/workOrderSearch.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable @typescript-eslint/no-non-null-assertion, unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; @@ -185,5 +186,34 @@ Object.defineProperty(exports, "__esModule", { value: true }); formEvent.preventDefault(); resetOffsetAndGetWorkOrders(); }); + /* + const workOrderOpenDateStringElement = document.querySelector("#searchFilter--workOrderOpenDateString") as HTMLInputElement; + + document.querySelector("#button--workOrderOpenDateString-previous").addEventListener("click", () => { + + if (workOrderOpenDateStringElement.value === "") { + workOrderOpenDateStringElement.valueAsDate = new Date(); + } else { + const openDate = workOrderOpenDateStringElement.valueAsDate; + openDate.setDate(openDate.getDate() - 1); + workOrderOpenDateStringElement.valueAsDate = openDate; + } + + resetOffsetAndGetWorkOrders(); + }); + + document.querySelector("#button--workOrderOpenDateString-next").addEventListener("click", () => { + + if (workOrderOpenDateStringElement.value === "") { + workOrderOpenDateStringElement.valueAsDate = new Date(); + } else { + const openDate = workOrderOpenDateStringElement.valueAsDate; + openDate.setDate(openDate.getDate() + 1); + workOrderOpenDateStringElement.valueAsDate = openDate; + } + + resetOffsetAndGetWorkOrders(); + }); + */ getWorkOrders(); })(); diff --git a/public-typescript/workOrderView.js b/public-typescript/workOrderView.js index 5989dcd8..2b3e2a01 100644 --- a/public-typescript/workOrderView.js +++ b/public-typescript/workOrderView.js @@ -1,4 +1,5 @@ "use strict"; +/* eslint-disable unicorn/prefer-module */ Object.defineProperty(exports, "__esModule", { value: true }); (() => { const los = exports.los; diff --git a/public/javascripts/adminFees.min.js b/public/javascripts/adminFees.min.js index d1825c1b..a9539f96 100644 --- a/public/javascripts/adminFees.min.js +++ b/public/javascripts/adminFees.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("#container--feeCategories");let s=exports.feeCategories;delete exports.feeCategories;const o=()=>{if(0!==s.length){t.innerHTML="";for(const e of s){const s=document.createElement("section");if(s.className="panel container--feeCategory",s.dataset.feeCategoryId=e.feeCategoryId.toString(),s.innerHTML='

'+cityssm.escapeHTML(e.feeCategory||"")+'

'+(0===e.fees.length?'
':"")+'
',0===e.fees.length)s.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory||"")+'" category.

');else for(const t of e.fees){const e=document.createElement("div");e.className="panel-block is-block container--fee",e.dataset.feeId=t.feeId.toString(),e.innerHTML='

'+cityssm.escapeHTML(t.feeName||"")+"
"+cityssm.escapeHTML(t.feeDescription||"").replace(/\n/g,"
")+'

'+(t.isRequired?'Required':"")+(t.occupancyTypeId?' '+cityssm.escapeHTML(t.occupancyType||"")+"":"")+(t.lotTypeId?' '+cityssm.escapeHTML(t.lotType||"")+"":"")+'

'+(t.feeFunction?cityssm.escapeHTML(t.feeFunction)+"
Fee Function":"$"+t.feeAmount.toFixed(2)+"
Fee")+'
'+(t.taxPercentage?t.taxPercentage+"%":"$"+t.taxAmount.toFixed(2))+'
Tax
'+(t.includeQuantity?cityssm.escapeHTML(t.quantityUnit||"")+"
Quantity":"")+'
',e.querySelector("a").addEventListener("click",i),e.querySelector(".button--moveFeeUp").addEventListener("click",d),e.querySelector(".button--moveFeeDown").addEventListener("click",u),s.append(e)}0===e.fees.length&&s.querySelector(".button--deleteFeeCategory").addEventListener("click",r),s.querySelector(".button--editFeeCategory").addEventListener("click",a),s.querySelector(".button--addFee").addEventListener("click",l),s.querySelector(".button--moveFeeCategoryUp").addEventListener("click",n),s.querySelector(".button--moveFeeCategoryDown").addEventListener("click",c),t.append(s)}}else t.innerHTML='

There are no available fees.

'};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let t;const a=a=>{a.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doAddFeeCategory",a.currentTarget,e=>{e.success?(s=e.feeCategories,t(),o()):bulmaJS.alert({title:"Error Creating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(e,s)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#feeCategoryAdd--feeCategory").focus(),t=s,e.querySelector("form").addEventListener("submit",a)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const a=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=s.find(e=>e.feeCategoryId===a);let n;const c=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doUpdateFeeCategory",t.currentTarget,e=>{e.success?(s=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},r=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(e.urlPrefix+"/admin/doDeleteFeeCategory",{feeCategoryId:a},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},n=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeCategoryUp",{feeCategoryId:a,moveToTop:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})},c=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeCategoryDown",{feeCategoryId:a,moveToBottom:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})},l=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let r;const n=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doAddFee",t.currentTarget,e=>{e.success?(s=e.feeCategories,r(),o()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const o=t.querySelector("#feeAdd--feeCategoryId");for(const e of s){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===a&&(t.selected=!0),o.append(t)}const r=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,r.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),r=t,e.querySelector("form").addEventListener("submit",n),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},i=t=>{t.preventDefault();const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10),n=Number.parseInt(a.closest(".container--feeCategory").dataset.feeCategoryId),c=s.find(e=>e.feeCategoryId===n).fees.find(e=>e.feeId===r);let l,i;const d=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doUpdateFee",t.currentTarget,e=>{e.success?(s=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage||"",contextualColorName:"danger"})})},u=t=>{t.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(e.urlPrefix+"/admin/doDeleteFee",{feeId:r},e=>{e.success?(s=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},y=()=>{const e=i.querySelector("#feeEdit--feeAmount"),t=i.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},m=()=>{const e=i.querySelector("#feeEdit--taxAmount"),t=i.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{i.querySelector("#feeEdit--quantityUnit").disabled=""===i.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{i=t,t.querySelector("#feeEdit--feeId").value=c.feeId.toString();const o=t.querySelector("#feeEdit--feeCategoryId");for(const e of s){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===n&&(t.selected=!0),o.append(t)}t.querySelector("#feeEdit--feeName").value=c.feeName,t.querySelector("#feeEdit--feeDescription").value=c.feeDescription;const a=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===c.occupancyTypeId&&(t.selected=!0),a.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===c.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=c.feeAmount?c.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",y),y(),t.querySelector("#feeEdit--taxAmount").value=c.taxAmount?c.taxAmount.toFixed(2):"";const l=t.querySelector("#feeEdit--taxPercentage");l.value=c.taxPercentage?c.taxPercentage.toString():"",l.addEventListener("keyup",m),m();const d=t.querySelector("#feeEdit--includeQuantity");c.includeQuantity&&(d.value="1"),d.addEventListener("change",p),t.querySelector("#feeEdit--quantityUnit").value=c.quantityUnit||"",p(),c.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),l=t,e.querySelector("form").addEventListener("submit",d),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",u)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},d=t=>{const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeUp",{feeId:r,moveToTop:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage||"",contextualColorName:"danger"})})},u=t=>{const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeDown",{feeId:r,moveToBottom:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage||"",contextualColorName:"danger"})})};o()})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,t=document.querySelector("#container--feeCategories");let s=exports.feeCategories;delete exports.feeCategories;const o=()=>{if(0!==s.length){t.innerHTML="";for(const e of s){const s=document.createElement("section");if(s.className="panel container--feeCategory",s.dataset.feeCategoryId=e.feeCategoryId.toString(),s.innerHTML='

'+cityssm.escapeHTML(e.feeCategory||"")+'

'+(0===e.fees.length?'
':"")+'
',0===e.fees.length)s.insertAdjacentHTML("beforeend",'

There are no fees in the "'+cityssm.escapeHTML(e.feeCategory||"")+'" category.

');else for(const t of e.fees){const e=document.createElement("div");e.className="panel-block is-block container--fee",e.dataset.feeId=t.feeId.toString();const o=t.isRequired||t.occupancyTypeId||t.lotTypeId;e.innerHTML='

'+cityssm.escapeHTML(t.feeName||"")+"
"+cityssm.escapeHTML(t.feeDescription||"").replace(/\n/g,"
")+"

"+(o?'

'+(t.isRequired?'Required':"")+(t.occupancyTypeId?' '+cityssm.escapeHTML(t.occupancyType||"")+"":"")+(t.lotTypeId?' '+cityssm.escapeHTML(t.lotType||"")+"":"")+"

":"")+'
'+(t.feeFunction?cityssm.escapeHTML(t.feeFunction)+"
Fee Function":"$"+t.feeAmount.toFixed(2)+"
Fee")+'
'+(t.taxPercentage?t.taxPercentage+"%":"$"+t.taxAmount.toFixed(2))+'
Tax
'+(t.includeQuantity?cityssm.escapeHTML(t.quantityUnit||"")+"
Quantity":"")+'
',e.querySelector("a").addEventListener("click",i),e.querySelector(".button--moveFeeUp").addEventListener("click",d),e.querySelector(".button--moveFeeDown").addEventListener("click",u),s.append(e)}0===e.fees.length&&s.querySelector(".button--deleteFeeCategory").addEventListener("click",r),s.querySelector(".button--editFeeCategory").addEventListener("click",a),s.querySelector(".button--addFee").addEventListener("click",l),s.querySelector(".button--moveFeeCategoryUp").addEventListener("click",n),s.querySelector(".button--moveFeeCategoryDown").addEventListener("click",c),t.append(s)}}else t.innerHTML='

There are no available fees.

'};document.querySelector("#button--addFeeCategory").addEventListener("click",()=>{let t;const a=a=>{a.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doAddFeeCategory",a.currentTarget,e=>{e.success?(s=e.feeCategories,t(),o()):bulmaJS.alert({title:"Error Creating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFeeCategory",{onshown:(e,s)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#feeCategoryAdd--feeCategory").focus(),t=s,e.querySelector("form").addEventListener("submit",a)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});const a=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),r=s.find(e=>e.feeCategoryId===a);let n;const c=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doUpdateFeeCategory",t.currentTarget,e=>{e.success?(s=e.feeCategories,n(),o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-editFeeCategory",{onshow:e=>{e.querySelector("#feeCategoryEdit--feeCategoryId").value=r.feeCategoryId.toString(),e.querySelector("#feeCategoryEdit--feeCategory").value=r.feeCategory},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),n=t,e.querySelector("form").addEventListener("submit",c),e.querySelector("#feeCategoryEdit--feeCategory").focus()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},r=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);bulmaJS.confirm({title:"Delete Fee Category?",message:"Are you sure you want to delete this fee category?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee Category",callbackFunction:()=>{cityssm.postJSON(e.urlPrefix+"/admin/doDeleteFeeCategory",{feeCategoryId:a},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Updating Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},n=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeCategoryUp",{feeCategoryId:a,moveToTop:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})},c=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeCategoryDown",{feeCategoryId:a,moveToBottom:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee Category",message:e.errorMessage||"",contextualColorName:"danger"})})},l=t=>{const a=Number.parseInt(t.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10);let r;const n=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doAddFee",t.currentTarget,e=>{e.success?(s=e.feeCategories,r(),o()):bulmaJS.alert({title:"Error Adding Fee",message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("adminFees-addFee",{onshow:t=>{const o=t.querySelector("#feeAdd--feeCategoryId");for(const e of s){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===a&&(t.selected=!0),o.append(t)}const r=t.querySelector("#feeAdd--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,r.append(t)}const n=t.querySelector("#feeAdd--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,n.append(t)}t.querySelector("#feeAdd--taxPercentage").value=exports.taxPercentageDefault.toString(),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),r=t,e.querySelector("form").addEventListener("submit",n),e.querySelector("#feeAdd--feeName").focus(),e.querySelector("#feeAdd--feeFunction").addEventListener("change",()=>{const t=e.querySelector("#feeAdd--feeAmount"),s=e.querySelector("#feeAdd--feeFunction");""===s.value?(s.closest(".select").classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.closest(".select").classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--taxPercentage").addEventListener("keyup",()=>{const t=e.querySelector("#feeAdd--taxAmount"),s=e.querySelector("#feeAdd--taxPercentage");""===s.value?(s.classList.remove("is-success"),t.classList.add("is-success"),t.disabled=!1):(s.classList.add("is-success"),t.classList.remove("is-success"),t.disabled=!0)}),e.querySelector("#feeAdd--includeQuantity").addEventListener("change",()=>{e.querySelector("#feeAdd--quantityUnit").disabled=""===e.querySelector("#feeAdd--includeQuantity").value})},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},i=t=>{t.preventDefault();const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10),n=Number.parseInt(a.closest(".container--feeCategory").dataset.feeCategoryId),c=s.find(e=>e.feeCategoryId===n).fees.find(e=>e.feeId===r);let l,i;const d=t=>{t.preventDefault(),cityssm.postJSON(e.urlPrefix+"/admin/doUpdateFee",t.currentTarget,e=>{e.success?(s=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Updating Fee",message:e.errorMessage||"",contextualColorName:"danger"})})},u=t=>{t.preventDefault();bulmaJS.confirm({title:"Delete Fee?",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete the Fee",callbackFunction:()=>{cityssm.postJSON(e.urlPrefix+"/admin/doDeleteFee",{feeId:r},e=>{e.success?(s=e.feeCategories,l(),o()):bulmaJS.alert({title:"Error Deleting Fee",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},y=()=>{const e=i.querySelector("#feeEdit--feeAmount"),t=i.querySelector("#feeEdit--feeFunction");""===t.value?(t.closest(".select").classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.closest(".select").classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},m=()=>{const e=i.querySelector("#feeEdit--taxAmount"),t=i.querySelector("#feeEdit--taxPercentage");""===t.value?(t.classList.remove("is-success"),e.classList.add("is-success"),e.disabled=!1):(t.classList.add("is-success"),e.classList.remove("is-success"),e.disabled=!0)},p=()=>{i.querySelector("#feeEdit--quantityUnit").disabled=""===i.querySelector("#feeEdit--includeQuantity").value};cityssm.openHtmlModal("adminFees-editFee",{onshow:t=>{i=t,t.querySelector("#feeEdit--feeId").value=c.feeId.toString();const o=t.querySelector("#feeEdit--feeCategoryId");for(const e of s){const t=document.createElement("option");t.value=e.feeCategoryId.toString(),t.textContent=e.feeCategory,e.feeCategoryId===n&&(t.selected=!0),o.append(t)}t.querySelector("#feeEdit--feeName").value=c.feeName,t.querySelector("#feeEdit--feeDescription").value=c.feeDescription;const a=t.querySelector("#feeEdit--occupancyTypeId");for(const e of exports.occupancyTypes){const t=document.createElement("option");t.value=e.occupancyTypeId.toString(),t.textContent=e.occupancyType,e.occupancyTypeId===c.occupancyTypeId&&(t.selected=!0),a.append(t)}const r=t.querySelector("#feeEdit--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,e.lotTypeId===c.lotTypeId&&(t.selected=!0),r.append(t)}t.querySelector("#feeEdit--feeAmount").value=c.feeAmount?c.feeAmount.toFixed(2):"",t.querySelector("#feeEdit--feeFunction").addEventListener("change",y),y(),t.querySelector("#feeEdit--taxAmount").value=c.taxAmount?c.taxAmount.toFixed(2):"";const l=t.querySelector("#feeEdit--taxPercentage");l.value=c.taxPercentage?c.taxPercentage.toString():"",l.addEventListener("keyup",m),m();const d=t.querySelector("#feeEdit--includeQuantity");c.includeQuantity&&(d.value="1"),d.addEventListener("change",p),t.querySelector("#feeEdit--quantityUnit").value=c.quantityUnit||"",p(),c.isRequired&&(t.querySelector("#feeEdit--isRequired").value="1"),e.populateAliases(t)},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),l=t,e.querySelector("form").addEventListener("submit",d),bulmaJS.init(e),e.querySelector(".button--deleteFee").addEventListener("click",u)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},d=t=>{const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeUp",{feeId:r,moveToTop:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage||"",contextualColorName:"danger"})})},u=t=>{const a=t.currentTarget.closest(".container--fee"),r=Number.parseInt(a.dataset.feeId,10);cityssm.postJSON(e.urlPrefix+"/admin/doMoveFeeDown",{feeId:r,moveToBottom:t.shiftKey?"1":"0"},e=>{e.success?(s=e.feeCategories,o()):bulmaJS.alert({title:"Error Moving Fee",message:e.errorMessage||"",contextualColorName:"danger"})})};o()})(); \ No newline at end of file diff --git a/public/javascripts/lotOccupancyEdit.min.js b/public/javascripts/lotOccupancyEdit.min.js index 1795efa5..b8c58b4e 100644 --- a/public/javascripts/lotOccupancyEdit.min.js +++ b/public/javascripts/lotOccupancyEdit.min.js @@ -1 +1 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{var e,t,c;const a=exports.los,o=document.querySelector("#lotOccupancy--lotOccupancyId").value,n=""===o;let s=!1,l=n;const r=()=>{s||(s=!0,cityssm.enableNavBlocker())},i=document.querySelector("#form--lotOccupancy");i.addEventListener("submit",e=>{e.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/"+(n?"doCreateLotOccupancy":"doUpdateLotOccupancy"),i,e=>{e.success?(s=!1,cityssm.disableNavBlocker(),n||l?window.location.href=a.urlPrefix+"/lotOccupancies/"+e.lotOccupancyId+"/edit?t="+Date.now():bulmaJS.alert({message:exports.aliases.occupancy+" Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Saving "+exports.aliases.occupancy,message:e.errorMessage||"",contextualColorName:"danger"})})});const u=i.querySelectorAll("input, select");for(const e of u)e.addEventListener("change",r);if(!n){const n=()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doCopyLotOccupancy",{lotOccupancyId:o},e=>{var t;e.success?(cityssm.disableNavBlocker(),window.location.href=a.urlPrefix+"/lotOccupancies/"+(null===(t=e.lotOccupancyId)||void 0===t?void 0:t.toString())+"/edit"):bulmaJS.alert({title:"Error Copying Record",message:e.errorMessage||"",contextualColorName:"danger"})})};null===(e=document.querySelector("#button--copyLotOccupancy"))||void 0===e||e.addEventListener("click",e=>{e.preventDefault(),s?bulmaJS.alert({title:"Unsaved Changes",message:"Please save all unsaved changes before continuing.",contextualColorName:"warning"}):bulmaJS.confirm({title:"Copy "+exports.aliases.occupancy+" Record as New",message:"Are you sure you want to copy this record to a new record?",contextualColorName:"info",okButton:{text:"Yes, Copy",callbackFunction:n}})}),null===(t=document.querySelector("#button--deleteLotOccupancy"))||void 0===t||t.addEventListener("click",e=>{e.preventDefault();bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Record",message:"Are you sure you want to delete this record?",contextualColorName:"warning",okButton:{text:"Yes, Delete",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancy",{lotOccupancyId:o},e=>{e.success?(cityssm.disableNavBlocker(),window.location.href=a.urlPrefix+"/lotOccupancies?t="+Date.now()):bulmaJS.alert({title:"Error Deleting Record",message:e.errorMessage||"",contextualColorName:"danger"})})}}})}),null===(c=document.querySelector("#button--createWorkOrder"))||void 0===c||c.addEventListener("click",e=>{let t;e.preventDefault();const c=e=>{e.preventDefault(),cityssm.postJSON(a.urlPrefix+"/workOrders/doCreateWorkOrder",e.currentTarget,e=>{e.success?(t(),bulmaJS.confirm({title:"Work Order Created Successfully",message:"Would you like to open the work order now?",contextualColorName:"success",okButton:{text:"Yes, Open the Work Order",callbackFunction:()=>{window.location.href=a.urlPrefix+"/workOrders/"+e.workOrderId+"/edit"}}})):bulmaJS.alert({title:"Error Creating Work Order",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-createWorkOrder",{onshow:e=>{e.querySelector("#workOrderCreate--lotOccupancyId").value=o,e.querySelector("#workOrderCreate--workOrderOpenDateString").value=cityssm.dateToString(new Date);const t=e.querySelector("#workOrderCreate--workOrderTypeId"),c=exports.workOrderTypes;1===c.length&&(t.innerHTML="");for(const e of c){const c=document.createElement("option");c.value=e.workOrderTypeId.toString(),c.textContent=e.workOrderType,t.append(c)}},onshown:(e,a)=>{var o;t=a,null===(o=e.querySelector("form"))||void 0===o||o.addEventListener("submit",c)}})})}const d=document.querySelector("#lotOccupancy--occupancyTypeId");if(n){const e=document.querySelector("#container--lotOccupancyFields");d.addEventListener("change",()=>{""!==d.value?cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doGetOccupancyTypeFields",{occupancyTypeId:d.value},t=>{if(0===t.occupancyTypeFields.length)return void(e.innerHTML='

There are no additional fields for this '+exports.aliases.occupancy.toLowerCase()+" type.

");e.innerHTML="";let c="";for(const a of t.occupancyTypeFields){c+=","+a.occupancyTypeFieldId;const t="lotOccupancyFieldValue_"+a.occupancyTypeFieldId,o="lotOccupancy--"+t,n=document.createElement("div");if(n.className="field",n.innerHTML='
',n.querySelector("label").textContent=a.occupancyTypeField,""===a.occupancyTypeFieldValues){const e=document.createElement("input");e.className="input",e.id=o,e.name=t,e.type="text",e.required=a.isRequired,e.minLength=a.minimumLength,e.maxLength=a.maximumLength,a.pattern&&""!==a.pattern&&(e.pattern=a.pattern),n.querySelector(".control").append(e)}else{n.querySelector(".control").innerHTML='
';const e=n.querySelector("select");e.required=a.isRequired;const c=a.occupancyTypeFieldValues.split("\n");for(const t of c){const c=document.createElement("option");c.value=t,c.textContent=t,e.append(c)}}e.append(n)}e.insertAdjacentHTML("beforeend",'')}):e.innerHTML='

Select the '+exports.aliases.occupancy.toLowerCase()+" type to load the available fields.

"})}else{const e=d.value;d.addEventListener("change",()=>{d.value!==e&&bulmaJS.confirm({title:"Confirm Change",message:"Are you sure you want to change the "+exports.aliases.occupancy.toLowerCase()+" type?\nThis change affects the additional fields associated with this record, and may also affect the available fees.",contextualColorName:"warning",okButton:{text:"Yes, Keep the Change",callbackFunction:()=>{l=!0}},cancelButton:{text:"Revert the Change",callbackFunction:()=>{d.value=e}}})})}const p=document.querySelector("#lotOccupancy--lotName");if(p.addEventListener("click",e=>{const t=e.currentTarget.value;let c,o,n,s;const l=(e,t)=>{document.querySelector("#lotOccupancy--lotId").value=e.toString(),document.querySelector("#lotOccupancy--lotName").value=t,r(),c()},i=e=>{e.preventDefault();const t=e.currentTarget;l(t.dataset.lotId,t.dataset.lotName)},u=()=>{s.innerHTML='


Searching...

',cityssm.postJSON(a.urlPrefix+"/lots/doSearchLots",n,e=>{if(0===e.count)return void(s.innerHTML='

No results.

');const t=document.createElement("div");t.className="panel";for(const c of e.lots){const e=document.createElement("a");e.className="panel-block is-block",e.href="#",e.dataset.lotId=c.lotId.toString(),e.dataset.lotName=c.lotName,e.innerHTML='
'+cityssm.escapeHTML(c.lotName||"")+'
'+cityssm.escapeHTML(c.mapName||"")+'
'+cityssm.escapeHTML(c.lotStatus)+'
'+(c.lotOccupancyCount>0?"Currently Occupied":"")+"
",e.addEventListener("click",i),t.append(e)}s.innerHTML="",s.append(t)})},d=e=>{e.preventDefault();const t=o.querySelector("#lotCreate--lotName").value;cityssm.postJSON(a.urlPrefix+"/lots/doCreateLot",e.currentTarget,e=>{e.success?l(e.lotId,t):bulmaJS.alert({title:"Error Creating "+exports.aliases.lot,message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-selectLot",{onshow:e=>{a.populateAliases(e)},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),o=e,c=a,bulmaJS.init(e);const l=e.querySelector("#lotSelect--lotName");""!==document.querySelector("#lotOccupancy--lotId").value&&(l.value=t),l.focus(),l.addEventListener("change",u);const r=e.querySelector("#lotSelect--occupancyStatus");if(r.addEventListener("change",u),""!==t&&(r.value=""),n=e.querySelector("#form--lotSelect"),s=e.querySelector("#resultsContainer--lotSelect"),n.addEventListener("submit",e=>{e.preventDefault()}),u(),exports.lotNamePattern){const t=exports.lotNamePattern;e.querySelector("#lotCreate--lotName").pattern=t.source}const i=e.querySelector("#lotCreate--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,i.append(t)}const p=e.querySelector("#lotCreate--lotStatusId");for(const e of exports.lotStatuses){const t=document.createElement("option");t.value=e.lotStatusId.toString(),t.textContent=e.lotStatus,p.append(t)}const m=e.querySelector("#lotCreate--mapId");for(const e of exports.maps){const t=document.createElement("option");t.value=e.mapId.toString(),t.textContent=e.mapName||"(No Name)",m.append(t)}e.querySelector("#form--lotCreate").addEventListener("submit",d)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),document.querySelector(".is-lot-view-button").addEventListener("click",()=>{const e=document.querySelector("#lotOccupancy--lotId").value;e?window.open(a.urlPrefix+"/lots/"+e):bulmaJS.alert({message:"No "+exports.aliases.lot.toLowerCase()+" selected.",contextualColorName:"info"})}),document.querySelector(".is-clear-lot-button").addEventListener("click",()=>{p.disabled?bulmaJS.alert({message:"You need to unlock the field before clearing it.",contextualColorName:"info"}):(p.value="(No "+exports.aliases.lot+")",document.querySelector("#lotOccupancy--lotId").value="",r())}),a.initializeDatePickers(i),document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change",()=>{const e=document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;e.min=document.querySelector("#lotOccupancy--occupancyStartDateString").value,e.refresh()}),a.initializeUnlockFieldButtons(i),n){const e=document.querySelector("#lotOccupancy--lotOccupantTypeId");e.addEventListener("change",()=>{const t=i.querySelectorAll("[data-table='LotOccupancyOccupant']");for(const c of t)c.disabled=""===e.value})}else{let e=exports.lotOccupancyOccupants;delete exports.lotOccupancyOccupants;const t=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupantIndex,10),s=e.find(e=>e.lotOccupantIndex===c);let l,r;const i=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doUpdateLotOccupancyOccupant",l,t=>{t.success?(e=t.lotOccupancyOccupants,r(),n()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupant,message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editOccupant",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value=o,e.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value=c.toString();const t=e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");let n=!1;for(const e of exports.lotOccupantTypes){const c=document.createElement("option");c.value=e.lotOccupantTypeId.toString(),c.textContent=e.lotOccupantType,e.lotOccupantTypeId===s.lotOccupantTypeId&&(c.selected=!0,n=!0),t.append(c)}if(!n){const e=document.createElement("option");e.value=s.lotOccupantTypeId.toString(),e.textContent=s.lotOccupantType,e.selected=!0,t.append(e)}e.querySelector("#lotOccupancyOccupantEdit--occupantName").value=s.occupantName,e.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value=s.occupantAddress1,e.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value=s.occupantAddress2,e.querySelector("#lotOccupancyOccupantEdit--occupantCity").value=s.occupantCity,e.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value=s.occupantProvince,e.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value=s.occupantPostalCode,e.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value=s.occupantPhoneNumber,e.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value=s.occupantEmailAddress,e.querySelector("#lotOccupancyOccupantEdit--occupantComment").value=s.occupantComment},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(),(l=e.querySelector("form")).addEventListener("submit",i),r=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},c=t=>{const c=t.currentTarget.closest("tr").dataset.lotOccupantIndex;bulmaJS.confirm({title:"Remove "+exports.aliases.occupant+"?",message:"Are you sure you want to remove this "+exports.aliases.occupant.toLowerCase()+"?",okButton:{text:"Yes, Remove "+exports.aliases.occupant,callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyOccupant",{lotOccupancyId:o,lotOccupantIndex:c},t=>{t.success?(e=t.lotOccupancyOccupants,n()):bulmaJS.alert({title:"Error Removing "+exports.aliases.occupant,message:t.errorMessage||"",contextualColorName:"danger"})})}},contextualColorName:"warning"})},n=()=>{const a=document.querySelector("#container--lotOccupancyOccupants");if(cityssm.clearElement(a),0===e.length)return void(a.innerHTML='

There are no '+exports.aliases.occupants.toLowerCase()+" associated with this record.

");const o=document.createElement("table");o.className="table is-fullwidth is-striped is-hoverable",o.innerHTML=""+exports.aliases.occupant+'AddressOther ContactCommentOptions';for(const a of e){const e=document.createElement("tr");e.dataset.lotOccupantIndex=a.lotOccupantIndex.toString(),e.innerHTML=""+cityssm.escapeHTML(a.occupantName||"(No Name)")+'
'+cityssm.escapeHTML(a.lotOccupantType)+""+(a.occupantAddress1?cityssm.escapeHTML(a.occupantAddress1)+"
":"")+(a.occupantAddress2?cityssm.escapeHTML(a.occupantAddress2)+"
":"")+(a.occupantCity?cityssm.escapeHTML(a.occupantCity)+", ":"")+cityssm.escapeHTML(a.occupantProvince||"")+"
"+cityssm.escapeHTML(a.occupantPostalCode||"")+""+(a.occupantPhoneNumber?cityssm.escapeHTML(a.occupantPhoneNumber)+"
":"")+(a.occupantEmailAddress?cityssm.escapeHTML(a.occupantEmailAddress):"")+""+cityssm.escapeHTML(a.occupantComment)+'
',e.querySelector(".button--edit").addEventListener("click",t),e.querySelector(".button--delete").addEventListener("click",c),o.querySelector("tbody").append(e)}a.append(o)};document.querySelector("#button--addOccupant").addEventListener("click",()=>{let t,c,s,l;const r=c=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyOccupant",c,c=>{c.success?(e=c.lotOccupancyOccupants,t(),n()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupant,message:c.errorMessage||"",contextualColorName:"danger"})})},i=e=>{e.preventDefault(),r(c)};let u=[];const d=e=>{e.preventDefault();const t=e.currentTarget,c=u[Number.parseInt(t.dataset.index,10)],a=t.closest(".modal").querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value;""===a?bulmaJS.alert({title:"No "+exports.aliases.occupant+" Type Selected",message:"Select a type to apply to the newly added "+exports.aliases.occupant.toLowerCase()+".",contextualColorName:"warning"}):(c.lotOccupantTypeId=Number.parseInt(a,10),c.lotOccupancyId=Number.parseInt(o,10),r(c))},p=e=>{e.preventDefault(),""!==s.querySelector("#lotOccupancyOccupantCopy--searchFilter").value?(l.innerHTML='

Searching...
',cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doSearchPastOccupants",s,e=>{u=e.occupants;const t=document.createElement("div");t.className="panel";for(const[e,c]of u.entries()){const a=document.createElement("a");a.className="panel-block is-block",a.dataset.index=e.toString(),a.innerHTML=""+cityssm.escapeHTML(c.occupantName||"")+'
'+cityssm.escapeHTML(c.occupantAddress1||"")+"
"+(c.occupantAddress2?cityssm.escapeHTML(c.occupantAddress2)+"
":"")+cityssm.escapeHTML(c.occupantCity||"")+", "+cityssm.escapeHTML(c.occupantProvince||"")+"
"+cityssm.escapeHTML(c.occupantPostalCode||"")+'
'+(c.occupantPhoneNumber?cityssm.escapeHTML(c.occupantPhoneNumber)+"
":"")+cityssm.escapeHTML(c.occupantEmailAddress||"")+"
",a.addEventListener("click",d),t.append(a)}l.innerHTML="",l.append(t)})):l.innerHTML='

Enter a partial name or address in the search field above.

'};cityssm.openHtmlModal("lotOccupancy-addOccupant",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value=o;const t=e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"),c=e.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId");for(const e of exports.lotOccupantTypes){const a=document.createElement("option");a.value=e.lotOccupantTypeId.toString(),a.textContent=e.lotOccupantType,t.append(a),c.append(a.cloneNode(!0))}e.querySelector("#lotOccupancyOccupantAdd--occupantCity").value=exports.occupantCityDefault,e.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value=exports.occupantProvinceDefault},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),bulmaJS.init(e),e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(),(c=e.querySelector("#form--lotOccupancyOccupantAdd")).addEventListener("submit",i),l=e.querySelector("#lotOccupancyOccupantCopy--searchResults"),(s=e.querySelector("#form--lotOccupancyOccupantCopy")).addEventListener("submit",e=>{e.preventDefault()}),e.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change",p),t=a},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),n()}if(!n){let e=exports.lotOccupancyComments;delete exports.lotOccupancyComments;const t=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10),s=e.find(e=>e.lotOccupancyCommentId===c);let l,r;const i=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doUpdateLotOccupancyComment",l,t=>{t.success?(e=t.lotOccupancyComments,r(),n()):bulmaJS.alert({title:"Error Updating Comment",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editComment",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value=o,e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value=c.toString(),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value=s.lotOccupancyComment;const t=e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");t.value=s.lotOccupancyCommentDateString;const n=cityssm.dateToString(new Date);t.max=s.lotOccupancyCommentDateString<=n?n:s.lotOccupancyCommentDateString,e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value=s.lotOccupancyCommentTimeString},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),a.initializeDatePickers(e),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(),(l=e.querySelector("form")).addEventListener("submit",i),r=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},c=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10);bulmaJS.confirm({title:"Remove Comment?",message:"Are you sure you want to remove this comment?",okButton:{text:"Yes, Remove Comment",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyComment",{lotOccupancyId:o,lotOccupancyCommentId:c},t=>{t.success?(e=t.lotOccupancyComments,n()):bulmaJS.alert({title:"Error Removing Comment",message:t.errorMessage||"",contextualColorName:"danger"})})}},contextualColorName:"warning"})},n=()=>{const a=document.querySelector("#container--lotOccupancyComments");if(0===e.length)return void(a.innerHTML='

There are no comments associated with this record.

');const o=document.createElement("table");o.className="table is-fullwidth is-striped is-hoverable",o.innerHTML='CommentorComment DateCommentOptions';for(const a of e){const e=document.createElement("tr");e.dataset.lotOccupancyCommentId=a.lotOccupancyCommentId.toString(),e.innerHTML=""+cityssm.escapeHTML(a.recordCreate_userName||"")+""+a.lotOccupancyCommentDateString+(0===a.lotOccupancyCommentTime?"":" "+a.lotOccupancyCommentTimeString)+""+cityssm.escapeHTML(a.lotOccupancyComment||"")+'
',e.querySelector(".button--edit").addEventListener("click",t),e.querySelector(".button--delete").addEventListener("click",c),o.querySelector("tbody").append(e)}a.innerHTML="",a.append(o)};document.querySelector("#button--addComment").addEventListener("click",()=>{let t,c;const s=o=>{o.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyComment",t,t=>{t.success?(e=t.lotOccupancyComments,c(),n()):bulmaJS.alert({title:"Error Adding Comment",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addComment",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value=o},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(),(t=e.querySelector("form")).addEventListener("submit",s),c=a},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),n()}if(!n){let e=exports.lotOccupancyFees;delete exports.lotOccupancyFees;const t=document.querySelector("#container--lotOccupancyFees"),c=()=>{let t=0;for(const c of e)t+=(c.feeAmount+c.taxAmount)*c.quantity;return t},n=t=>{const c=t.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;bulmaJS.confirm({title:"Delete Fee",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete Fee",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyFee",{lotOccupancyId:o,feeId:c},t=>{t.success?(e=t.lotOccupancyFees,l()):bulmaJS.alert({title:"Error Deleting Fee",message:t.errorMessage||"",contextualColorName:"danger"})})}}})},l=()=>{if(0===e.length)return t.innerHTML='

There are no fees associated with this record.

',void p();t.innerHTML='
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
';let c=0,a=0;for(const o of e){const e=document.createElement("tr");e.className="container--lotOccupancyFee",e.dataset.feeId=o.feeId.toString(),e.dataset.includeQuantity=o.includeQuantity?"1":"0",e.innerHTML=''+cityssm.escapeHTML(o.feeName||"")+""+(1===o.quantity?"":'$'+o.feeAmount.toFixed(2)+'×'+o.quantity+"=")+'$'+(o.feeAmount*o.quantity).toFixed(2)+'',e.querySelector("button").addEventListener("click",n),t.querySelector("tbody").append(e),c+=o.feeAmount*o.quantity,a+=o.taxAmount*o.quantity}t.querySelector("#lotOccupancyFees--feeAmountTotal").textContent="$"+c.toFixed(2),t.querySelector("#lotOccupancyFees--taxAmountTotal").textContent="$"+a.toFixed(2),t.querySelector("#lotOccupancyFees--grandTotal").textContent="$"+(c+a).toFixed(2),p()};document.querySelector("#button--addFee").addEventListener("click",()=>{if(s)return void bulmaJS.alert({message:"Please save all unsaved changes before adding fees.",contextualColorName:"warning"});let c,n,r;const i=(t,c=1)=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyFee",{lotOccupancyId:o,feeId:t,quantity:c},t=>{t.success?(e=t.lotOccupancyFees,l(),d()):bulmaJS.alert({title:"Error Adding Fee",message:t.errorMessage||"",contextualColorName:"danger"})})},u=e=>{e.preventDefault();const t=Number.parseInt(e.currentTarget.dataset.feeId,10),a=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),o=c.find(e=>e.feeCategoryId===a).fees.find(e=>e.feeId===t);o.includeQuantity?(e=>{let t,c;const a=a=>{a.preventDefault(),i(e.feeId,t.value),c()};cityssm.openHtmlModal("lotOccupancy-setFeeQuantity",{onshow:t=>{t.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent=e.quantityUnit},onshown:(e,o)=>{c=o,t=e.querySelector("#lotOccupancyFeeQuantity--quantity"),e.querySelector("form").addEventListener("submit",a)}})})(o):i(t)},d=()=>{const e=n.value.trim().toLowerCase().split(" ");r.innerHTML="";for(const a of c){const c=document.createElement("div");c.className="container--feeCategory",c.dataset.feeCategoryId=a.feeCategoryId.toString(),c.innerHTML='

'+cityssm.escapeHTML(a.feeCategory||"")+'

';let o=!1;for(const n of a.fees){if(t.querySelector(".container--lotOccupancyFee[data-fee-id='"+n.feeId+"'][data-include-quantity='0']"))continue;let a=!0;for(const t of e)if(!n.feeName.toLowerCase().includes(t)){a=!1;break}if(!a)continue;o=!0;const s=document.createElement("a");s.className="panel-block is-block container--fee",s.dataset.feeId=n.feeId.toString(),s.href="#",s.innerHTML=""+cityssm.escapeHTML(n.feeName||"")+"
"+cityssm.escapeHTML(n.feeDescription||"").replace(/\n/g,"
")+"
",s.addEventListener("click",u),c.querySelector(".panel").append(s)}o&&r.append(c)}};cityssm.openHtmlModal("lotOccupancy-addFee",{onshow:e=>{n=e.querySelector("#feeSelect--feeName"),r=e.querySelector("#resultsContainer--feeSelect"),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doGetFees",{lotOccupancyId:o},e=>{c=e.feeCategories,n.disabled=!1,n.addEventListener("keyup",d),n.focus(),d()})},onshown:()=>{bulmaJS.toggleHtmlClipped()},onhidden:()=>{l()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});let r=exports.lotOccupancyTransactions;delete exports.lotOccupancyTransactions;const i=document.querySelector("#container--lotOccupancyTransactions"),u=()=>{let e=0;for(const t of r)e+=t.transactionAmount;return e},d=e=>{const t=e.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;bulmaJS.confirm({title:"Delete Trasnaction",message:"Are you sure you want to delete this transaction?",contextualColorName:"warning",okButton:{text:"Yes, Delete Transaction",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyTransaction",{lotOccupancyId:o,transactionIndex:t},e=>{e.success?(r=e.lotOccupancyTransactions,p()):bulmaJS.alert({title:"Error Deleting Transaction",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},p=()=>{if(0===r.length)return void(i.innerHTML='

There are no transactions associated with this record.

');i.innerHTML='
Date'+cityssm.escapeHTML(exports.aliases.externalReceiptNumber)+'AmountOptions
Transaction Total
';let t=0;for(const e of r){t+=e.transactionAmount;const c=document.createElement("tr");c.className="container--lotOccupancyTransaction",c.dataset.transactionIndex=e.transactionIndex.toString(),c.innerHTML=""+e.transactionDateString+""+cityssm.escapeHTML(e.externalReceiptNumber||"")+"
"+cityssm.escapeHTML(e.transactionNote||"")+'$'+e.transactionAmount.toFixed(2)+'',c.querySelector("button").addEventListener("click",d),i.querySelector("tbody").append(c)}i.querySelector("#lotOccupancyTransactions--grandTotal").textContent="$"+t.toFixed(2);const a=c();a>t&&i.insertAdjacentHTML("afterbegin",'
Outstanding Balance
$'+(a-t).toFixed(2)+"
")};document.querySelector("#button--addTransaction").addEventListener("click",()=>{let e;const t=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyTransaction",t.currentTarget,t=>{t.success?(r=t.lotOccupancyTransactions,e(),p()):bulmaJS.confirm({title:"Error Adding Transaction",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addTransaction",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value=o.toString();const t=c(),n=u(),s=e.querySelector("#lotOccupancyTransactionAdd--transactionAmount");s.min=(-1*n).toFixed(2),s.max=Math.max(t-n,0).toFixed(2),s.value=Math.max(t-n,0).toFixed(2)},onshown:(c,a)=>{bulmaJS.toggleHtmlClipped(),e=a,c.querySelector("form").addEventListener("submit",t)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),l()}})(); \ No newline at end of file +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{var e,t,c;const a=exports.los,o=document.querySelector("#lotOccupancy--lotOccupancyId").value,n=""===o;let s=!1,l=n;const r=()=>{s||(s=!0,cityssm.enableNavBlocker())},i=document.querySelector("#form--lotOccupancy");i.addEventListener("submit",e=>{e.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/"+(n?"doCreateLotOccupancy":"doUpdateLotOccupancy"),i,e=>{e.success?(s=!1,cityssm.disableNavBlocker(),n||l?window.location.href=a.urlPrefix+"/lotOccupancies/"+e.lotOccupancyId+"/edit?t="+Date.now():bulmaJS.alert({message:exports.aliases.occupancy+" Updated Successfully",contextualColorName:"success"})):bulmaJS.alert({title:"Error Saving "+exports.aliases.occupancy,message:e.errorMessage||"",contextualColorName:"danger"})})});const u=i.querySelectorAll("input, select");for(const e of u)e.addEventListener("change",r);if(!n){const n=()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doCopyLotOccupancy",{lotOccupancyId:o},e=>{var t;e.success?(cityssm.disableNavBlocker(),window.location.href=a.urlPrefix+"/lotOccupancies/"+(null===(t=e.lotOccupancyId)||void 0===t?void 0:t.toString())+"/edit"):bulmaJS.alert({title:"Error Copying Record",message:e.errorMessage||"",contextualColorName:"danger"})})};null===(e=document.querySelector("#button--copyLotOccupancy"))||void 0===e||e.addEventListener("click",e=>{e.preventDefault(),s?bulmaJS.alert({title:"Unsaved Changes",message:"Please save all unsaved changes before continuing.",contextualColorName:"warning"}):bulmaJS.confirm({title:"Copy "+exports.aliases.occupancy+" Record as New",message:"Are you sure you want to copy this record to a new record?",contextualColorName:"info",okButton:{text:"Yes, Copy",callbackFunction:n}})}),null===(t=document.querySelector("#button--deleteLotOccupancy"))||void 0===t||t.addEventListener("click",e=>{e.preventDefault();bulmaJS.confirm({title:"Delete "+exports.aliases.occupancy+" Record",message:"Are you sure you want to delete this record?",contextualColorName:"warning",okButton:{text:"Yes, Delete",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancy",{lotOccupancyId:o},e=>{e.success?(cityssm.disableNavBlocker(),window.location.href=a.urlPrefix+"/lotOccupancies?t="+Date.now()):bulmaJS.alert({title:"Error Deleting Record",message:e.errorMessage||"",contextualColorName:"danger"})})}}})}),null===(c=document.querySelector("#button--createWorkOrder"))||void 0===c||c.addEventListener("click",e=>{let t;e.preventDefault();const c=e=>{e.preventDefault(),cityssm.postJSON(a.urlPrefix+"/workOrders/doCreateWorkOrder",e.currentTarget,e=>{e.success?(t(),bulmaJS.confirm({title:"Work Order Created Successfully",message:"Would you like to open the work order now?",contextualColorName:"success",okButton:{text:"Yes, Open the Work Order",callbackFunction:()=>{window.location.href=a.urlPrefix+"/workOrders/"+e.workOrderId+"/edit"}}})):bulmaJS.alert({title:"Error Creating Work Order",message:e.errorMessage,contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-createWorkOrder",{onshow:e=>{e.querySelector("#workOrderCreate--lotOccupancyId").value=o,e.querySelector("#workOrderCreate--workOrderOpenDateString").value=cityssm.dateToString(new Date);const t=e.querySelector("#workOrderCreate--workOrderTypeId"),c=exports.workOrderTypes;1===c.length&&(t.innerHTML="");for(const e of c){const c=document.createElement("option");c.value=e.workOrderTypeId.toString(),c.textContent=e.workOrderType,t.append(c)}},onshown:(e,a)=>{var o;t=a,null===(o=e.querySelector("form"))||void 0===o||o.addEventListener("submit",c)}})})}const d=document.querySelector("#lotOccupancy--occupancyTypeId");if(n){const e=document.querySelector("#container--lotOccupancyFields");d.addEventListener("change",()=>{""!==d.value?cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doGetOccupancyTypeFields",{occupancyTypeId:d.value},t=>{if(0===t.occupancyTypeFields.length)return void(e.innerHTML='

There are no additional fields for this '+exports.aliases.occupancy.toLowerCase()+" type.

");e.innerHTML="";let c="";for(const a of t.occupancyTypeFields){c+=","+a.occupancyTypeFieldId;const t="lotOccupancyFieldValue_"+a.occupancyTypeFieldId,o="lotOccupancy--"+t,n=document.createElement("div");if(n.className="field",n.innerHTML='
',n.querySelector("label").textContent=a.occupancyTypeField,""===a.occupancyTypeFieldValues){const e=document.createElement("input");e.className="input",e.id=o,e.name=t,e.type="text",e.required=a.isRequired,e.minLength=a.minimumLength,e.maxLength=a.maximumLength,a.pattern&&""!==a.pattern&&(e.pattern=a.pattern),n.querySelector(".control").append(e)}else{n.querySelector(".control").innerHTML='
';const e=n.querySelector("select");e.required=a.isRequired;const c=a.occupancyTypeFieldValues.split("\n");for(const t of c){const c=document.createElement("option");c.value=t,c.textContent=t,e.append(c)}}e.append(n)}e.insertAdjacentHTML("beforeend",'')}):e.innerHTML='

Select the '+exports.aliases.occupancy.toLowerCase()+" type to load the available fields.

"})}else{const e=d.value;d.addEventListener("change",()=>{d.value!==e&&bulmaJS.confirm({title:"Confirm Change",message:"Are you sure you want to change the "+exports.aliases.occupancy.toLowerCase()+" type?\nThis change affects the additional fields associated with this record, and may also affect the available fees.",contextualColorName:"warning",okButton:{text:"Yes, Keep the Change",callbackFunction:()=>{l=!0}},cancelButton:{text:"Revert the Change",callbackFunction:()=>{d.value=e}}})})}const p=document.querySelector("#lotOccupancy--lotName");if(p.addEventListener("click",e=>{const t=e.currentTarget.value;let c,o,n,s;const l=(e,t)=>{document.querySelector("#lotOccupancy--lotId").value=e.toString(),document.querySelector("#lotOccupancy--lotName").value=t,r(),c()},i=e=>{e.preventDefault();const t=e.currentTarget;l(t.dataset.lotId,t.dataset.lotName)},u=()=>{s.innerHTML='


Searching...

',cityssm.postJSON(a.urlPrefix+"/lots/doSearchLots",n,e=>{if(0===e.count)return void(s.innerHTML='

No results.

');const t=document.createElement("div");t.className="panel";for(const c of e.lots){const e=document.createElement("a");e.className="panel-block is-block",e.href="#",e.dataset.lotId=c.lotId.toString(),e.dataset.lotName=c.lotName,e.innerHTML='
'+cityssm.escapeHTML(c.lotName||"")+'
'+cityssm.escapeHTML(c.mapName||"")+'
'+cityssm.escapeHTML(c.lotStatus)+'
'+(c.lotOccupancyCount>0?"Currently Occupied":"")+"
",e.addEventListener("click",i),t.append(e)}s.innerHTML="",s.append(t)})},d=e=>{e.preventDefault();const t=o.querySelector("#lotCreate--lotName").value;cityssm.postJSON(a.urlPrefix+"/lots/doCreateLot",e.currentTarget,e=>{e.success?l(e.lotId,t):bulmaJS.alert({title:"Error Creating "+exports.aliases.lot,message:e.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-selectLot",{onshow:e=>{a.populateAliases(e)},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),o=e,c=a,bulmaJS.init(e);const l=e.querySelector("#lotSelect--lotName");""!==document.querySelector("#lotOccupancy--lotId").value&&(l.value=t),l.focus(),l.addEventListener("change",u);const r=e.querySelector("#lotSelect--occupancyStatus");if(r.addEventListener("change",u),""!==t&&(r.value=""),n=e.querySelector("#form--lotSelect"),s=e.querySelector("#resultsContainer--lotSelect"),n.addEventListener("submit",e=>{e.preventDefault()}),u(),exports.lotNamePattern){const t=exports.lotNamePattern;e.querySelector("#lotCreate--lotName").pattern=t.source}const i=e.querySelector("#lotCreate--lotTypeId");for(const e of exports.lotTypes){const t=document.createElement("option");t.value=e.lotTypeId.toString(),t.textContent=e.lotType,i.append(t)}const p=e.querySelector("#lotCreate--lotStatusId");for(const e of exports.lotStatuses){const t=document.createElement("option");t.value=e.lotStatusId.toString(),t.textContent=e.lotStatus,p.append(t)}const m=e.querySelector("#lotCreate--mapId");for(const e of exports.maps){const t=document.createElement("option");t.value=e.mapId.toString(),t.textContent=e.mapName||"(No Name)",m.append(t)}e.querySelector("#form--lotCreate").addEventListener("submit",d)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),document.querySelector(".is-lot-view-button").addEventListener("click",()=>{const e=document.querySelector("#lotOccupancy--lotId").value;e?window.open(a.urlPrefix+"/lots/"+e):bulmaJS.alert({message:"No "+exports.aliases.lot.toLowerCase()+" selected.",contextualColorName:"info"})}),document.querySelector(".is-clear-lot-button").addEventListener("click",()=>{p.disabled?bulmaJS.alert({message:"You need to unlock the field before clearing it.",contextualColorName:"info"}):(p.value="(No "+exports.aliases.lot+")",document.querySelector("#lotOccupancy--lotId").value="",r())}),a.initializeDatePickers(i),document.querySelector("#lotOccupancy--occupancyStartDateString").addEventListener("change",()=>{const e=document.querySelector("#lotOccupancy--occupancyEndDateString").bulmaCalendar.datePicker;e.min=document.querySelector("#lotOccupancy--occupancyStartDateString").value,e.refresh()}),a.initializeUnlockFieldButtons(i),n){const e=document.querySelector("#lotOccupancy--lotOccupantTypeId");e.addEventListener("change",()=>{const t=i.querySelectorAll("[data-table='LotOccupancyOccupant']");for(const c of t)c.disabled=""===e.value})}else{let e=exports.lotOccupancyOccupants;delete exports.lotOccupancyOccupants;const t=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupantIndex,10),s=e.find(e=>e.lotOccupantIndex===c);let l,r;const i=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doUpdateLotOccupancyOccupant",l,t=>{t.success?(e=t.lotOccupancyOccupants,r(),n()):bulmaJS.alert({title:"Error Updating "+exports.aliases.occupant,message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editOccupant",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyOccupantEdit--lotOccupancyId").value=o,e.querySelector("#lotOccupancyOccupantEdit--lotOccupantIndex").value=c.toString();const t=e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId");let n=!1;for(const e of exports.lotOccupantTypes){const c=document.createElement("option");c.value=e.lotOccupantTypeId.toString(),c.textContent=e.lotOccupantType,e.lotOccupantTypeId===s.lotOccupantTypeId&&(c.selected=!0,n=!0),t.append(c)}if(!n){const e=document.createElement("option");e.value=s.lotOccupantTypeId.toString(),e.textContent=s.lotOccupantType,e.selected=!0,t.append(e)}e.querySelector("#lotOccupancyOccupantEdit--occupantName").value=s.occupantName,e.querySelector("#lotOccupancyOccupantEdit--occupantAddress1").value=s.occupantAddress1,e.querySelector("#lotOccupancyOccupantEdit--occupantAddress2").value=s.occupantAddress2,e.querySelector("#lotOccupancyOccupantEdit--occupantCity").value=s.occupantCity,e.querySelector("#lotOccupancyOccupantEdit--occupantProvince").value=s.occupantProvince,e.querySelector("#lotOccupancyOccupantEdit--occupantPostalCode").value=s.occupantPostalCode,e.querySelector("#lotOccupancyOccupantEdit--occupantPhoneNumber").value=s.occupantPhoneNumber,e.querySelector("#lotOccupancyOccupantEdit--occupantEmailAddress").value=s.occupantEmailAddress,e.querySelector("#lotOccupancyOccupantEdit--occupantComment").value=s.occupantComment},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyOccupantEdit--lotOccupantTypeId").focus(),(l=e.querySelector("form")).addEventListener("submit",i),r=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},c=t=>{const c=t.currentTarget.closest("tr").dataset.lotOccupantIndex;bulmaJS.confirm({title:"Remove "+exports.aliases.occupant+"?",message:"Are you sure you want to remove this "+exports.aliases.occupant.toLowerCase()+"?",okButton:{text:"Yes, Remove "+exports.aliases.occupant,callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyOccupant",{lotOccupancyId:o,lotOccupantIndex:c},t=>{t.success?(e=t.lotOccupancyOccupants,n()):bulmaJS.alert({title:"Error Removing "+exports.aliases.occupant,message:t.errorMessage||"",contextualColorName:"danger"})})}},contextualColorName:"warning"})},n=()=>{const a=document.querySelector("#container--lotOccupancyOccupants");if(cityssm.clearElement(a),0===e.length)return void(a.innerHTML='

There are no '+exports.aliases.occupants.toLowerCase()+" associated with this record.

");const o=document.createElement("table");o.className="table is-fullwidth is-striped is-hoverable",o.innerHTML=""+exports.aliases.occupant+'AddressOther ContactCommentOptions';for(const a of e){const e=document.createElement("tr");e.dataset.lotOccupantIndex=a.lotOccupantIndex.toString(),e.innerHTML=""+cityssm.escapeHTML(a.occupantName||"(No Name)")+'
'+cityssm.escapeHTML(a.lotOccupantType)+""+(a.occupantAddress1?cityssm.escapeHTML(a.occupantAddress1)+"
":"")+(a.occupantAddress2?cityssm.escapeHTML(a.occupantAddress2)+"
":"")+(a.occupantCity?cityssm.escapeHTML(a.occupantCity)+", ":"")+cityssm.escapeHTML(a.occupantProvince||"")+"
"+cityssm.escapeHTML(a.occupantPostalCode||"")+""+(a.occupantPhoneNumber?cityssm.escapeHTML(a.occupantPhoneNumber)+"
":"")+(a.occupantEmailAddress?cityssm.escapeHTML(a.occupantEmailAddress):"")+""+cityssm.escapeHTML(a.occupantComment)+'
',e.querySelector(".button--edit").addEventListener("click",t),e.querySelector(".button--delete").addEventListener("click",c),o.querySelector("tbody").append(e)}a.append(o)};document.querySelector("#button--addOccupant").addEventListener("click",()=>{let t,c,s,l;const r=c=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyOccupant",c,c=>{c.success?(e=c.lotOccupancyOccupants,t(),n()):bulmaJS.alert({title:"Error Adding "+exports.aliases.occupant,message:c.errorMessage||"",contextualColorName:"danger"})})},i=e=>{e.preventDefault(),r(c)};let u=[];const d=e=>{e.preventDefault();const t=e.currentTarget,c=u[Number.parseInt(t.dataset.index,10)],a=t.closest(".modal").querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId").value;""===a?bulmaJS.alert({title:"No "+exports.aliases.occupant+" Type Selected",message:"Select a type to apply to the newly added "+exports.aliases.occupant.toLowerCase()+".",contextualColorName:"warning"}):(c.lotOccupantTypeId=Number.parseInt(a,10),c.lotOccupancyId=Number.parseInt(o,10),r(c))},p=e=>{e.preventDefault(),""!==s.querySelector("#lotOccupancyOccupantCopy--searchFilter").value?(l.innerHTML='

Searching...
',cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doSearchPastOccupants",s,e=>{u=e.occupants;const t=document.createElement("div");t.className="panel";for(const[e,c]of u.entries()){const a=document.createElement("a");a.className="panel-block is-block",a.dataset.index=e.toString(),a.innerHTML=""+cityssm.escapeHTML(c.occupantName||"")+'
'+cityssm.escapeHTML(c.occupantAddress1||"")+"
"+(c.occupantAddress2?cityssm.escapeHTML(c.occupantAddress2)+"
":"")+cityssm.escapeHTML(c.occupantCity||"")+", "+cityssm.escapeHTML(c.occupantProvince||"")+"
"+cityssm.escapeHTML(c.occupantPostalCode||"")+'
'+(c.occupantPhoneNumber?cityssm.escapeHTML(c.occupantPhoneNumber)+"
":"")+cityssm.escapeHTML(c.occupantEmailAddress||"")+"
",a.addEventListener("click",d),t.append(a)}l.innerHTML="",l.append(t)})):l.innerHTML='

Enter a partial name or address in the search field above.

'};cityssm.openHtmlModal("lotOccupancy-addOccupant",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyOccupantAdd--lotOccupancyId").value=o;const t=e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId"),c=e.querySelector("#lotOccupancyOccupantCopy--lotOccupantTypeId");for(const e of exports.lotOccupantTypes){const a=document.createElement("option");a.value=e.lotOccupantTypeId.toString(),a.textContent=e.lotOccupantType,t.append(a),c.append(a.cloneNode(!0))}e.querySelector("#lotOccupancyOccupantAdd--occupantCity").value=exports.occupantCityDefault,e.querySelector("#lotOccupancyOccupantAdd--occupantProvince").value=exports.occupantProvinceDefault},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),bulmaJS.init(e),e.querySelector("#lotOccupancyOccupantAdd--lotOccupantTypeId").focus(),(c=e.querySelector("#form--lotOccupancyOccupantAdd")).addEventListener("submit",i),l=e.querySelector("#lotOccupancyOccupantCopy--searchResults"),(s=e.querySelector("#form--lotOccupancyOccupantCopy")).addEventListener("submit",e=>{e.preventDefault()}),e.querySelector("#lotOccupancyOccupantCopy--searchFilter").addEventListener("change",p),t=a},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),n()}if(!n){Object.defineProperty(exports,"__esModule",{value:!0});let e=exports.lotOccupancyComments;delete exports.lotOccupancyComments;const t=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10),s=e.find(e=>e.lotOccupancyCommentId===c);let l,r;const i=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doUpdateLotOccupancyComment",l,t=>{t.success?(e=t.lotOccupancyComments,r(),n()):bulmaJS.alert({title:"Error Updating Comment",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-editComment",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyId").value=o,e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentId").value=c.toString(),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").value=s.lotOccupancyComment;const t=e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentDateString");t.value=s.lotOccupancyCommentDateString;const n=cityssm.dateToString(new Date);t.max=s.lotOccupancyCommentDateString<=n?n:s.lotOccupancyCommentDateString,e.querySelector("#lotOccupancyCommentEdit--lotOccupancyCommentTimeString").value=s.lotOccupancyCommentTimeString},onshown:(e,t)=>{bulmaJS.toggleHtmlClipped(),a.initializeDatePickers(e),e.querySelector("#lotOccupancyCommentEdit--lotOccupancyComment").focus(),(l=e.querySelector("form")).addEventListener("submit",i),r=t},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})},c=t=>{const c=Number.parseInt(t.currentTarget.closest("tr").dataset.lotOccupancyCommentId,10);bulmaJS.confirm({title:"Remove Comment?",message:"Are you sure you want to remove this comment?",okButton:{text:"Yes, Remove Comment",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyComment",{lotOccupancyId:o,lotOccupancyCommentId:c},t=>{t.success?(e=t.lotOccupancyComments,n()):bulmaJS.alert({title:"Error Removing Comment",message:t.errorMessage||"",contextualColorName:"danger"})})}},contextualColorName:"warning"})},n=()=>{const a=document.querySelector("#container--lotOccupancyComments");if(0===e.length)return void(a.innerHTML='

There are no comments associated with this record.

');const o=document.createElement("table");o.className="table is-fullwidth is-striped is-hoverable",o.innerHTML='CommentorComment DateCommentOptions';for(const a of e){const e=document.createElement("tr");e.dataset.lotOccupancyCommentId=a.lotOccupancyCommentId.toString(),e.innerHTML=""+cityssm.escapeHTML(a.recordCreate_userName||"")+""+a.lotOccupancyCommentDateString+(0===a.lotOccupancyCommentTime?"":" "+a.lotOccupancyCommentTimeString)+""+cityssm.escapeHTML(a.lotOccupancyComment||"")+'
',e.querySelector(".button--edit").addEventListener("click",t),e.querySelector(".button--delete").addEventListener("click",c),o.querySelector("tbody").append(e)}a.innerHTML="",a.append(o)};document.querySelector("#button--addComment").addEventListener("click",()=>{let t,c;const s=o=>{o.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyComment",t,t=>{t.success?(e=t.lotOccupancyComments,c(),n()):bulmaJS.alert({title:"Error Adding Comment",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addComment",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyId").value=o},onshown:(e,a)=>{bulmaJS.toggleHtmlClipped(),e.querySelector("#lotOccupancyCommentAdd--lotOccupancyComment").focus(),(t=e.querySelector("form")).addEventListener("submit",s),c=a},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),n()}if(!n){Object.defineProperty(exports,"__esModule",{value:!0});let e=exports.lotOccupancyFees;delete exports.lotOccupancyFees;const t=document.querySelector("#container--lotOccupancyFees"),c=()=>{let t=0;for(const c of e)t+=(c.feeAmount+c.taxAmount)*c.quantity;return t},n=t=>{const c=t.currentTarget.closest(".container--lotOccupancyFee").dataset.feeId;bulmaJS.confirm({title:"Delete Fee",message:"Are you sure you want to delete this fee?",contextualColorName:"warning",okButton:{text:"Yes, Delete Fee",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyFee",{lotOccupancyId:o,feeId:c},t=>{t.success?(e=t.lotOccupancyFees,l()):bulmaJS.alert({title:"Error Deleting Fee",message:t.errorMessage||"",contextualColorName:"danger"})})}}})},l=()=>{if(0===e.length)return t.innerHTML='

There are no fees associated with this record.

',void p();t.innerHTML='
FeeUnit Cost×QuantityequalsTotalOptions
Subtotal
Tax
Grand Total
';let c=0,a=0;for(const o of e){const e=document.createElement("tr");e.className="container--lotOccupancyFee",e.dataset.feeId=o.feeId.toString(),e.dataset.includeQuantity=o.includeQuantity?"1":"0",e.innerHTML=''+cityssm.escapeHTML(o.feeName||"")+""+(1===o.quantity?"":'$'+o.feeAmount.toFixed(2)+'×'+o.quantity+"=")+'$'+(o.feeAmount*o.quantity).toFixed(2)+'',e.querySelector("button").addEventListener("click",n),t.querySelector("tbody").append(e),c+=o.feeAmount*o.quantity,a+=o.taxAmount*o.quantity}t.querySelector("#lotOccupancyFees--feeAmountTotal").textContent="$"+c.toFixed(2),t.querySelector("#lotOccupancyFees--taxAmountTotal").textContent="$"+a.toFixed(2),t.querySelector("#lotOccupancyFees--grandTotal").textContent="$"+(c+a).toFixed(2),p()};document.querySelector("#button--addFee").addEventListener("click",()=>{if(s)return void bulmaJS.alert({message:"Please save all unsaved changes before adding fees.",contextualColorName:"warning"});let c,n,r;const i=(t,c=1)=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyFee",{lotOccupancyId:o,feeId:t,quantity:c},t=>{t.success?(e=t.lotOccupancyFees,l(),d()):bulmaJS.alert({title:"Error Adding Fee",message:t.errorMessage||"",contextualColorName:"danger"})})},u=e=>{e.preventDefault();const t=Number.parseInt(e.currentTarget.dataset.feeId,10),a=Number.parseInt(e.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId,10),o=c.find(e=>e.feeCategoryId===a).fees.find(e=>e.feeId===t);o.includeQuantity?(e=>{let t,c;const a=a=>{a.preventDefault(),i(e.feeId,t.value),c()};cityssm.openHtmlModal("lotOccupancy-setFeeQuantity",{onshow:t=>{t.querySelector("#lotOccupancyFeeQuantity--quantityUnit").textContent=e.quantityUnit},onshown:(e,o)=>{c=o,t=e.querySelector("#lotOccupancyFeeQuantity--quantity"),e.querySelector("form").addEventListener("submit",a)}})})(o):i(t)},d=()=>{const e=n.value.trim().toLowerCase().split(" ");r.innerHTML="";for(const a of c){const c=document.createElement("div");c.className="container--feeCategory",c.dataset.feeCategoryId=a.feeCategoryId.toString(),c.innerHTML='

'+cityssm.escapeHTML(a.feeCategory||"")+'

';let o=!1;for(const n of a.fees){if(t.querySelector(".container--lotOccupancyFee[data-fee-id='"+n.feeId+"'][data-include-quantity='0']"))continue;let a=!0;for(const t of e)if(!n.feeName.toLowerCase().includes(t)){a=!1;break}if(!a)continue;o=!0;const s=document.createElement("a");s.className="panel-block is-block container--fee",s.dataset.feeId=n.feeId.toString(),s.href="#",s.innerHTML=""+cityssm.escapeHTML(n.feeName||"")+"
"+cityssm.escapeHTML(n.feeDescription||"").replace(/\n/g,"
")+"
",s.addEventListener("click",u),c.querySelector(".panel").append(s)}o&&r.append(c)}};cityssm.openHtmlModal("lotOccupancy-addFee",{onshow:e=>{n=e.querySelector("#feeSelect--feeName"),r=e.querySelector("#resultsContainer--feeSelect"),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doGetFees",{lotOccupancyId:o},e=>{c=e.feeCategories,n.disabled=!1,n.addEventListener("keyup",d),n.focus(),d()})},onshown:()=>{bulmaJS.toggleHtmlClipped()},onhidden:()=>{l()},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})});let r=exports.lotOccupancyTransactions;delete exports.lotOccupancyTransactions;const i=document.querySelector("#container--lotOccupancyTransactions"),u=()=>{let e=0;for(const t of r)e+=t.transactionAmount;return e},d=e=>{const t=e.currentTarget.closest(".container--lotOccupancyTransaction").dataset.transactionIndex;bulmaJS.confirm({title:"Delete Trasnaction",message:"Are you sure you want to delete this transaction?",contextualColorName:"warning",okButton:{text:"Yes, Delete Transaction",callbackFunction:()=>{cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doDeleteLotOccupancyTransaction",{lotOccupancyId:o,transactionIndex:t},e=>{e.success?(r=e.lotOccupancyTransactions,p()):bulmaJS.alert({title:"Error Deleting Transaction",message:e.errorMessage||"",contextualColorName:"danger"})})}}})},p=()=>{if(0===r.length)return void(i.innerHTML='

There are no transactions associated with this record.

');i.innerHTML='
Date'+cityssm.escapeHTML(exports.aliases.externalReceiptNumber)+'AmountOptions
Transaction Total
';let t=0;for(const e of r){t+=e.transactionAmount;const c=document.createElement("tr");c.className="container--lotOccupancyTransaction",c.dataset.transactionIndex=e.transactionIndex.toString(),c.innerHTML=""+e.transactionDateString+""+cityssm.escapeHTML(e.externalReceiptNumber||"")+"
"+cityssm.escapeHTML(e.transactionNote||"")+'$'+e.transactionAmount.toFixed(2)+'',c.querySelector("button").addEventListener("click",d),i.querySelector("tbody").append(c)}i.querySelector("#lotOccupancyTransactions--grandTotal").textContent="$"+t.toFixed(2);const a=c();a>t&&i.insertAdjacentHTML("afterbegin",'
Outstanding Balance
$'+(a-t).toFixed(2)+"
")};document.querySelector("#button--addTransaction").addEventListener("click",()=>{let e;const t=t=>{t.preventDefault(),cityssm.postJSON(a.urlPrefix+"/lotOccupancies/doAddLotOccupancyTransaction",t.currentTarget,t=>{t.success?(r=t.lotOccupancyTransactions,e(),p()):bulmaJS.confirm({title:"Error Adding Transaction",message:t.errorMessage||"",contextualColorName:"danger"})})};cityssm.openHtmlModal("lotOccupancy-addTransaction",{onshow:e=>{a.populateAliases(e),e.querySelector("#lotOccupancyTransactionAdd--lotOccupancyId").value=o.toString();const t=c(),n=u(),s=e.querySelector("#lotOccupancyTransactionAdd--transactionAmount");s.min=(-1*n).toFixed(2),s.max=Math.max(t-n,0).toFixed(2),s.value=Math.max(t-n,0).toFixed(2)},onshown:(c,a)=>{bulmaJS.toggleHtmlClipped(),e=a,c.querySelector("form").addEventListener("submit",t)},onremoved:()=>{bulmaJS.toggleHtmlClipped()}})}),l()}})(); \ No newline at end of file diff --git a/tsconfig.client.json b/tsconfig.client.json index 34d0bf59..f0b77334 100644 --- a/tsconfig.client.json +++ b/tsconfig.client.json @@ -6,7 +6,7 @@ "isolatedModules": false, "declaration": true, "noImplicitAny": false, - "removeComments": true, + "removeComments": false, "allowUnreachableCode": false }, "files": [ @@ -17,7 +17,9 @@ "public-typescript/adminTables.ts", "public-typescript/dashboard.ts", "public-typescript/lotEdit.ts", - "public-typescript/lotOccupancyEdit.ts", + "public-typescript/lotOccupancyEdit/lotOccupancyEdit.ts", + "public-typescript/lotOccupancyEdit/lotOccupancyEditComments.ts", + "public-typescript/lotOccupancyEdit/lotOccupancyEditFees.ts", "public-typescript/lotOccupancySearch.ts", "public-typescript/lotSearch.ts", "public-typescript/lotView.ts",