From eb640a6fb57994ce734557c1fe4bf58a73ce4ab6 Mon Sep 17 00:00:00 2001 From: zino Date: Wed, 31 Mar 2021 19:30:52 +0200 Subject: [PATCH] implemented cart button --- client/package-lock.json | 721 ++++++++++++++++++++++++++++++++++- client/package.json | 10 +- client/src/inject.ts | 61 ++- client/src/modules/config.ts | 1 + client/src/modules/jsc.ts | 40 +- client/src/modules/parser.ts | 6 +- client/src/modules/ui.ts | 1 - client/src/seatmap.ts | 260 +++++++++++-- client/src/types/types.d.ts | 35 ++ 9 files changed, 1079 insertions(+), 56 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index bdfee9f..0b0d5a4 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@panzoom/panzoom": "^4.3.2", "axios": "^0.21.1", + "jbox": "^1.2.14", "xml2js": "^0.4.23" }, "devDependencies": { @@ -18,6 +19,7 @@ "@types/jqueryui": "^1.12.14", "@types/xml2js": "^0.4.8", "browserify": "^17.0.0", + "browserify-css": "^0.15.0", "jquery": "^3.6.0", "jquery-ui": "^1.12.1", "tsify": "^5.0.2", @@ -165,6 +167,18 @@ "inherits": "2.0.1" } }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", @@ -230,6 +244,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -349,6 +375,22 @@ "evp_bytestokey": "^1.0.0" } }, + "node_modules/browserify-css": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/browserify-css/-/browserify-css-0.15.0.tgz", + "integrity": "sha512-ZgLHyZ16PH6P25JlBE+5xNtdobpkc5Egh+ctc8ha3GDtuZqSSQu0ovOxOQvXt0xAmaXixth/DY9iT56HlDOxyg==", + "dev": true, + "dependencies": { + "clean-css": "^4.1.5", + "concat-stream": "^1.6.0", + "css": "^2.2.1", + "find-node-modules": "^2.0.0", + "lodash": "^4.17.11", + "mime": "^1.3.6", + "strip-css-comments": "^3.0.0", + "through2": "2.0.x" + } + }, "node_modules/browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", @@ -468,6 +510,27 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -590,12 +653,42 @@ "node": "*" } }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", "dev": true }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -639,6 +732,15 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detective": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", @@ -786,12 +888,61 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", "dev": true }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-node-modules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.2.tgz", + "integrity": "sha512-x+3P4mbtRPlSiVE1Qco0Z4YLU8WFiFcuWTf3m75OV9Uzcfs2Bg+O9N+r/K0AnmINBW06KpfqKwYJbFlFq4qNug==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.0" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/follow-redirects": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", @@ -869,6 +1020,36 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -942,6 +1123,18 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -993,6 +1186,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", @@ -1086,6 +1285,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-generator-function": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", @@ -1098,6 +1306,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -1110,6 +1330,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", @@ -1126,6 +1355,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -1166,17 +1404,39 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/jbox": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/jbox/-/jbox-1.2.14.tgz", + "integrity": "sha512-4plNxNJ0DoK8OKL/qG+OYP/mOGGaNBx1gXDhonHiqCXJ1E6SGUrkEd60/QQ6Be5bptLqL4MXm3uJYWzstm2Ucg==", + "dependencies": { + "jquery": "^3.6.0" + } + }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "dev": true + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "node_modules/jquery-ui": { "version": "1.12.1", @@ -1219,6 +1479,12 @@ "stream-splicer": "^2.0.0" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", @@ -1236,6 +1502,25 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -1255,6 +1540,18 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -1420,6 +1717,15 @@ "node": ">=0.10.0" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -1466,6 +1772,18 @@ "node": ">=0.12" } }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -1596,6 +1914,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -1703,6 +2041,25 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -1820,6 +2177,18 @@ "node": ">=0.10.0" } }, + "node_modules/strip-css-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", + "integrity": "sha1-elYl7/iisibPiUehElTaluE9rok=", + "dev": true, + "dependencies": { + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1875,6 +2244,18 @@ "node": ">=0.6.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tsconfig": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-5.0.3.tgz", @@ -1971,6 +2352,13 @@ "undeclared-identifiers": "bin.js" } }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -2013,6 +2401,18 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/which-typed-array": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", @@ -2206,6 +2606,12 @@ } } }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "available-typed-arrays": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", @@ -2251,6 +2657,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -2361,6 +2776,22 @@ "evp_bytestokey": "^1.0.0" } }, + "browserify-css": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/browserify-css/-/browserify-css-0.15.0.tgz", + "integrity": "sha512-ZgLHyZ16PH6P25JlBE+5xNtdobpkc5Egh+ctc8ha3GDtuZqSSQu0ovOxOQvXt0xAmaXixth/DY9iT56HlDOxyg==", + "dev": true, + "requires": { + "clean-css": "^4.1.5", + "concat-stream": "^1.6.0", + "css": "^2.2.1", + "find-node-modules": "^2.0.0", + "lodash": "^4.17.11", + "mime": "^1.3.6", + "strip-css-comments": "^3.0.0", + "through2": "2.0.x" + } + }, "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", @@ -2476,6 +2907,23 @@ "safe-buffer": "^5.0.1" } }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -2594,12 +3042,38 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2637,6 +3111,12 @@ "minimalistic-assert": "^1.0.0" } }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detective": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", @@ -2763,12 +3243,52 @@ "safe-buffer": "^5.1.1" } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-node-modules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.2.tgz", + "integrity": "sha512-x+3P4mbtRPlSiVE1Qco0Z4YLU8WFiFcuWTf3m75OV9Uzcfs2Bg+O9N+r/K0AnmINBW06KpfqKwYJbFlFq4qNug==", + "dev": true, + "requires": { + "findup-sync": "^4.0.0", + "merge": "^2.1.0" + } + }, + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, "follow-redirects": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", @@ -2823,6 +3343,30 @@ "path-is-absolute": "^1.0.0" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2883,6 +3427,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -2917,6 +3470,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", @@ -2986,18 +3545,39 @@ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-generator-function": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", @@ -3008,6 +3588,12 @@ "has-symbols": "^1.0.1" } }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -3036,17 +3622,36 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jbox": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/jbox/-/jbox-1.2.14.tgz", + "integrity": "sha512-4plNxNJ0DoK8OKL/qG+OYP/mOGGaNBx1gXDhonHiqCXJ1E6SGUrkEd60/QQ6Be5bptLqL4MXm3uJYWzstm2Ucg==", + "requires": { + "jquery": "^3.6.0" + } + }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "dev": true + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "jquery-ui": { "version": "1.12.1", @@ -3080,6 +3685,12 @@ "stream-splicer": "^2.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", @@ -3097,6 +3708,22 @@ "safe-buffer": "^5.1.2" } }, + "merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -3115,6 +3742,12 @@ } } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -3253,6 +3886,12 @@ "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -3290,6 +3929,12 @@ "sha.js": "^2.4.8" } }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3412,6 +4057,22 @@ "path-parse": "^1.0.6" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -3482,6 +4143,25 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, "stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -3588,6 +4268,15 @@ "is-utf8": "^0.2.0" } }, + "strip-css-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", + "integrity": "sha1-elYl7/iisibPiUehElTaluE9rok=", + "dev": true, + "requires": { + "is-regexp": "^1.0.0" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -3637,6 +4326,15 @@ "process": "~0.11.0" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tsconfig": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-5.0.3.tgz", @@ -3707,6 +4405,12 @@ "xtend": "^4.0.1" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3751,6 +4455,15 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "which-typed-array": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", diff --git a/client/package.json b/client/package.json index 28263a9..12190ba 100644 --- a/client/package.json +++ b/client/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "browserifyf": "func() { browserify --debug -p [ tsify ] $1 > $2; }; func", - "watchifyf": "func() { watchify --debug --verbose -p [ tsify ] $1 -o $2; }; func" + "watchifyf": "func() { watchify --debug --verbose -p [ tsify ] $1 -o $2; }; func", + "watchifyfcss": "func() { watchify -g browserify-css --debug --verbose -p [ tsify ] $1 -o $2; }; func" }, "keywords": [], "author": "", @@ -16,6 +17,7 @@ "@types/jqueryui": "^1.12.14", "@types/xml2js": "^0.4.8", "browserify": "^17.0.0", + "browserify-css": "^0.15.0", "jquery": "^3.6.0", "jquery-ui": "^1.12.1", "tsify": "^5.0.2", @@ -24,6 +26,12 @@ "dependencies": { "@panzoom/panzoom": "^4.3.2", "axios": "^0.21.1", + "jbox": "^1.2.14", "xml2js": "^0.4.23" + }, + "browserify-css": { + "autoInject": true, + "minify": false, + "rootDir": "." } } diff --git a/client/src/inject.ts b/client/src/inject.ts index ef0609f..3555af4 100644 --- a/client/src/inject.ts +++ b/client/src/inject.ts @@ -6,6 +6,7 @@ import * as Communication from "./modules/communication"; import * as Parser from './modules/parser'; import * as UI from "./modules/ui"; import { config } from "./modules/config"; +import axios from 'axios'; let inputsWithValue: I.InputsWithValue; @@ -25,7 +26,7 @@ function messagesHandler(e: any) { event: "parent_init_sendInputsWithValue", date: Date.now() }; - Communication.sendMessage(message, "iframeSeatmap") + Communication.sendMessage(message, "iframeSeatmap"); break; } case "child_init_needVenueXML": { @@ -34,7 +35,7 @@ function messagesHandler(e: any) { break; } case "child_needSeatmapXML": { - const seatmapUrl: string = `${inputsWithValue["posturlRawDecoded"]}&inclseatmap=Y&seatmap=${data.message}` + const seatmapUrl: string = `${inputsWithValue["posturlRawDecoded"]}&inclseatmap=Y&seatmap=${data.message}`; Communication.sendXML(seatmapUrl, "iframeSeatmap", "parent_sendSeatmapXML", "parent"); break; } @@ -42,12 +43,66 @@ function messagesHandler(e: any) { jQuery("#containerBookingBtn").show(); break; } + case "child_needCheckoutResponse": { + // const inSelectedSeat: I.JSCSelectedSeat = data.message.selectedSeat; + const inUrl: string = data.message.url; + + axios.get(inUrl, { + maxRedirects: 0 + }).then(function (response) { + let isValidSeatSelection: boolean = false; + const content: string = response.data; + const parsedHTML: Node[] = jQuery.parseHTML(content); + const orderkey: string | undefined = jQuery(parsedHTML).find("#orderkey").val(); + console.log(`orderkey: ${orderkey}`); + + if (orderkey) { + isValidSeatSelection = true; + const cancelUrl = generateCheckoutCancelUrl(orderkey); + cancelCheckout(cancelUrl); + } + + const message: I.Message = { + message: { + "isValidSeatSelection": isValidSeatSelection, + "parsedHTML": parsedHTML, + // "selectedSeat": inSelectedSeat + }, + from: "parent", + event: "parent_sendCheckoutResponse", + date: Date.now() + }; + Communication.sendMessage(message, "iframeSeatmap"); + }) + .catch(function (error) { + console.log("error"); + console.log(error); + }); + break; + } default: break; } } +function cancelCheckout(inUrl: string) { + // use fetch instead of axios because of 302 redirect + // https://github.com/axios/axios/issues/932 + fetch(inUrl, { + redirect: "manual" + }).then(() => { + console.log(`${inUrl} canceled`); + }).catch(function (error) { + console.log("error"); + console.log(error); + }); +} + +function generateCheckoutCancelUrl(inOrderkey: string) { + return `${inputsWithValue["ticketPurchaseUrl"]}?user_context=${inputsWithValue["user_context"]}&pid=${inputsWithValue["pid"]}&orderkey=${inOrderkey}&trxstate=92`; +} + window.addEventListener('load', function () { const content: string = new XMLSerializer().serializeToString(document); inputsWithValue = { ...inputsWithValue, ...Parser.getInputs(content) }; @@ -64,7 +119,7 @@ window.addEventListener('load', function () { Communication.listenToMessages(messagesHandler); inputsWithValue = { ...inputsWithValue, ...Parser.getAdditionalInputs(content) }; inputsWithValue = { ...inputsWithValue, ...Parser.getVenueImage() }; - + const importantNote = Parser.getImportantNote(); if (importantNote) inputsWithValue = { ...inputsWithValue, ...importantNote }; diff --git a/client/src/modules/config.ts b/client/src/modules/config.ts index 5d4ee6a..19dc31a 100644 --- a/client/src/modules/config.ts +++ b/client/src/modules/config.ts @@ -13,5 +13,6 @@ export const config: I.Config = { urlJSCMaster: "https://tickets.zinomedia.de/libs/jQuery-Seat-Charts/jquery.seat-charts.min.js", urlCSSJSCStaging: "https://staging.tickets.zinomedia.de/libs/jQuery-Seat-Charts/jquery.seat-charts.css", urlCSSJSCMaster: "https://tickets.zinomedia.de/libs/jQuery-Seat-Charts/jquery.seat-charts.css", + urlCSSjQueryUI: "https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css", childHasVenueXML: false } \ No newline at end of file diff --git a/client/src/modules/jsc.ts b/client/src/modules/jsc.ts index 74789e5..6cdfb83 100644 --- a/client/src/modules/jsc.ts +++ b/client/src/modules/jsc.ts @@ -18,7 +18,7 @@ export function getSeats(inXML: any): I.JSCSeats { return seatmapInitSeats; } -export function activateSeatsBySectionID(inXML: any, seatmap: any, inValue: string, ) { +export function activateSeatsBySectionID(inXML: any, seatmap: any, inValue: string,) { const pricescaleArr: I.SeatmapPricescale[] = inXML.seatmap[0].pricescale_config[0].pricescale; pricescaleArr.forEach(element => { @@ -38,33 +38,40 @@ export function getRows(inXML: any): number[] { export function generateMap(inXML: any): string[] { const layout: I.SeatmapLayout = inXML.seatmap[0].layouts[0].layout[0]; - console.log(layout); const rows: I.LayoutRow2[] = layout.rows[0].row; const pricescaleArr: I.SeatmapPricescale[] = inXML.seatmap[0].pricescale_config[0].pricescale; + const availabilityArr: I.JSCAvailability = inXML.seatmap[0].view_modes[0].view_mode[0].availability[0]; // Form: arrMatrix[Y][X] let arrMatrix: string[][] = createArrMatrix(parseInt(layout.height[0]), parseInt(layout.width[0]), "_"); - - arrMatrix = enterSeatsInMatrix(rows, arrMatrix, pricescaleArr); + arrMatrix = enterSeatsInMatrix(rows, arrMatrix, pricescaleArr, availabilityArr); const stringArrMatrix = generateStringArrMatrix(arrMatrix); return stringArrMatrix; } -export function generateLegend(inXML: any, inNode: string): I.JSCLegend { - const pricescaleArr: I.SeatmapPricescale[] = inXML.seatmap[0].pricescale_config[0].pricescale; - console.log(pricescaleArr); +export function generateLegend(inVenueXML: I.VenueXML, inSeatmapXML: any, inNode: string): I.JSCLegend { + const pricescaleArr: I.SeatmapPricescale[] = inSeatmapXML.seatmap[0].pricescale_config[0].pricescale; + const venuePricescaleArr: I.Pricescale2[] = inVenueXML.venue[0].pricescales[0].pricescale; let legend: I.JSCLegend = { node: jQuery(inNode), items: [] } - for (let key in pricescaleArr) { + for (let key in pricescaleArr) { + const id: string = pricescaleArr[key].id[0]; const seatsKey: string = String.fromCharCode(97 + parseInt(key)).toLocaleUpperCase(); - const price: string = `€${pricescaleArr[key].ref_price[0]}`; - const legendItem = [ seatsKey, "available", price ]; + + // get pricescale desc from venueXML + const desc = venuePricescaleArr.find(obj => { + const pricecaleID = obj.id[0]; + return pricecaleID === id; + })?.desc[0]; + + const description: string = `${desc} €${pricescaleArr[key].ref_price[0]}`; + const legendItem = [seatsKey, "available", description]; legend.items.push(legendItem); - } + } return legend; } @@ -73,7 +80,7 @@ export function setUnavailableSeats(inXML: any, seatmap: any): void { const availabilityArr: I.JSCAvailability = inXML.seatmap[0].view_modes[0].view_mode[0].availability[0]; if (availabilityArr.unavailable_unselectable_mask[0] === "") - return; + return; const unavailableArr: string[] = availabilityArr.unavailable_unselectable_mask[0].split(","); seatmap.status(unavailableArr, "unavailable"); @@ -90,7 +97,10 @@ export function generateStringArrMatrix(inArrMatrix: string[][]): string[] { } -export function enterSeatsInMatrix(inRows: I.LayoutRow2[], inArrMatrix: string[][], inPricescaleArr: I.SeatmapPricescale[]): string[][] { +function enterSeatsInMatrix(inRows: I.LayoutRow2[], inArrMatrix: string[][], inPricescaleArr: I.SeatmapPricescale[], inAvailabilityArr: I.JSCAvailability): string[][] { + const availableArr: string[] = inAvailabilityArr.available_selectable_mask[0].split(","); + const unavailableArr: string[] = inAvailabilityArr.unavailable_unselectable_mask[0].split(","); + inRows.forEach(element => { const row: I.LayoutRow2 = element; const Y: number = parseInt(row.y_cell_coord[0]); @@ -110,6 +120,10 @@ export function enterSeatsInMatrix(inRows: I.LayoutRow2[], inArrMatrix: string[] // 4: "13" -> Reihenbezeichnung // 5: "4" -> ? + // skip blacked out seats + if (!availableArr.includes(seatArr[0]) && !unavailableArr.includes(seatArr[0])) + return; + // const X: number = parseInt(seatArr[5]); const X: number = parseInt(seatArr[2]); const seatsKey = getSeatsKey(seatArr[0], inPricescaleArr); diff --git a/client/src/modules/parser.ts b/client/src/modules/parser.ts index bd643b1..8d76cca 100644 --- a/client/src/modules/parser.ts +++ b/client/src/modules/parser.ts @@ -47,7 +47,8 @@ export function getAdditionalInputs(inContent: string): { [key: string]: string const posturlRaw = inContent.match(/posturl:"(.+?)"/)![1]; const posturlRawDecoded = decodeURIComponent(posturlRaw); const posturl = decodeURIComponent(`${posturlRaw}&event=${event}&holdcode=${holdcode}&nocache=0&inclpkg=Y&incloffer=Y&inclcartdetails=Y&inclCart=Y&inclvenue=Y`); - const venueLocation = getVenueLocation() + const venueLocation = getVenueLocation(); + const ticketPurchaseUrl = `${posturlRawDecoded.split("?")[0].split('/').slice(0,-1).join('/')}/TicketPurchase`; return { "event": event, @@ -55,7 +56,8 @@ export function getAdditionalInputs(inContent: string): { [key: string]: string "posturlRaw": posturlRaw, "posturlRawDecoded": posturlRawDecoded, "posturl": posturl, - "venueLocation": venueLocation + "venueLocation": venueLocation, + "ticketPurchaseUrl": ticketPurchaseUrl } } diff --git a/client/src/modules/ui.ts b/client/src/modules/ui.ts index d68e5b6..2d1b521 100644 --- a/client/src/modules/ui.ts +++ b/client/src/modules/ui.ts @@ -17,7 +17,6 @@ export function setOptionSelect(inSeatmapListing: I.Seatmap[], inId: string) { } export function setEventInfo(inEventInfo: I.EventInfo, inInputswithValue: I.InputsWithValue): void { - // console.log(inEventInfo); jQuery("#eventInfoDesc span.fl-heading-text")[0].childNodes[0].textContent = inEventInfo.desc[0]; jQuery("#eventInfoDate p")[0].childNodes[0].textContent = inEventInfo.start[0]; jQuery("#eventInfoCapacity p")[0].childNodes[0].textContent = inEventInfo.venue_config_capacity[0]; diff --git a/client/src/seatmap.ts b/client/src/seatmap.ts index a1f85fc..2355342 100644 --- a/client/src/seatmap.ts +++ b/client/src/seatmap.ts @@ -7,12 +7,19 @@ import * as JSC from "./modules/jsc"; import { config } from "./modules/config"; import Utils from './modules/utils'; import { PanzoomObject } from "@panzoom/panzoom"; +import jBox from 'jbox'; +require('jbox/dist/jBox.all.css'); let inputsWithValue: I.InputsWithValue; let seatmap: any; let panzoom: PanzoomObject | undefined; -let venueXML: I.VenueXML; +let inVenueXML: I.VenueXML; let seatmapXML: any; +let state: I.State = { + priceOverall: "", + selectedSeatsArr: [], + selectedSeatsObj: {} +} function messagesHandler(inE: any) { if (typeof (inE.data) !== 'string') @@ -29,19 +36,19 @@ function messagesHandler(inE: any) { break; } case "parent_init_sendVenueXML": { - venueXML = data.message.map_response; + inVenueXML = data.message.map_response; // generate pricescale css classes - const css = generatePricescaleCSS(venueXML); + const css = generatePricescaleCSS(inVenueXML); Utils.inject(css, "cssCustom", "body"); console.log(css); // fill event info - const eventInfo = XMLHelper.getEventInfo(venueXML); + const eventInfo = XMLHelper.getEventInfo(inVenueXML); UI.setEventInfo(eventInfo, inputsWithValue); // fill select dropdown - const seatmapListing: I.Seatmap[] = XMLHelper.getSeatmapListing(venueXML); + const seatmapListing: I.Seatmap[] = XMLHelper.getSeatmapListing(inVenueXML); console.log(seatmapListing); UI.setOptionSelect(seatmapListing, "dropdownSeatmap"); @@ -63,23 +70,63 @@ function messagesHandler(inE: any) { const map: string[] = JSC.generateMap(seatmapXML); const rows: number[] = JSC.getRows(seatmapXML); const seats: I.JSCSeats = JSC.getSeats(seatmapXML); - const legend: I.JSCLegend = JSC.generateLegend(seatmapXML, "#JSCLegendInner"); + const legend: I.JSCLegend = JSC.generateLegend(inVenueXML, seatmapXML, "#JSCLegendInner"); addSeatmap("#containerSeatmapInner", map, rows, seats, legend); JSC.setUnavailableSeats(seatmapXML, seatmap); + selectSeatsInCart(); UI.convertLegendToDropdown("dropdownLegend"); dropdownLegendOnChange("#dropdownLegend"); panzoom = UI.addPanzoom("#containerSeatmapInner", ".panzoomZoomIn", ".panzoomZoomOut", "#panzoomResetZoom"); UI.controlLoftloader("hide"); break; } + case "parent_sendCheckoutResponse": { + const inIsValidSeatSelection: boolean = data.message.isValidSeatSelection; + + if (!inIsValidSeatSelection) { + showJBoxNotice(`Auswahl nicht möglich: Bitte lassen Sie keinen einzelnen Platz frei.`); + } + + break; + } default: break; } } +function selectSeatsInCart() { + state.selectedSeatsArr.forEach(arr => { + const seatID: string = arr[0]; + + if (seatmap.get(seatID)) + seatmap.status(seatID, "selected"); + }); +} + +function showJBoxNotice(inContent: string, inAutoClose: number | boolean | undefined = 5000) { + new jBox('Notice', { + position: {x: 'center', y: 'top'}, + offset: {x: 0, y: 320}, + content: inContent, + autoClose: inAutoClose, + animation: { open: "zoomIn", close: "zoomOut" }, + closeOnEsc: false, + closeButton: true, + closeOnMouseleave: false, + closeOnClick: false, + draggable: false, + color: "red", + stack: true, + showCountdown: true, + reposition: true, + responsiveWidth: true, + responsiveHeight: true, + }); +} + function generatePricescaleCSS(inVenueXML: I.VenueXML): string { const venuePricescalesArr: I.Pricescale2[] = inVenueXML.venue[0].pricescales[0].pricescale; let cssArr: string[] = []; @@ -87,10 +134,12 @@ function generatePricescaleCSS(inVenueXML: I.VenueXML): string { venuePricescalesArr.forEach(element => { const ID: string = element.id[0]; - // todo: check if "" is correct when no color is set + // update: color always defined: fallback colors exist in system let color: string = `#${element.color[0]} !important`; - if (color === "") - color = Utils.generateRandomColor(); + // if (color === "") { + // console.log("no default color"); + // color = Utils.generateRandomColor(); + // } cssArr.push(`._${ID} { background-color: ${color}; }`); }); @@ -102,9 +151,18 @@ window.addEventListener('load', function () { Utils.inject(config.urlJSCStaging, "js", "head"); Utils.inject(config.urlCSSJSCStaging, "css", "body"); Utils.inject(config.urlCSSChildStaging, "css", "body"); + Utils.inject(config.urlCSSjQueryUI, "css", "body"); Communication.listenToMessages(messagesHandler); Utils.waitForSeatmap(Communication.showBookingBtnParent); + const btnCart: HTMLElement | null = document.getElementById("btnCart"); + if (btnCart) { + btnCart.addEventListener("click", function () { + console.log("foo"); + isValidSeatSelection(); + }); + } + const dropdownSeatmap: HTMLElement | null = document.getElementById("dropdownSeatmap"); if (dropdownSeatmap) { dropdownSeatmap.addEventListener("change", function (this: HTMLSelectElement) { @@ -114,10 +172,31 @@ window.addEventListener('load', function () { Communication.needSeatmapXML(value); }); } - - // Utils.waitForElement("#dropdownLegend", dropdownLegendOnChange); }); +// function showNotification(duration: number) { +// jQuery("#notificationColumn").css({ opacity: 0.0, visibility: "visible" }).animate({ opacity: 1 }); +// jQuery("#notificationColumn").promise().done(function () { +// console.log("done showing"); +// setTimeout(() => { +// hideNotification(); +// }, duration); +// }); +// } + +// function hideNotification() { +// jQuery("#notificationColumn").css({ opacity: 1.0, visibility: "visible" }).animate({ opacity: 0 }); +// jQuery("#notificationColumn").promise().done(function () { +// console.log("done hiding"); +// }); +// } + +// function displayNotification(inContent: string, inDuration: number = 5000) { +// jQuery("#notificationHeading .fl-heading-text")[0].innerText = inContent; +// showNotification(inDuration); +// } + + function dropdownLegendOnChange(inSelector: string) { const dropdownLegend = jQuery(inSelector).get(0); dropdownLegend.addEventListener("change", function (this: HTMLSelectElement) { @@ -139,7 +218,6 @@ function dropdownLegendOnChange(inSelector: string) { }); } - function changeDropdownLegendBGColor(inSelector: string, inValue: string, inClassName: string) { let bgColor: string = "#fafafa"; let color: string = "#5c5c5c"; @@ -154,6 +232,124 @@ function changeDropdownLegendBGColor(inSelector: string, inValue: string, inClas jQuery(`${inSelector} option[value="all"]`).css("color", color); } +function addSeatToState(inVenueXML: I.VenueXML, inSelectedSeat: I.JSCSelectedSeat) { + const seatID: string = inSelectedSeat.id; + const seatObj: I.StateJSCSelectedSeats = { + [seatID]: inSelectedSeat + } + + state.selectedSeatsObj = { ...state.selectedSeatsObj, ...seatObj }; + + const pricescaleID: string = state.selectedSeatsObj[seatID].data.seatsObj.id[0]; + const pricescaleObj: I.Pricescale5 | undefined = getVenuePriceStructurePricescaleObjByPricescaleID(inVenueXML, pricescaleID); + console.log(pricescaleObj); + + if (!pricescaleObj) { + console.warn(`Cannot find corresponding venueXML pricescaleObj for pricescale with ID ${pricescaleID}`); + return; + } + + // get id and code of first buyer type + const firstBuyerTypeID: string = pricescaleObj.buyer_type[0].id[0]; + const firstPriceStructureCode: string = inVenueXML.price_structure[0].code[0]; // todo: code of first price_structure always correct? what about multiple schablonen? + + state.selectedSeatsArr.push([seatID, firstBuyerTypeID, firstPriceStructureCode]); +} + +function isValidSeatSelection() { + const selectedSeatIndexes: string = generateSelectedSeatIndexes(); + const url: string = `${inputsWithValue["ticketPurchaseUrl"]}?user_context=${inputsWithValue.user_context}&pid=${inputsWithValue["pid"]}&selected_seat_indexes=${selectedSeatIndexes}&trxstate=148`; + const message: I.Message = { + message: { + url: url, + }, + from: "child", + event: "child_needCheckoutResponse", + date: Date.now() + }; + Communication.sendMessage(message, "parent"); +} + +function generateSelectedSeatIndexes(): string { + return (state.selectedSeatsArr.map(function (arr) { + return arr.join(","); + })).join("|"); +} + +function getVenuePriceStructurePricescaleObjByPricescaleID(inVenueXML: I.VenueXML, inID: string): I.Pricescale5 | undefined { + const venuePricescaleArr: I.Pricescale5[] = inVenueXML.price_structure[0].pricescale; + return venuePricescaleArr.find(obj => { + return obj.id[0] === inID; + }); +} + +function removeSeatFromState(inSelectedSeat: I.JSCSelectedSeat) { + const seatID: string = inSelectedSeat.id; + delete state.selectedSeatsObj[seatID]; + const index = state.selectedSeatsArr.findIndex(arr => { + return arr[0] === inSelectedSeat.id; + }); + state.selectedSeatsArr.splice(index, 1); +} + +function calcOverallPrice(inVenueXML: I.VenueXML): string | undefined { + if (!state.selectedSeatsArr.length) + return; + + let overallPrice: number = 0; + + state.selectedSeatsArr.forEach(arr => { + const seatID: string = arr[0]; + const buyertypeID: string = arr[1]; + + // const selectedSeat: I.JSCSelectedSeat = seatmap.get(seatID).settings; + const selectedSeat: I.JSCSelectedSeat = state.selectedSeatsObj[seatID]; + + const pricescaleID: string = selectedSeat.data.seatsObj.id[0]; + const pricescaleObj: I.Pricescale5 | undefined = getVenuePriceStructurePricescaleObjByPricescaleID(inVenueXML, pricescaleID); + + if (!pricescaleObj) + return; + + const seatPrice: number | undefined = getPriceByBuyertypeID(buyertypeID, pricescaleObj); + + if (!seatPrice) + return; + + overallPrice += seatPrice; + }); + + + state.priceOverall = overallPrice.toFixed(2); + + return state.priceOverall; +} + +function getPriceByBuyertypeID(inBuyertypeID: string, inPricescaleObj: I.Pricescale5) { + const price = inPricescaleObj?.buyer_type.find(arr => { + return arr.id[0] === inBuyertypeID; + })?.price[0]; + + if (price) + return parseFloat(price); + else + return undefined; +} + +function setBtnCartText() { + const numTickets = state.selectedSeatsArr.length; + let text: string = ""; + + console.log(numTickets); + + if (state.priceOverall !== "") + numTickets === 1 ? text = `${numTickets} Ticket für €${state.priceOverall}` : text = `${numTickets} Tickets für €${state.priceOverall}`; + else + text = "0 Tickets für €0.00"; + + jQuery("#btnCart .fl-button-text")[0].innerText = text; +} + function addSeatmap(inSelector: string, inMap: string[], inRows: number[], inSeats: I.JSCSeats, inLegend: I.JSCLegend): void { // console.log(inSeatmapInitMap); @@ -189,19 +385,33 @@ function addSeatmap(inSelector: string, inMap: string[], inRows: number[], inSea legend: inLegend, click: function () { if (this.status() == 'available') { - console.log("available"); - console.log(this); - //do some stuff, i.e. add to the cart + const selectedSeat: I.JSCSelectedSeat = this.settings; + console.log("seat selected"); + console.log(selectedSeat); + + addSeatToState(inVenueXML, selectedSeat); + + calcOverallPrice(inVenueXML); + setBtnCartText(); + console.log(state.selectedSeatsArr); + return 'selected'; } else if (this.status() == 'selected') { - console.log("selected"); - //seat has been vacated + const selectedSeat: I.JSCSelectedSeat = this.settings; + console.log("seat unselected"); + + removeSeatFromState(selectedSeat); + + calcOverallPrice(inVenueXML); + setBtnCartText(); + console.log(state.selectedSeatsArr); + return 'available'; } else if (this.status() == 'unavailable') { console.log("unavailable"); - //seat has been already booked + return 'unavailable'; } else { @@ -211,18 +421,4 @@ function addSeatmap(inSelector: string, inMap: string[], inRows: number[], inSea }); console.log(seatmap); - - // //Make all available 'c' seats unavailable - // sc.find('c.available').status('unavailable'); - - // /* - // // Get seats with ids 2_6, 1_7 (more on ids later on) - // put them in a jQuery set and change some css - // */ - // sc.get(['2_6', '1_7']).node().css({ - // color: '#ffcfcf' - // }); - - // console.log('Seat 1_2 costs ' + sc.get('1_2').data().price + ' and is currently ' + sc.status('1_2')); - } \ No newline at end of file diff --git a/client/src/types/types.d.ts b/client/src/types/types.d.ts index 0261a22..3d0c086 100644 --- a/client/src/types/types.d.ts +++ b/client/src/types/types.d.ts @@ -1,3 +1,13 @@ +export interface State { + priceOverall: string; + selectedSeatsArr: string[][]; + selectedSeatsObj: StateJSCSelectedSeats +} + +export interface StateJSCSelectedSeats { + [key: string]: JSCSelectedSeat; +} + export interface Inputs { [key: string]: string; } @@ -42,6 +52,7 @@ export interface InputsWithValue { venueImageSrc: string; venueImageHeight: number; venueImageWidth: number; + ticketPurchaseUrl: string; } export interface Config { @@ -58,6 +69,7 @@ export interface Config { urlCSSParentStaging: string; urlCSSParentMaster: string; childHasVenueXML: boolean; + urlCSSjQueryUI: string; } export interface Message { @@ -337,4 +349,27 @@ export interface JSCLegend { export interface JSCAvailability { available_selectable_mask: string[]; unavailable_unselectable_mask: string[]; +} + +// JSC seatObj settings +export interface Data { + classes: string; + seatsObj: SeatsObj; +} + +export interface Node { + [key: number]: JQuery; + length: number; +} + +export interface JSCSelectedSeat { + status: string; + style: string; + data: Data; + id: string; + label: string; + row: number; + column: number; + character: string; + $node: Node; } \ No newline at end of file