From a9d835105ca56c55c5c56c04a82f7d1ce7a5fa8c Mon Sep 17 00:00:00 2001 From: hdsldv <88383112+hdsldv@users.noreply.github.com> Date: Fri, 26 Nov 2021 14:25:54 +0100 Subject: [PATCH] OLMIS-7443 Add lot management view page --- npm-shrinkwrap.json | 787 +++++++++++++++++- src/admin-lot-list/admin-lot-list.module.js | 34 + src/admin-lot-list/admin-lot-list.routes.js | 114 +++ .../admin-lot-list.routes.spec.js | 229 +++++ src/admin-lot-list/lot-list.controller.js | 128 +++ .../lot-list.controller.spec.js | 104 +++ src/admin-lot-list/lot-list.html | 49 ++ src/admin-lot-list/messages_en.json | 15 + .../administration-rights.constant.js | 3 +- 9 files changed, 1461 insertions(+), 2 deletions(-) create mode 100644 src/admin-lot-list/admin-lot-list.module.js create mode 100644 src/admin-lot-list/admin-lot-list.routes.js create mode 100644 src/admin-lot-list/admin-lot-list.routes.spec.js create mode 100644 src/admin-lot-list/lot-list.controller.js create mode 100644 src/admin-lot-list/lot-list.controller.spec.js create mode 100644 src/admin-lot-list/lot-list.html create mode 100644 src/admin-lot-list/messages_en.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0e3acd61..9d20cfb1 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -57,9 +57,33 @@ "url-loader": "~4.1.1", "webpack": "~4.46.0", "webpack-cli": "~4.7.2", - "wiredep-away": "~0.1.3" + "wiredep-away": "~0.1.3", + "workbox-cacheable-response": "^6.3.0", + "workbox-expiration": "^6.3.0", + "workbox-precaching": "^6.3.0", + "workbox-routing": "^6.3.0", + "workbox-strategies": "^6.3.0", + "workbox-webpack-plugin": "~6.3.0" }, "dependencies": { + "@apideck/better-ajv-errors": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.2.7.tgz", + "integrity": "sha512-J2dW+EHYudbwI7MGovcHWLBrxasl21uuroc2zT8bH2RxYuv2g5GqsO5jcKUZz4LaMST45xhKjVuyRYkhcWyMhA==", + "dev": true, + "requires": { + "json-schema": "^0.3.0", + "leven": "^3.1.0" + }, + "dependencies": { + "json-schema": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.3.0.tgz", + "integrity": "sha512-TYfxx36xfl52Rf1LU9HyWSLGPdYLL+SQ8/E/0yVyKG8wCCDaSrhPap0vEdlsZWRaS6tnKKLPGiEJGiREVC8kxQ==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", @@ -1261,6 +1285,67 @@ } } }, + "@rollup/plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "dev": true, + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", @@ -1289,6 +1374,21 @@ "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", "dev": true }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -2590,6 +2690,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -3173,6 +3279,12 @@ "graceful-readlink": ">= 1.0.0" } }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -3821,6 +3933,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4112,6 +4230,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, "electron-to-chromium": { "version": "1.3.848", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.848.tgz", @@ -4733,6 +4857,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5682,6 +5812,12 @@ "has-symbols": "^1.0.1" } }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -6814,6 +6950,12 @@ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true }, + "idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", + "dev": true + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7094,6 +7236,12 @@ "lower-case": "^1.1.0" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", @@ -7196,6 +7344,12 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, + "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-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -7950,6 +8104,12 @@ "invert-kv": "^1.0.0" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -8159,6 +8319,12 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8253,6 +8419,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9821,6 +9996,12 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11098,6 +11279,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -11209,6 +11396,47 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "2.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", + "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -12795,6 +13023,12 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -13066,6 +13300,17 @@ } } }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", @@ -13098,6 +13343,12 @@ "is-utf8": "^0.2.0" } }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -13210,6 +13461,47 @@ "yallist": "^4.0.0" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -13469,6 +13761,15 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -13565,6 +13866,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14539,6 +14846,12 @@ } } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "webpack": { "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", @@ -15262,6 +15575,17 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -15332,6 +15656,467 @@ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true }, + "workbox-background-sync": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.3.0.tgz", + "integrity": "sha512-79Wznt6oO8xMmLiErRS4zENUEldFHj1/5IiuHsY3NgGRN5rJdvGW6hz+RERhWzoB7rd/vXyAQdKYahGdsiYG1A==", + "dev": true, + "requires": { + "idb": "^6.0.0", + "workbox-core": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + } + } + }, + "workbox-broadcast-update": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.3.0.tgz", + "integrity": "sha512-hp7Du6GJzK99wak5cQFhcSBxvcS+2fkFcxiMmz/RsQ5GQNxVcbiovq74w5aNCzuv3muQvICyC1XELZhZ4GYRTQ==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + } + } + }, + "workbox-build": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.3.0.tgz", + "integrity": "sha512-Th93AaC+88ZvJje0acTjCCCvU3tGenxJht5xUALXHW+Mzk3I5SMzTFwKn5F3e1iZ+M7U2jjfpMXe/sJ4UMx46A==", + "dev": true, + "requires": { + "@apideck/better-ajv-errors": "^0.2.4", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^1.4.1", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.3.0", + "workbox-broadcast-update": "6.3.0", + "workbox-cacheable-response": "6.3.0", + "workbox-core": "6.3.0", + "workbox-expiration": "6.3.0", + "workbox-google-analytics": "6.3.0", + "workbox-navigation-preload": "6.3.0", + "workbox-precaching": "6.3.0", + "workbox-range-requests": "6.3.0", + "workbox-recipes": "6.3.0", + "workbox-routing": "6.3.0", + "workbox-strategies": "6.3.0", + "workbox-streams": "6.3.0", + "workbox-sw": "6.3.0", + "workbox-window": "6.3.0" + }, + "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "workbox-cacheable-response": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.3.0.tgz", + "integrity": "sha512-oYCRGF6PFEmJJkktdxYw/tcrU8N5u/2ihxVSHd+9sNqjNMDiXLqsewcEG544f1yx7gq5/u6VcvUA5N62KzN1GQ==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + }, + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + }, + "workbox-expiration": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.3.0.tgz", + "integrity": "sha512-teYuYfM3HFbwAD/nlZDw/dCMOrCKjsAiMRhz0uOy9IkfBb7vBynO3xf118lY62X6BfqjZdeahiHh10N0/aYICg==", + "dev": true, + "requires": { + "idb": "^6.0.0", + "workbox-core": "6.3.0" + } + }, + "workbox-precaching": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.3.0.tgz", + "integrity": "sha512-bND3rUxiuzFmDfeKywdvOqK0LQ5LLbOPk0eX22PlMQNOOduHRxzglMpgHo/MR6h+8cPJ3GpxT8hZ895/7bHMqQ==", + "dev": true, + "requires": { + "workbox-core": "6.3.0", + "workbox-routing": "6.3.0", + "workbox-strategies": "6.3.0" + } + }, + "workbox-routing": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.3.0.tgz", + "integrity": "sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + }, + "workbox-strategies": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.3.0.tgz", + "integrity": "sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.1.tgz", + "integrity": "sha512-omXplP3miJhQwx+jfFnqO9xWgNc8CLG6EWRvTyc8R81cA/4zhqh87yj9UVH+fGUmuIXOUBPAuulSazXUsvKFWg==", + "dev": true, + "requires": { + "workbox-core": "6.4.1" + } + }, + "workbox-core": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.1.tgz", + "integrity": "sha512-5hosqpSK+48jHlj+5EHN5dtH1Ade4fqTe4+xX3U9wWK1SDaXEqXpVxdHuBqYfg75UE1PUINA0rhMZWTqeGoLFg==", + "dev": true + }, + "workbox-expiration": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.1.tgz", + "integrity": "sha512-N912AGhi95vhf2vebE3wPhnGjnR+t5W4yALDY7Pl6bcuhySNbwkkp2RjQcBB+dxrdiX2rOvavvdcf/q1LSnEyg==", + "dev": true, + "requires": { + "idb": "^6.1.4", + "workbox-core": "6.4.1" + } + }, + "workbox-google-analytics": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.3.0.tgz", + "integrity": "sha512-6u0y21rtimnrCKpvayTkwh9y4Y5Xdn6X87x895WzwcOcWA2j/Nl7nmCpB0wjjhqU9pMj7B2lChqfypP+xUs5IA==", + "dev": true, + "requires": { + "workbox-background-sync": "6.3.0", + "workbox-core": "6.3.0", + "workbox-routing": "6.3.0", + "workbox-strategies": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + }, + "workbox-routing": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.3.0.tgz", + "integrity": "sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + }, + "workbox-strategies": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.3.0.tgz", + "integrity": "sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + } + } + }, + "workbox-navigation-preload": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.3.0.tgz", + "integrity": "sha512-D7bomh9SCn1u6n32FqAWfyHe2dkK6mWbwcTsoeBnFSD0p8Gr9Zq1Mpt/DitEfGIQHck90Zd024xcTFLkjczS/Q==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + } + } + }, + "workbox-precaching": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.1.tgz", + "integrity": "sha512-Sq8d+/wfcXFjwuVwKe2VxD4QddRBgkO6pJVgpHbk5WFynR8dc8Zj3BlJ38e4nMlRuBZ8996TIgAmk/U6Rr5YHQ==", + "dev": true, + "requires": { + "workbox-core": "6.4.1", + "workbox-routing": "6.4.1", + "workbox-strategies": "6.4.1" + } + }, + "workbox-range-requests": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.3.0.tgz", + "integrity": "sha512-AHnGtfSvc/fBt+8NCVT6jVcshv7oFkiuS94YsedQu2sIN1jKHkxLaj7qMBl818FoY6x7r0jw1WLmG/QDmI1/oA==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + } + } + }, + "workbox-recipes": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.3.0.tgz", + "integrity": "sha512-f0AZyxd48E4t+PV+ifgIf8WodfJqRj8/E0t+PwppDIdTPyD59cIh0HZBtgPKFdIMVnltodpMz4zioxym1H3GjQ==", + "dev": true, + "requires": { + "workbox-cacheable-response": "6.3.0", + "workbox-core": "6.3.0", + "workbox-expiration": "6.3.0", + "workbox-precaching": "6.3.0", + "workbox-routing": "6.3.0", + "workbox-strategies": "6.3.0" + }, + "dependencies": { + "workbox-cacheable-response": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.3.0.tgz", + "integrity": "sha512-oYCRGF6PFEmJJkktdxYw/tcrU8N5u/2ihxVSHd+9sNqjNMDiXLqsewcEG544f1yx7gq5/u6VcvUA5N62KzN1GQ==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + }, + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + }, + "workbox-expiration": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.3.0.tgz", + "integrity": "sha512-teYuYfM3HFbwAD/nlZDw/dCMOrCKjsAiMRhz0uOy9IkfBb7vBynO3xf118lY62X6BfqjZdeahiHh10N0/aYICg==", + "dev": true, + "requires": { + "idb": "^6.0.0", + "workbox-core": "6.3.0" + } + }, + "workbox-precaching": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.3.0.tgz", + "integrity": "sha512-bND3rUxiuzFmDfeKywdvOqK0LQ5LLbOPk0eX22PlMQNOOduHRxzglMpgHo/MR6h+8cPJ3GpxT8hZ895/7bHMqQ==", + "dev": true, + "requires": { + "workbox-core": "6.3.0", + "workbox-routing": "6.3.0", + "workbox-strategies": "6.3.0" + } + }, + "workbox-routing": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.3.0.tgz", + "integrity": "sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + }, + "workbox-strategies": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.3.0.tgz", + "integrity": "sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + } + } + }, + "workbox-routing": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.1.tgz", + "integrity": "sha512-FIy27mwM3WdDASOTMX10OZ8q3Un47ULeDtDrDAKfWYIP/oTF2xoA1/HtXpOjBlyg5VP/poPX5GDojXHXAXpfzQ==", + "dev": true, + "requires": { + "workbox-core": "6.4.1" + } + }, + "workbox-strategies": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.1.tgz", + "integrity": "sha512-2UQ+7Siy4Z5QG2LebbVhDLmPG3M7bVo/tZqN4LNUGXS6fDlpbTTK6A3Hu0W8gCVwIX0tSg7U3mVhDntH4qt3Dg==", + "dev": true, + "requires": { + "workbox-core": "6.4.1" + } + }, + "workbox-streams": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.3.0.tgz", + "integrity": "sha512-CiRsuoXJOytA7IQriRu6kVCa0L4OdNi0DdniiSageu/EZuxTswNXpgVzkGE4IDArU/5jlzgRtwqrqIWCJX+OMA==", + "dev": true, + "requires": { + "workbox-core": "6.3.0", + "workbox-routing": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + }, + "workbox-routing": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.3.0.tgz", + "integrity": "sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg==", + "dev": true, + "requires": { + "workbox-core": "6.3.0" + } + } + } + }, + "workbox-sw": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.3.0.tgz", + "integrity": "sha512-xwrXRBzw5jwJ7VdAQkTSNTbNZ4S6VhXtbZZ0vY6XKNQARO5nuGphNdif+hJFIejHUgtV6ESpQnixPj5hYB2jKQ==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.3.0.tgz", + "integrity": "sha512-3l5H8h7O2eUgTAISQoglDe4VJDDYTZaDnkRY0FY2+eFOXA+fZoWuDSmLiMnA0uYqPC4NWVTZwP549E0dWgiWjw==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "source-map-url": "^0.4.0", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.3.0" + }, + "dependencies": { + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + } + } + }, + "workbox-window": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.3.0.tgz", + "integrity": "sha512-CFP84assX9srH/TOx4OD8z4EBPO/Cq4WKdV2YLcJIFJmVTS/cB63XKeidKl2KJk8qOOLVIKnaO7BLmb0MxGFtA==", + "dev": true, + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.3.0" + }, + "dependencies": { + "workbox-core": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz", + "integrity": "sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==", + "dev": true + } + } + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/src/admin-lot-list/admin-lot-list.module.js b/src/admin-lot-list/admin-lot-list.module.js new file mode 100644 index 00000000..c9287bb6 --- /dev/null +++ b/src/admin-lot-list/admin-lot-list.module.js @@ -0,0 +1,34 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +(function() { + + 'use strict'; + + /** + * @module admin-lot-list + * + * @description + * Provides lot list screen for administrator. + */ + angular.module('admin-lot-list', [ + 'openlmis-admin', + 'openlmis-pagination', + 'openlmis-repository', + 'openlmis-rights', + 'referencedata-lot', + 'referencedata-orderable' + ]); +})(); diff --git a/src/admin-lot-list/admin-lot-list.routes.js b/src/admin-lot-list/admin-lot-list.routes.js new file mode 100644 index 00000000..979b993e --- /dev/null +++ b/src/admin-lot-list/admin-lot-list.routes.js @@ -0,0 +1,114 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +(function() { + + 'use strict'; + + angular.module('admin-lot-list').config(routes); + + routes.$inject = ['$stateProvider', 'ADMINISTRATION_RIGHTS']; + + function routes($stateProvider, ADMINISTRATION_RIGHTS) { + + $stateProvider.state('openlmis.administration.lots', { + showInNavigation: true, + label: 'adminLotList.lots', + url: '/lots?orderableId&expirationDateFrom&expirationDateTo&page&size', + controller: 'LotListController', + templateUrl: 'admin-lot-list/lot-list.html', + controllerAs: 'vm', + accessRights: [ADMINISTRATION_RIGHTS.LOTS_MANAGE], + resolve: { + paginatedLots: function($q, $stateParams, paginationService, lotService) { + return paginationService.registerUrl($stateParams, function(stateParams) { + if (!stateParams.hasOwnProperty('orderableId') + || stateParams.orderableId === null) { + return $q(function(resolve) { + resolve({ + content: [] + }); + }); + } + + var params = angular.copy(stateParams); + + params.page = stateParams.page; + params.size = stateParams.size; + params.tradeItemIdIgnored = true; + + if (params.orderableId === '*') { + delete params.orderableId; + } + + return lotService.query(params); + }); + }, + lots: function(paginatedLots, orderables) { + return paginatedLots.map(function(lot) { + var orderable = orderables.find(function(p) { + if (p.identifiers.hasOwnProperty('tradeItem') && lot.tradeItemId !== null) { + return p.identifiers.tradeItem.toLowerCase() + === lot.tradeItemId.toLowerCase(); + } + + return false; + }); + + var noProductMsg = 'No product'; + + return { + productCode: orderable === undefined + ? noProductMsg + : orderable.productCode, + productName: orderable === undefined + ? noProductMsg + : orderable.fullProductName, + lotCode: lot.lotCode, + expirationDate: lot.expirationDate, + manufacturedDate: lot.manufactureDate + }; + }); + }, + orderables: function($q, orderableService) { + var deferred = $q.defer(); + + orderableService.search().then(function(response) { + // NOP Confirm that only orderables with lots should be visible + // deferred.resolve(response.content.filter(function (x) { + // return !angular.equals(x.identifiers, {}); + // })); + deferred.resolve(response.content); + }, deferred.reject); + + return deferred.promise; + }, + orderablesFilterOptions: function(orderables) { + return [ + { + value: '*', + name: 'All' + } + ].concat(orderables.map(function(p) { + return { + value: p.id, + name: p.fullProductName + }; + })); + } + } + }); + } +})(); diff --git a/src/admin-lot-list/admin-lot-list.routes.spec.js b/src/admin-lot-list/admin-lot-list.routes.spec.js new file mode 100644 index 00000000..23699f4a --- /dev/null +++ b/src/admin-lot-list/admin-lot-list.routes.spec.js @@ -0,0 +1,229 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +describe('openlmis.administration.lot state', function() { + + 'use strict'; + + beforeEach(function() { + module('admin-lot-list'); + + inject(function($injector) { + this.$state = $injector.get('$state'); + this.$location = $injector.get('$location'); + this.$rootScope = $injector.get('$rootScope'); + this.$q = $injector.get('$q'); + this.$templateCache = $injector.get('$templateCache'); + this.$stateParams = $injector.get('$stateParams'); + + this.orderableService = $injector.get('orderableService'); + this.lotService = $injector.get('lotService'); + + this.PageDataBuilder = $injector.get('PageDataBuilder'); + this.OrderableDataBuilder = $injector.get('OrderableDataBuilder'); + this.LotDataBuilder = $injector.get('LotDataBuilder'); + }); + + this.orderableWithTradeItem = new this.OrderableDataBuilder().build(); + this.orderableWithTradeItem.identifiers = { + tradeItem: 'tradeItem' + }; + this.orderables = [ + new this.OrderableDataBuilder().build(), + new this.OrderableDataBuilder().build() + ]; + + spyOn(this.orderableService, 'search').andReturn(this.$q.when( + new this.PageDataBuilder() + .withContent(this.orderables) + .build() + )); + + this.defaultLot = new this.LotDataBuilder().build(); + + spyOn(this.lotService, 'query').andReturn(this.$q.when( + new this.PageDataBuilder() + .withContent([this.defaultLot]) + .build() + )); + + this.$state.go('openlmis'); + this.$rootScope.$apply(); + + this.goToUrl = function(url) { + this.$location.url(url); + this.$rootScope.$apply(); + }; + + this.getResolvedValue = function(name) { + return this.$state.$current.locals.globals[name]; + }; + }); + + it('should be available under /administration/lot URL', function() { + expect(this.$state.current.name).not.toEqual('openlmis.administration.lots'); + + this.goToUrl('/administration/lots'); + + expect(this.$state.current.name).toEqual('openlmis.administration.lots'); + }); + + it('should use template', function() { + spyOn(this.$templateCache, 'get').andCallThrough(); + + this.goToUrl('/administration/lots'); + + expect(this.$templateCache.get).toHaveBeenCalledWith('admin-lot-list/lot-list.html'); + }); + + it('should resolve orderables', function() { + this.goToUrl('/administration/lots'); + + expect(this.$state.current.name).toEqual('openlmis.administration.lots'); + expect(this.getResolvedValue('orderables')).toEqual(this.orderables); + expect(this.orderableService.search).toHaveBeenCalled(); + }); + + it('should resolve orderablesFilterOptions with All option as first element', function() { + this.goToUrl('/administration/lots'); + + var options = this.getResolvedValue('orderablesFilterOptions'); + + expect(options[0].value).toEqual('*'); + expect(options[0].name).toEqual('All'); + }); + + it('should resolve empty paginatedLots when orderableId filter is empty ', function() { + this.goToUrl('/administration/lots'); + + var paginatedLots = this.getResolvedValue('paginatedLots'); + + expect(paginatedLots.length).toEqual(0); + }); + + it('should resolve non-empty paginatedLots when orderableId filter is * ', function() { + this.lotService.query.andReturn(this.$q.when({ + content: [ + new this.LotDataBuilder().build() + ] + })); + + this.goToUrl('/administration/lots?orderableId=*'); + + var paginatedLots = this.getResolvedValue('paginatedLots'); + + expect(this.lotService.query).toHaveBeenCalledWith({ + page: 0, + size: 10, + tradeItemIdIgnored: true + }); + + expect(paginatedLots.length).toNotEqual(0); + }); + + it('should resolve non-empty paginatedLots when orderableId filter is set ', function() { + var lot = new this.LotDataBuilder().build(); + this.lotService.query.andReturn(this.$q.when({ + content: [lot] + })); + + this.goToUrl('/administration/lots?orderableId=123'); + + var paginatedLots = this.getResolvedValue('paginatedLots'); + + expect(this.lotService.query).toHaveBeenCalledWith({ + page: 0, + size: 10, + tradeItemIdIgnored: true, + orderableId: '123' + }); + + expect(paginatedLots.length).toEqual(1); + expect(paginatedLots[0]).toEqual(lot); + }); + + it('should resolve non-empty paginatedLots when expirationDateFrom filter is set ', function() { + var lot = new this.LotDataBuilder().build(); + this.lotService.query.andReturn(this.$q.when({ + content: [lot] + })); + + this.goToUrl('/administration/lots?expirationDateFrom=1970-01-01&orderableId=*'); + + var paginatedLots = this.getResolvedValue('paginatedLots'); + + expect(this.lotService.query).toHaveBeenCalledWith({ + page: 0, + size: 10, + tradeItemIdIgnored: true, + expirationDateFrom: '1970-01-01' + }); + + expect(paginatedLots.length).toEqual(1); + expect(paginatedLots[0]).toEqual(lot); + }); + + it('should resolve non-empty paginatedLots when expirationDateTo filter is set ', function() { + var lot = new this.LotDataBuilder().build(); + this.lotService.query.andReturn(this.$q.when({ + content: [lot] + })); + + this.goToUrl('/administration/lots?expirationDateTo=1970-01-01&orderableId=*'); + + var paginatedLots = this.getResolvedValue('paginatedLots'); + + expect(this.lotService.query).toHaveBeenCalledWith({ + page: 0, + size: 10, + tradeItemIdIgnored: true, + expirationDateTo: '1970-01-01' + }); + + expect(paginatedLots.length).toEqual(1); + + expect(paginatedLots[0]).toEqual(lot); + }); + + it('should resolve lots ', function() { + var orderableWithTradeItem = new this.OrderableDataBuilder().build(); + orderableWithTradeItem.identifiers = { + tradeItem: 'tradeItem' + }; + + this.orderableService.search.andReturn(this.$q.when( + new this.PageDataBuilder() + .withContent([orderableWithTradeItem]) + .build() + )); + + var lotWithMatchingOrderable = new this.LotDataBuilder().build(); + lotWithMatchingOrderable.tradeItemId = 'tradeItem'; + + this.lotService.query.andReturn(this.$q.when({ + content: [ + lotWithMatchingOrderable, + new this.LotDataBuilder().build() + ] + })); + + this.goToUrl('/administration/lots?orderableId=*'); + + var lots = this.getResolvedValue('lots'); + + expect(lots.length).toEqual(2); + }); + +}); diff --git a/src/admin-lot-list/lot-list.controller.js b/src/admin-lot-list/lot-list.controller.js new file mode 100644 index 00000000..f4e022ab --- /dev/null +++ b/src/admin-lot-list/lot-list.controller.js @@ -0,0 +1,128 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +(function() { + + 'use strict'; + + /** + * @ngdoc controller + * @name admin-lot-list.controller:LotListController + * + * @description + * Controller for managing lot list screen. + */ + angular + .module('admin-lot-list') + .controller('LotListController', controller); + + controller.$inject = ['$state', '$stateParams', 'lots', 'orderablesFilterOptions']; + + function controller($state, $stateParams, lots, orderablesFilterOptions) { + + var vm = this; + vm.$onInit = onInit; + + /** + * @ngdoc property + * @propertyOf admin-lot-list.controller:LotListController + * @name lots + * @type {Array} + * + * @description + * Contains filtered lots. + */ + vm.lots = []; + + /** + * @ngdoc property + * @propertyOf admin-lot-list.controller:LotListController + * @name orderablesFilterOptions + * @type {Array} + * + * @description + * Contains orderables visible in filter + */ + vm.orderablesFilterOptions = []; + + /** + * @ngdoc property + * @propertyOf admin-lot-list.controller:LotListController + * @name orderableId + * @type {String} + * + * @description + * Orderable id to filter by + * When set to null, no lots are visible + * When set to '*', all lots are visible + * When set to uuid, lots for specific orderable are visible + */ + vm.orderableId = null; + + /** + * @ngdoc property + * @propertyOf admin-lot-list.controller:LotListController + * @name expirationDateFrom + * @type {String} + */ + vm.expirationDateFrom = null; + + /** + * @ngdoc property + * @propertyOf admin-lot-list.controller:LotListController + * @name expirationDateTo + * @type {String} + */ + vm.expirationDateTo = null; + + /** + * @ngdoc method + * @methodOf admin-lot-list.controller:LotListController + * @name search + * + * @description + * Filters lots + */ + vm.search = function() { + var stateParams = angular.copy($stateParams); + + stateParams.orderableId = vm.orderableId; + stateParams.expirationDateFrom = vm.expirationDateFrom; + stateParams.expirationDateTo = vm.expirationDateTo; + + $state.go('openlmis.administration.lots', stateParams, { + reload: true + }); + }; + + /** + * @ngdoc method + * @methodOf admin-lot-list.controller:LotListController + * @name $onInit + * + * @description + * Initializes controller + */ + function onInit() { + vm.lots = lots; + vm.orderablesFilterOptions = orderablesFilterOptions; + + vm.orderableId = $stateParams.orderableId; + vm.expirationDateFrom = $stateParams.expirationDateFrom; + vm.expirationDateTo = $stateParams.expirationDateTo; + } + } + +})(); diff --git a/src/admin-lot-list/lot-list.controller.spec.js b/src/admin-lot-list/lot-list.controller.spec.js new file mode 100644 index 00000000..8d5973c0 --- /dev/null +++ b/src/admin-lot-list/lot-list.controller.spec.js @@ -0,0 +1,104 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +describe('LotListController', function() { + + beforeEach(function() { + module('admin-lot-list'); + + inject(function($injector) { + this.$controller = $injector.get('$controller'); + this.$state = $injector.get('$state'); + + this.LotDataBuilder = $injector.get('LotDataBuilder'); + }); + + this.lots = [ + new this.LotDataBuilder().build(), + new this.LotDataBuilder().build() + ]; + + this.orderablesFilterOptions = [ + { + value: '1', + name: 'Option 1' + } + ]; + + this.stateParams = { + page: 0, + size: 10 + }; + + this.vm = this.$controller('LotListController', { + lots: this.lots, + orderablesFilterOptions: this.orderablesFilterOptions, + $stateParams: this.stateParams + }); + + this.vm.$onInit(); + + spyOn(this.$state, 'go').andReturn(); + }); + + describe('onInit', function() { + + it('should expose search method', function() { + expect(typeof this.vm.search).toBe('function'); + }); + + it('should expose lots array', function() { + expect(this.vm.lots).toEqual(this.lots); + }); + + it('should expose orderablesFilterOptions', function() { + expect(this.vm.orderablesFilterOptions).toEqual(this.orderablesFilterOptions); + }); + }); + + describe('search', function() { + + it('should set orderableId param', function() { + this.vm.orderableId = '*'; + + this.vm.search(); + + expect(this.$state.go).toHaveBeenCalledWith('openlmis.administration.lots', { + page: this.stateParams.page, + size: this.stateParams.size, + orderableId: '*' + }, { + reload: true + }); + }); + + it('should set expirationDate range params', function() { + this.vm.expirationDateFrom = '1970-01-01'; + this.vm.expirationDateTo = '1970-01-02'; + + this.vm.search(); + + expect(this.$state.go).toHaveBeenCalledWith('openlmis.administration.lots', { + page: this.stateParams.page, + size: this.stateParams.size, + expirationDateFrom: '1970-01-01', + expirationDateTo: '1970-01-02' + }, { + reload: true + }); + }); + + }); +}); diff --git a/src/admin-lot-list/lot-list.html b/src/admin-lot-list/lot-list.html new file mode 100644 index 00000000..b9980d08 --- /dev/null +++ b/src/admin-lot-list/lot-list.html @@ -0,0 +1,49 @@ +

{{'adminLotList.lots' | message}}

+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ {{'adminLotList.noLots' | message}} +
{{'adminLotList.productCode' | message}}{{'adminLotList.productName' | message}}{{'adminLotList.lotCode' | message}}{{'adminLotList.expirationDate' | message}}{{'adminLotList.manufacturedDate' | message}}{{'adminLotList.actions' | message}}
{{lot.productCode}}{{lot.productName}}{{lot.lotCode}}{{lot.expirationDate}}{{lot.manufacturedDate}} + +
+ +
diff --git a/src/admin-lot-list/messages_en.json b/src/admin-lot-list/messages_en.json new file mode 100644 index 00000000..297c5ceb --- /dev/null +++ b/src/admin-lot-list/messages_en.json @@ -0,0 +1,15 @@ +{ + "adminLotList.lots": "Lots", + "adminLotList.expirationDateFrom": "Earliest Expiry Date", + "adminLotList.expirationDateTo": "Latest Expiry Date", + "adminLotList.product": "Product", + "adminLotList.search": "Search", + "adminLotList.noLots": "No lots found.", + "adminLotList.productCode": "Product Code", + "adminLotList.productName": "Product Name", + "adminLotList.lotCode": "Lot Code", + "adminLotList.expirationDate": "Expiry date", + "adminLotList.manufacturedDate": "Manufacture Date", + "adminLotList.actions": "Actions", + "adminLotList.edit": "Edit" +} diff --git a/src/openlmis-rights/administration-rights.constant.js b/src/openlmis-rights/administration-rights.constant.js index bf5fa941..207a970a 100644 --- a/src/openlmis-rights/administration-rights.constant.js +++ b/src/openlmis-rights/administration-rights.constant.js @@ -42,7 +42,8 @@ SERVICE_ACCOUNTS_MANAGE: 'SERVICE_ACCOUNTS_MANAGE', PROCESSING_SCHEDULES_MANAGE: 'PROCESSING_SCHEDULES_MANAGE', SYSTEM_NOTIFICATIONS_MANAGE: 'SYSTEM_NOTIFICATIONS_MANAGE', - FACILITY_APPROVED_ORDERABLES_MANAGE: 'FACILITY_APPROVED_ORDERABLES_MANAGE' + FACILITY_APPROVED_ORDERABLES_MANAGE: 'FACILITY_APPROVED_ORDERABLES_MANAGE', + LOTS_MANAGE: 'LOTS_MANAGE' }; }