diff --git a/package-lock.json b/package-lock.json index 5892601c7..ff48229b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "ts-loader": "^9.2.6", "typescript": "5.5", "url-loader": "^4.1.1", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.1.0" } @@ -3300,17 +3300,26 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/express": { @@ -4495,133 +4504,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -4672,12 +4696,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", @@ -4704,12 +4730,16 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { @@ -4771,7 +4801,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4787,7 +4816,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4804,7 +4832,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -5079,20 +5106,20 @@ } }, "node_modules/axios": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", - "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5234,6 +5261,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5548,9 +5584,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -5565,11 +5601,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -5717,9 +5755,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "funding": [ { "type": "opencollective", @@ -6916,9 +6954,10 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", - "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==" + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "license": "ISC" }, "node_modules/elliptic": { "version": "6.6.1", @@ -6961,12 +7000,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -7111,9 +7151,10 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -7172,6 +7213,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -7784,7 +7826,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -7801,8 +7844,7 @@ "node_modules/fast-uri": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -7955,15 +7997,16 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8181,7 +8224,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", @@ -9638,8 +9682,7 @@ "node_modules/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 + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -9805,11 +9848,16 @@ "dev": true }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -10202,9 +10250,10 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -10705,9 +10754,10 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11518,7 +11568,6 @@ "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, "engines": { "node": ">=0.10.0" } @@ -11810,10 +11859,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -12778,11 +12826,16 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -12803,15 +12856,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -12835,29 +12889,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12879,28 +12910,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -13443,9 +13452,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -13460,9 +13469,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -13475,6 +13485,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -13483,6 +13494,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -13667,9 +13679,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -13694,33 +13707,36 @@ "license": "Apache-2.0" }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -13891,58 +13907,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/package.json b/package.json index cbc54d057..1a98a62fd 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "ts-loader": "^9.2.6", "typescript": "5.5", "url-loader": "^4.1.1", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.1.0" }, diff --git a/react/assets/forus-platform/scss/_common/components/tables.scss b/react/assets/forus-platform/scss/_common/components/tables.scss index bdcd56b85..e1a9cd712 100644 --- a/react/assets/forus-platform/scss/_common/components/tables.scss +++ b/react/assets/forus-platform/scss/_common/components/tables.scss @@ -168,12 +168,6 @@ & > a { font: inherit; } - - &.cell-chevron, - &.cell-chevron { - width: 1px; - padding: 10px 0 10px 15px; - } } th { @@ -540,6 +534,14 @@ @include ellipsis(); display: flex; } + + &.td-collapsable-lg { + min-height: 30px; + + .collapsable-content { + font: 500 14px/20px var(--base-font); + } + } } &:first-child { diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss index 50acdff71..3adf0a7fc 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss @@ -249,7 +249,6 @@ .sign_up-pane-link { font: 600 13px/18px var(--base-font); color: var(--sign_up_accent_color); - text-decoration: none; } &.sign_up-pane-text-sm { @@ -311,10 +310,9 @@ } .sign_up-pane-link { - font: 500 14px/27px var(--base-font); - margin: 0 0 15px; + font: 500 14px/20px var(--base-font); color: var(--sign_up_accent_color); - transition: color .4s; + transition: color 0.4s; display: inline; text-decoration: underline; cursor: pointer; @@ -323,6 +321,26 @@ text-decoration: none; color: var(--tc); } + + &.sign_up-pane-link-button { + display: inline-flex; + align-items: center; + background: none; + border: 0; + padding: 0; + + .mdi { + line-height: 20px; + height: 20px; + font-size: 20px; + } + + &[disabled] { + pointer-events: none; + color: #646464 !important; + text-decoration: none; + } + } } .form { @@ -1101,8 +1119,7 @@ padding: 20px; .sign_up-pane-heading, - .sign_up-pane-text, - .sign_up-pane-link { + .sign_up-pane-text { margin: 0 0 15px; } diff --git a/react/assets/forus-webshop/scss/includes/components/table.scss b/react/assets/forus-webshop/scss/includes/components/table.scss index f6a739cfd..08890b559 100644 --- a/react/assets/forus-webshop/scss/includes/components/table.scss +++ b/react/assets/forus-webshop/scss/includes/components/table.scss @@ -17,14 +17,6 @@ table.table { & > a { font: inherit; } - - &.cell-chevron, - &.cell-chevron { - width: 1px; - padding: 10px 10px; - padding-left: 15px; - padding-right: 0; - } } th { diff --git a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx index 46aaa09b5..d642f953e 100644 --- a/react/src/dashboard/components/modals/ModalVouchersUpload.tsx +++ b/react/src/dashboard/components/modals/ModalVouchersUpload.tsx @@ -442,13 +442,16 @@ export default function ModalVouchersUpload({ { icon: 'timer-sand' }, ); - const emails = data.map((voucher) => voucher.identity_email); + const emails = data + .map((voucher) => voucher.identity_email?.toLowerCase()) + .filter((email) => Boolean(email)); + const bsnList = [ ...data.map((voucher) => voucher.relation_bsn), ...data.map((voucher) => voucher.identity_bsn), ]; - const existingEmails = list.filter((row) => emails.includes(row.email)); + const existingEmails = list.filter((row) => emails.includes(row.email?.toLowerCase())); const existingBsn = list.filter((csvRow) => bsnList.includes(csvRow.bsn)); if (existingEmails.length === 0 && existingBsn.length === 0) { diff --git a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx index 68a96f390..7867502d7 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/FundRequestsView.tsx @@ -2,7 +2,7 @@ import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } fr import { useParams } from 'react-router'; import { useFundRequestValidatorService } from '../../../services/FundRequestValidatorService'; import useActiveOrganization from '../../../hooks/useActiveOrganization'; -import FundRequest from '../../../props/models/FundRequest'; +import FundRequest, { FundRequestRecordGroup } from '../../../props/models/FundRequest'; import useSetProgress from '../../../hooks/useSetProgress'; import usePushSuccess from '../../../hooks/usePushSuccess'; import LoadingCard from '../../elements/loading-card/LoadingCard'; @@ -14,30 +14,52 @@ import ModalNotification from '../../modals/ModalNotification'; import FundRequestRecord from '../../../props/models/FundRequestRecord'; import useAuthIdentity from '../../../hooks/useAuthIdentity'; import { ResponseError } from '../../../props/ApiResponses'; -import ModalFundRequestClarify from '../../modals/ModalFundRequestClarify'; import ModalFundRequestDecline from '../../modals/ModalFundRequestDecline'; -import ModalFundRequestRecordEdit from '../../modals/ModalFundRequestRecordEdit'; import ModalFundRequestRecordCreate from '../../modals/ModalFundRequestRecordCreate'; import ModalFundRequestDisregard from '../../modals/ModalFundRequestDisregard'; import ModalFundRequestDisregardUndo from '../../modals/ModalFundRequestDisregardUndo'; import ModalFundRequestAssignValidator from '../../modals/ModalFundRequestAssignValidator'; import useEnvData from '../../../hooks/useEnvData'; -import FundRequestRecordTabs from './elements/FundRequestRecordTabs'; import IdentityPerson from './elements/IdentityPerson'; import useTranslate from '../../../hooks/useTranslate'; import usePushApiError from '../../../hooks/usePushApiError'; -import classNames from 'classnames'; import ModalApproveFundRequest from '../../modals/ModalApproveFundRequest'; import Note from '../../../props/models/Note'; import FundRequestStateLabel from '../../elements/resource-states/FundRequestStateLabel'; import KeyValueItem from '../../elements/key-value/KeyValueItem'; -import TableRowActions from '../../elements/tables/TableRowActions'; import Icon from '../../../../../assets/forus-platform/resources/_platform-common/assets/img/fund-request-icon.svg'; -import TableEmptyValue from '../../elements/table-empty-value/TableEmptyValue'; import useEmailLogService from '../../../services/EmailLogService'; import { Permission } from '../../../props/models/Organization'; import LoaderTableCard from '../../elements/loader-table-card/LoaderTableCard'; import { DashboardRoutes } from '../../../modules/state_router/RouterBuilder'; +import { sortBy } from 'lodash'; +import Employee from '../../../props/models/Employee'; +import classNames from 'classnames'; +import FundRequestRecordsHasClarifications from './elements/FundRequestRecordsHasClarifications'; +import FundRequestGroupRow from './elements/FundRequestGroupRow'; + +export type FundRequestRecordLocal = FundRequestRecord & { hasContent: boolean; group_id?: number }; + +export type FundRequestRecordGroupLocal = FundRequestRecordGroup & { + records?: Array; + hasContent?: boolean; +}; + +export type FundRequestLocal = FundRequest & { + // records: Array; + record_has_clarifications: Array; + record_groups: Array; + assignable_employees: Array; + can_disregarded: boolean; + can_disregarded_undo: boolean; + is_assignable: boolean; + is_assignable_as_supervisor: boolean; + is_assigned: boolean; + can_add_partner_bsn: boolean; + can_resign: boolean; + can_resign_as_supervisor: boolean; + has_actions: boolean; +}; export default function FundRequestsView() { const authIdentity = useAuthIdentity(); @@ -57,7 +79,8 @@ export default function FundRequestsView() { const [fundRequest, setFundRequest] = useState(null); const [showCriteria, setShowCriteria] = useState(null); - const [collapsedRecords, setCollapsedRecords] = useState>([]); + const [uncollapsedRecords, setUncollapsedRecords] = useState>([]); + const [uncollapsedRecordGroups, setUncollapsedRecordGroups] = useState>([]); const fund = useMemo(() => { return fundRequest?.fund; @@ -77,16 +100,16 @@ export default function FundRequestsView() { [activeOrganization], ); - const fundRequestMeta = useMemo(() => { + const fundRequestMeta: FundRequestLocal = useMemo(() => { if (!fundRequest) { return null; } - const { state, records, allowed_employees, employee } = fundRequest; + const { state, allowed_employees, employee } = fundRequest; const isPending = state == 'pending'; const isDisregarded = state == 'disregarded'; - const recordTypes = records.map((record) => record.record_type_key); + const recordTypes = fundRequest.records.map((record) => record.record_type_key); const assignableEmployees = allowed_employees.filter((item) => { return item.identity_address !== authIdentity?.address && item.id !== employee?.id; @@ -114,16 +137,38 @@ export default function FundRequestsView() { }; }); + const records = fundRequest.records.map((record) => ({ + ...record, + hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, + group_id: 0, + })); + + const recordsById = new Map(records.map((record) => [record.id, record])); + + const recordGroups: Array = fundRequest.record_groups.map((group) => { + const groupRecords = (group.record_ids || []) + .map((recordId) => recordsById.get(recordId)) + .filter((record) => record); + + groupRecords.forEach((record) => { + record.group_id = group.id; + }); + + return { + ...group, + records: groupRecords, + hasContent: + groupRecords.filter((record) => { + return record.files?.length || record.clarifications?.length || record.history?.length; + }).length > 0, + }; + }); + return { ...fundRequest, - hasContent: - records.filter((record) => { - return record.files?.length || record.clarifications?.length || record.history?.length; - }).length > 0, - records: fundRequest.records.map((record) => ({ - ...record, - hasContent: record.files.length > 0 || record.clarifications.length > 0 || record.history.length > 0, - })), + + record_has_clarifications: records.filter((record) => record.clarifications?.length), + record_groups: sortBy(recordGroups, 'order'), assignable_employees: assignableEmployees, can_disregarded: isAssigned && isPending, @@ -180,28 +225,6 @@ export default function FundRequestsView() { }, pushApiError); }, [activeOrganization.id, fundRequestMeta?.id, fundRequestService, pushApiError]); - const clarifyRecord = useCallback( - (requestRecord: FundRequestRecord) => { - openModal((modal) => ( - { - if (err) { - return showInfoModal('Error', `Reden: ${err.data.message}`); - } - - reloadRequest(); - pushSuccess('Gelukt!', 'Aanvullingsverzoek op aanvraag verstuurd.'); - }} - /> - )); - }, - [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest, showInfoModal], - ); - const requestApprove = useCallback(() => { if (!enableCustomConfirmationModal) { return openModal((modal) => ( @@ -412,24 +435,6 @@ export default function FundRequestsView() { )); }, [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest]); - const editRecord = useCallback( - (fundRequestRecord: FundRequestRecord) => { - openModal((modal) => ( - { - pushSuccess('Gelukt!', 'Persoonsgegeven toegevoegd.'); - reloadRequest(); - }} - /> - )); - }, - [activeOrganization, fundRequestMeta, openModal, pushSuccess, reloadRequest], - ); - const fetchNotes = useCallback( (query = {}) => fundRequestService.notes(activeOrganization.id, fundRequestMeta.id, query), [activeOrganization?.id, fundRequestMeta?.id, fundRequestService], @@ -462,6 +467,12 @@ export default function FundRequestsView() { return ; } + const hasCollapsedRecordGroups = fundRequestMeta.record_groups.some( + (group) => !uncollapsedRecordGroups.includes(group.id), + ); + const hasCollapsedRecords = fundRequestMeta.records.some((record) => !uncollapsedRecords.includes(record.id)); + const hasCollapsedGroupsOrRecords = hasCollapsedRecordGroups || hasCollapsedRecords; + return (
@@ -706,15 +717,54 @@ export default function FundRequestsView() {
)} + {fundRequestMeta.record_has_clarifications.length > 0 && ( + + )} +
{translate('validation_requests.labels.records')} ({fundRequestMeta.records.length})
- {fundRequestMeta.can_add_partner_bsn && ( -
-
+
+
+ + + {fundRequestMeta.can_add_partner_bsn && ( -
+ )}
- )} +
: null, - }}> - {fundRequestMeta.records.map((record) => ( - - - {fundRequestMeta.hasContent && ( - - {record.hasContent && ( - { - setCollapsedRecords((shownRecords) => { - return shownRecords?.includes(record.id) - ? shownRecords?.filter((id) => id !== record.id) - : [...shownRecords, record.id]; - }); - }} - /> - )} - - )} - {record.record_type.name} - - {record?.record_type.type != 'select' && ( - - {record?.value || 'Niet beschikbaar'} - - )} - - {record?.record_type.type == 'select' && ( - - {record?.record_type.options?.find((option) => option.value == record?.value) - ?.name || 'Niet beschikbaar'} - - )} - - {record.created_at_locale} - - - {fundRequestMeta.is_assigned ? ( - ( -
-
{ - e.close(); - clarifyRecord(record); - }}> - - Aanvullingsverzoek -
- {activeOrganization.allow_fund_request_record_edit && ( -
{ - e.close(); - editRecord(record); - }} - data-dusk="fundRequestRecordEditBtn"> - - Bewerking -
- )} -
- )} - /> - ) : ( - - )} - - - {record.hasContent && !collapsedRecords.includes(record.id) && ( - - - - - - )} -
+ columns={fundRequestService.getRecordGroupsColumns()}> + {fundRequestMeta.record_groups.map((group: FundRequestRecordGroupLocal) => ( + ))}
diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRecordRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRecordRow.tsx new file mode 100644 index 000000000..a67528bbd --- /dev/null +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRecordRow.tsx @@ -0,0 +1,210 @@ +import React, { Fragment, useCallback } from 'react'; +import classNames from 'classnames'; +import TableRowActions from '../../../elements/tables/TableRowActions'; +import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue'; +import FundRequestRecordTabs from './FundRequestRecordTabs'; +import FundRequestRecord from '../../../../props/models/FundRequestRecord'; +import { FundRequestLocal, FundRequestRecordGroupLocal, FundRequestRecordLocal } from '../FundRequestsView'; +import ModalFundRequestClarify from '../../../modals/ModalFundRequestClarify'; +import useOpenModal from '../../../../hooks/useOpenModal'; +import usePushSuccess from '../../../../hooks/usePushSuccess'; +import Organization from '../../../../props/models/Organization'; +import ModalFundRequestRecordEdit from '../../../modals/ModalFundRequestRecordEdit'; +import ModalNotification from '../../../modals/ModalNotification'; +import useTranslate from '../../../../hooks/useTranslate'; +import Label from '../../../elements/image_cropper/Label'; +import EmptyValue from '../../../elements/empty-value/EmptyValue'; + +export default function FundRequestGroupRecordRow({ + organization, + record, + group, + fundRequest, + uncollapsedRecords, + setUncollapsedRecords, + reloadRequest, +}: { + organization: Organization; + record: FundRequestRecordLocal; + group: FundRequestRecordGroupLocal; + fundRequest: FundRequestLocal; + uncollapsedRecords: Array; + setUncollapsedRecords: React.Dispatch>; + reloadRequest: () => void; +}) { + const openModal = useOpenModal(); + const pushSuccess = usePushSuccess(); + const translate = useTranslate(); + + const showInfoModal = useCallback( + (title: string, message: string) => { + openModal((modal) => ( + + )); + }, + [openModal], + ); + + const clarifyRecord = useCallback( + (requestRecord: FundRequestRecord) => { + openModal((modal) => ( + { + if (err) { + return showInfoModal('Error', `Reden: ${err.data.message}`); + } + + reloadRequest(); + pushSuccess('Gelukt!', 'Aanvullingsverzoek op aanvraag verstuurd.'); + }} + /> + )); + }, + [organization, fundRequest, openModal, pushSuccess, reloadRequest, showInfoModal], + ); + + const editRecord = useCallback( + (fundRequestRecord: FundRequestRecord) => { + openModal((modal) => ( + { + pushSuccess('Gelukt!', 'Persoonsgegeven toegevoegd.'); + reloadRequest(); + }} + /> + )); + }, + [organization, fundRequest, openModal, pushSuccess, reloadRequest], + ); + + return ( + + { + if (!record.hasContent) { + return; + } + + setUncollapsedRecords((shownRecords) => { + return shownRecords?.includes(record.id) + ? shownRecords?.filter((id) => id !== record.id) + : [...shownRecords, record.id]; + }); + }}> + {group.hasContent && } + +
+ {record.hasContent && ( +
+
+
+ )} + +
{record.record_type.name}
+
+ + + {record?.record_type.type != 'select' && ( + + {record?.value || 'Niet beschikbaar'} + + )} + + {record?.record_type.type == 'select' && ( + + {record?.record_type.options?.find((option) => option.value == record?.value)?.name || + 'Niet beschikbaar'} + + )} + + {translate(`validation_requests.sources.${record.source}`)} + {record.files.length > 0 ? translate('validation_requests.labels.yes') : } + + {record.clarifications.length > 0 ? translate('validation_requests.labels.yes') : } + + + + {record.clarifications.length > 0 ? ( + + ) : ( + + )} + + + + {fundRequest.is_assigned ? ( + ( +
+
{ + e.close(); + clarifyRecord(record); + }}> + + Aanvullingsverzoek +
+ {organization.allow_fund_request_record_edit && ( +
{ + e.close(); + editRecord(record); + }} + data-dusk="fundRequestRecordEditBtn"> + + Bewerking +
+ )} +
+ )} + /> + ) : ( + + )} + + + {record.hasContent && uncollapsedRecords.includes(record.id) && ( + + {group.hasContent && } + + + + + )} + + ); +} diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRow.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRow.tsx new file mode 100644 index 000000000..27dbae715 --- /dev/null +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestGroupRow.tsx @@ -0,0 +1,99 @@ +import React, { Fragment } from 'react'; +import classNames from 'classnames'; +import TableEmptyValue from '../../../elements/table-empty-value/TableEmptyValue'; +import { FundRequestLocal, FundRequestRecordGroupLocal, FundRequestRecordLocal } from '../FundRequestsView'; +import Organization from '../../../../props/models/Organization'; +import FundRequestGroupRecordRow from './FundRequestGroupRecordRow'; +import useConfigurableTable from '../../vouchers/hooks/useConfigurableTable'; +import { useFundRequestValidatorService } from '../../../../services/FundRequestValidatorService'; + +export default function FundRequestRecordGroupRow({ + organization, + group, + fundRequest, + uncollapsedRecords, + setUncollapsedRecords, + uncollapsedRecordGroups, + setUncollapsedRecordGroups, + reloadRequest, +}: { + organization: Organization; + group: FundRequestRecordGroupLocal; + fundRequest: FundRequestLocal; + uncollapsedRecordGroups: Array; + setUncollapsedRecordGroups: React.Dispatch>; + uncollapsedRecords: Array; + setUncollapsedRecords: React.Dispatch>; + reloadRequest: () => void; +}) { + const fundRequestService = useFundRequestValidatorService(); + + const { headElement, configsElement } = useConfigurableTable(fundRequestService.getRecordsColumns(), { + trPrepend: {group?.hasContent && }, + }); + + return ( + + { + setUncollapsedRecordGroups((groups) => { + return groups?.includes(group.id) + ? groups?.filter((id) => id !== group.id) + : [...groups, group.id]; + }); + }}> + +
+
+
+
+ +
+ {group.title} ({group.records.length}) +
+
+ + + + + + + {uncollapsedRecordGroups.includes(group.id) && ( + + + {configsElement} + + + {headElement} + + + + {group.records.map((record: FundRequestRecordLocal) => ( + + ))} + + +
+ + + )} + + ); +} diff --git a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordTabs.tsx b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordTabs.tsx index ee20853ef..72bd72bde 100644 --- a/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordTabs.tsx +++ b/react/src/dashboard/components/pages/fund-requests-view/elements/FundRequestRecordTabs.tsx @@ -22,7 +22,7 @@ export default function FundRequestRecordTabs({ fundRequestRecord }: { fundReque const [shownType, setShownType] = useState(contentMap.filter((value) => value)[0] || null); return ( -
+
{hasMultiple && ( >; + setUncollapsedRecordGroups: React.Dispatch>; +}) { + const translate = useTranslate(); + + const fundRequestService = useFundRequestValidatorService(); + + const { headElement, configsElement } = useConfigurableTable( + fundRequestService.getRecordsHasClarificationsColumns(), + ); + + const scrollToItem = useCallback((id: string, delay: number = 100) => { + setTimeout(() => { + const el = document.getElementById(id); + + if (!el) { + return; + } + + el.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }, delay); + }, []); + + return ( +
+
+
+ {translate('validation_requests.labels.records_has_clarifications')} ( + {fundRequest.record_has_clarifications.length}) +
+
+ +
+
+ {configsElement} + + + + {headElement} + + + {fundRequest.record_has_clarifications.map((record: FundRequestRecordLocal) => ( + { + setUncollapsedRecordGroups((groups) => uniq([...groups, record.group_id])); + setUncollapsedRecords((records) => uniq([...records, record.id])); + scrollToItem(`recordRow${record.id}`, 100); + }}> + + + {record?.record_type.type != 'select' && ( + + )} + + {record?.record_type.type == 'select' && ( + + )} + + + + + + + + ))} + +
{record.record_type.name} + {record?.value || 'Niet beschikbaar'} + + {record?.record_type.options?.find( + (option) => option.value == record?.value, + )?.name || 'Niet beschikbaar'} + {translate(`validation_requests.sources.${record.source}`)} + +
+
+
+
+
+ ); +} diff --git a/react/src/dashboard/components/pages/implementation-notifications/ImplementationNotifications.tsx b/react/src/dashboard/components/pages/implementation-notifications/ImplementationNotifications.tsx index 3ec407202..f30ee8b55 100644 --- a/react/src/dashboard/components/pages/implementation-notifications/ImplementationNotifications.tsx +++ b/react/src/dashboard/components/pages/implementation-notifications/ImplementationNotifications.tsx @@ -203,7 +203,16 @@ export default function ImplementationNotifications() {
{notificationGroup.notifications.map((notification) => ( - +
{notification.editable ? ( @@ -274,7 +283,7 @@ export default function ImplementationNotifications() { )} /> - + ))}
diff --git a/react/src/dashboard/i18n/i18n-nl.js b/react/src/dashboard/i18n/i18n-nl.js index 3bcacab2b..1055ca46f 100644 --- a/react/src/dashboard/i18n/i18n-nl.js +++ b/react/src/dashboard/i18n/i18n-nl.js @@ -1581,6 +1581,13 @@ export default { assignee_email: 'Toegewezen aan', assignee_state: 'Toegewezen staat', assigned_to_employee: 'Beoordelaar', + source: 'Bron', + records_has_clarifications: 'Openstaande aanvullingen', + has_files: 'Bijlagen', + has_clarifications: 'Aanvulverzoek', + group_title: 'Groep', + yes: 'Ja', + no_group: 'Overige gegevens', }, tooltips: { id: 'Uniek ID van de aanvraag.', @@ -1592,6 +1599,10 @@ export default { type: 'Type gegeven (bijv. aantal kinderen).', value: 'Opgegeven waarde door inwoner.', date: 'Datum en tijdstip van indiening.', + source: 'Bron', + has_files: 'Zijn er documenten geüpload', + has_clarifications: 'Is er extra informatie opgevraagd', + group_title: 'Groepen', }, tabs: { all: 'Alles', @@ -1630,10 +1641,20 @@ export default { assign_to_me: 'Zelf beoordelen', assign: 'Toewijzen aan collega', resign: 'Meld af', + uncollapse: 'Alles uitklappen', + collapse: 'Alles inklappen', }, header: { title: 'Aanvragen', }, + sources: { + brp: 'BRP', + form: 'E-formulier', + }, + clarification_states: { + pending: 'Wachten', + answered: 'Beantwoord', + }, }, // EDIT VALIDATORS diff --git a/react/src/dashboard/props/models/FundRequest.tsx b/react/src/dashboard/props/models/FundRequest.tsx index 99b220736..930246016 100644 --- a/react/src/dashboard/props/models/FundRequest.tsx +++ b/react/src/dashboard/props/models/FundRequest.tsx @@ -24,6 +24,15 @@ export interface FundRequestFormula { }>; } +export interface FundRequestRecordGroup { + id: number; + title: string; + organization_id?: number; + fund_id?: number; + order: number; + record_ids: Array; +}; + export default interface FundRequest { id: number; bsn?: string | null; @@ -40,6 +49,7 @@ export default interface FundRequest { contact_information: string | null; note: string; records: Array; + record_groups?: Array; replaced: boolean; state: 'pending' | 'approved' | 'declined' | 'disregarded'; employee: Employee; diff --git a/react/src/dashboard/props/models/FundRequestRecord.tsx b/react/src/dashboard/props/models/FundRequestRecord.tsx index 239ef4d4f..7b4cf2c69 100644 --- a/react/src/dashboard/props/models/FundRequestRecord.tsx +++ b/react/src/dashboard/props/models/FundRequestRecord.tsx @@ -24,4 +24,5 @@ export default interface FundRequestRecord { value?: string; updated_at: string; updated_at_locale: string; + source?: 'form' | 'brp'; } diff --git a/react/src/dashboard/services/ApiRequestService.ts b/react/src/dashboard/services/ApiRequestService.ts index 3307300ea..5c7490e13 100644 --- a/react/src/dashboard/services/ApiRequestService.ts +++ b/react/src/dashboard/services/ApiRequestService.ts @@ -154,9 +154,13 @@ export default class ApiRequestService { }; } - if (cfg?.onAbort) { - xhr.onabort = cfg?.onAbort; - } + xhr.onabort = (event) => { + if (cfg?.onAbort) { + cfg.onAbort.call(xhr, event); + } + + reject({ data: null, status: xhr.status, response: xhr }); + }; if (cfg?.responseType) { xhr.responseType = cfg?.responseType; diff --git a/react/src/dashboard/services/ConfigService.ts b/react/src/dashboard/services/ConfigService.ts index ec99d2139..2dc16ed6a 100644 --- a/react/src/dashboard/services/ConfigService.ts +++ b/react/src/dashboard/services/ConfigService.ts @@ -165,7 +165,6 @@ export type AppConfigProp = { lon?: number; lat?: number; }; - products?: { list: boolean; show?: boolean }; funds?: { list: boolean; fund_requests: boolean }; banner?: Media; implementation?: { diff --git a/react/src/dashboard/services/FundRequestValidatorService.ts b/react/src/dashboard/services/FundRequestValidatorService.ts index ab18ecdfd..384aeea54 100644 --- a/react/src/dashboard/services/FundRequestValidatorService.ts +++ b/react/src/dashboard/services/FundRequestValidatorService.ts @@ -134,8 +134,36 @@ export class FundRequestValidatorService { })); } + public getRecordsHasClarificationsColumns(): Array { + const list = ['type', 'value', 'source', 'state'].filter((item) => item); + + return list.map((key) => ({ + key, + label: `validation_requests.labels.${key}`, + tooltip: { + key: key, + title: `validation_requests.labels.${key}`, + description: `validation_requests.tooltips.${key}`, + }, + })); + } + + public getRecordGroupsColumns(): Array { + const list = ['group_title'].filter((item) => item); + + return list.map((key) => ({ + key, + label: `validation_requests.labels.${key}`, + tooltip: { + key: key, + title: `validation_requests.labels.${key}`, + description: `validation_requests.tooltips.${key}`, + }, + })); + } + public getRecordsColumns(): Array { - const list = ['type', 'value', 'date'].filter((item) => item); + const list = ['type', 'value', 'source', 'has_files', 'has_clarifications', 'state'].filter((item) => item); return list.map((key) => ({ key, diff --git a/react/src/props/EnvDataWebshopProp.ts b/react/src/props/EnvDataWebshopProp.ts index 6d09b91a3..2d5d01200 100644 --- a/react/src/props/EnvDataWebshopProp.ts +++ b/react/src/props/EnvDataWebshopProp.ts @@ -49,16 +49,10 @@ export default interface EnvDataWebshopProp { flags: { genericSearch?: boolean; - showAccountSidebar?: boolean; - showOnlyUsedCategories?: boolean; show2FAMenu?: boolean; useLightAppIcons?: boolean; // menu settings - meAppMenu?: boolean; - forusPlatformMenu?: boolean; - portfolioMenu?: boolean; - aboutSiteMenu?: boolean; fundsMenu?: boolean; fundsMenuIfLoggedOut?: boolean; productsMenu?: boolean; @@ -68,7 +62,6 @@ export default interface EnvDataWebshopProp { noPrintOption?: boolean; activateFirstFund?: boolean; - accessibilityPage?: boolean; // home showStartButton?: boolean; @@ -76,17 +69,13 @@ export default interface EnvDataWebshopProp { showFooterSponsorLogo?: boolean; productDetailsOnlyAvailableFunds?: boolean; - productsAlign?: 'left' | 'center' | 'right'; - menuItems?: Array; startPage?: { combineColumns?: boolean; - hideSignUpColumn?: boolean; hideSignUpDigidOption?: boolean; hideSignUpEmailOption?: boolean; hideSignUpQrCodeOption?: boolean; - hideSignInColumn?: boolean; hideSignInDigidOption?: boolean; hideSignInEmailOption?: boolean; hideSignInQrCodeOption?: boolean; diff --git a/react/src/webshop/Webshop.tsx b/react/src/webshop/Webshop.tsx index 4ed9d5509..3502c06d3 100644 --- a/react/src/webshop/Webshop.tsx +++ b/react/src/webshop/Webshop.tsx @@ -96,14 +96,8 @@ function RouterSelector({ children, envData }: { envData: EnvDataProp; children: */ export default function Webshop({ envData }: { envData: EnvDataWebshopProp }): React.ReactElement { envData.config.flags = { - showAccountSidebar: true, - // menu settings productsMenu: true, - meAppMenu: true, - forusPlatformMenu: true, - portfolioMenu: true, - aboutSiteMenu: true, // home settings fundsMenu: false, // Show funds option on the top menu diff --git a/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx b/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx index 94c932b02..15f740cb7 100644 --- a/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx +++ b/react/src/webshop/components/elements/top-navbar/helpers/useTopMenuItems.tsx @@ -59,11 +59,7 @@ export default function useTopMenuItems(onlyEnabled = true) { state: WebshopRoutes.PRODUCTS, stateParams: {}, target: '_self', - enabled: !!( - appConfigs?.has_internal_funds && - appConfigs?.products?.list && - (envData.config.flags.productsMenu || !!identity) - ), + enabled: !!(appConfigs?.has_internal_funds && (envData.config.flags.productsMenu || !!identity)), }, { id: 'providers_page', diff --git a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx index 773ec5e22..0433084a3 100644 --- a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx +++ b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx @@ -31,7 +31,11 @@ export default function FundRequestRecordsBlock({ fundRequest?.fund?.criteria ?.filter( (criterion) => - !['children_same_address_nth', 'partner_same_address_nth'].includes(criterion.record_type_key), + ![ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), ) .map((criterion) => criterion.record_type_key) || [] ); diff --git a/react/src/webshop/components/pages/funds-activate/FundActivate.tsx b/react/src/webshop/components/pages/funds-activate/FundActivate.tsx index 934b98721..013952d8d 100644 --- a/react/src/webshop/components/pages/funds-activate/FundActivate.tsx +++ b/react/src/webshop/components/pages/funds-activate/FundActivate.tsx @@ -762,6 +762,7 @@ export default function FundActivate() {
setCriteriaChecked(e.target.checked)} diff --git a/react/src/webshop/components/pages/funds-request/FundRequest.tsx b/react/src/webshop/components/pages/funds-request/FundRequest.tsx index aeb4f2ef8..0b5581a48 100644 --- a/react/src/webshop/components/pages/funds-request/FundRequest.tsx +++ b/react/src/webshop/components/pages/funds-request/FundRequest.tsx @@ -622,7 +622,7 @@ export default function FundRequest() { } // Hot linking is not allowed - if (from !== 'fund-activate') { + if (from !== WebshopRoutes.FUND_ACTIVATE) { return navigateState(WebshopRoutes.FUND_ACTIVATE, { id: fund.id }); } diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx index fc4c1e261..3de620a15 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepConfirmCriteria.tsx @@ -54,6 +54,7 @@ export default function FundRequestStepConfirmCriteria({ checked={confirmCriteria || false} onChangeValue={(checked) => setConfirmCriteria(checked)} id="confirm_criteria" + dataDusk="confirmCriteriaCheckbox" label={translate( 'fund_request.sign_up.fund_request_confirm_criteria.confirm_meet_conditions', )} @@ -66,6 +67,7 @@ export default function FundRequestStepConfirmCriteria({ checked={confirmCriteriaWarning || false} onChangeValue={(checked) => setConfirmCriteriaWarning(checked)} id="confirm_criteria_warning" + dataDusk="confirmCriteriaWarningCheckbox" label={translate( 'fund_request.sign_up.fund_request_confirm_criteria.provide_correct_info', )} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx index 9268f4b45..4cf9536eb 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx @@ -236,8 +236,12 @@ export default function FundRequestStepCriteria({ {criteria .filter((criterion) => criterion.fill_type === 'prefill') - .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') - .length > 0 && + .filter((criterion) => + [ + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), + ).length > 0 && prefills.partner.length > 0 && ( criterion.fill_type === 'prefill') .filter( (criterion) => - !['children_same_address_nth', 'partner_same_address_nth'].includes( - criterion.record_type_key, - ), + ![ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key), ).length > 0 && (
@@ -274,6 +280,7 @@ export default function FundRequestStepCriteria({ ![ 'children_same_address_nth', 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', ].includes(criterion.record_type_key), ) .map((criterion) => ( diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx index a9976bac5..30aec45f9 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepEmailSetup.tsx @@ -40,8 +40,9 @@ export default function FundRequestStepEmailSetup({ const termsUrl = useStateHref(WebshopRoutes.TERMS_AND_CONDITIONS); const privacyUrl = useStateHref(WebshopRoutes.PRIVACY); - const [disableSubmitBtn, setDisableSubmitBtn] = useState(false); + const [skipEmail, setSkipEmail] = useState(false); const [emailSubmitted, setEmailSubmitted] = useState(false); + const [disableSubmitBtn, setDisableSubmitBtn] = useState(false); const emailSetupRequired = useMemo(() => fund?.email_required, [fund?.email_required]); const hasPrivacy = useMemo(() => { @@ -91,7 +92,7 @@ export default function FundRequestStepEmailSetup({
-
+
-
+ {emailSetupRequired && (

{translate('fund_request.sign_up.fund_request_email_setup.email_required')} @@ -141,6 +142,7 @@ export default function FundRequestStepEmailSetup({ }} tabIndex={0} autoComplete={'email'} + dataDusk="fundRequestEmailInput" />

@@ -150,99 +152,140 @@ export default function FundRequestStepEmailSetup({ className="button button-primary button-fill" disabled={disableSubmitBtn} type="submit" - tabIndex={0}> + tabIndex={0} + data-dusk="fundRequestEmailSubmit"> {translate('popup_auth.buttons.submit')}
- {!emailSetupRequired && ( -
-
-
-
+
+
+ {hasPrivacy ? ( +
+
+
+ +
- {translate( - 'fund_request.sign_up.fund_request_email_setup.continue_without_email', - )} -
-
- - {translate('fund_request.sign_up.fund_request_email_setup.warning')}{' '} - - {translate('fund_request.sign_up.fund_request_email_setup.no_email_info')} -
-
- )} + ) : null} - {hasPrivacy ? ( -
-
-
- +
+
+ ) : null}
- ) : null} - {hasTerms ? ( -
-
-
- -
-
- ) : null} + {!emailSetupRequired && ( + + {skipEmail ? ( +
+
+
+
+
+ {translate( + 'fund_request.sign_up.fund_request_email_setup.continue_without_email', + )} +
+
+
+ + {translate( + 'fund_request.sign_up.fund_request_email_setup.warning', + )}{' '} + + {translate( + 'fund_request.sign_up.fund_request_email_setup.no_email_info', + )} +
+
+ +
+
+
+ ) : ( + + )} + + )} +
@@ -250,19 +293,6 @@ export default function FundRequestStepEmailSetup({ startActions={ } - endActions={ - !emailSetupRequired && ( - - ) - } /> {bsnWarning} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx index 95ca9282b..923cc017c 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx @@ -164,8 +164,11 @@ export default function FundRequestValuesOverview({ {step.criteria .filter((criterion) => criterion.fill_type === 'prefill') - .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') - .length > 0 && + .filter((criterion) => + ['partner_same_address_nth', 'partner_same_address_gender_female_nth'].includes( + criterion.record_type_key, + ), + ).length > 0 && prefills.partner.length > 0 && ( !( criterion.fill_type === 'prefill' && - ['children_same_address_nth', 'partner_same_address_nth'].includes( - criterion.record_type_key, - ) + [ + 'children_same_address_nth', + 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', + ].includes(criterion.record_type_key) ), ).length > 0 && (
@@ -206,6 +211,7 @@ export default function FundRequestValuesOverview({ [ 'children_same_address_nth', 'partner_same_address_nth', + 'partner_same_address_gender_female_nth', ].includes(criterion.record_type_key) ), ) diff --git a/react/src/webshop/components/pages/products-show/ProductsShow.tsx b/react/src/webshop/components/pages/products-show/ProductsShow.tsx index a7438b856..1c1ce0385 100644 --- a/react/src/webshop/components/pages/products-show/ProductsShow.tsx +++ b/react/src/webshop/components/pages/products-show/ProductsShow.tsx @@ -171,13 +171,6 @@ export default function ProductsShow() { } }, [authIdentity, fetchPayouts, fetchVouchers]); - useEffect(() => { - if (!appConfigs?.products?.show) { - navigateState(WebshopRoutes.HOME); - return; - } - }, [appConfigs, navigateState]); - useEffect(() => { if (product?.name && product?.organization?.name && envData?.client_key) { setTitle( @@ -329,22 +322,24 @@ export default function ProductsShow() { )} - -
- ( - - )} - /> -
-
+ {appConfigs?.show_product_map && ( + +
+ ( + + )} + /> +
+
+ )}
diff --git a/react/src/webshop/components/pages/products/Products.tsx b/react/src/webshop/components/pages/products/Products.tsx index d87162474..0ed6f5c96 100644 --- a/react/src/webshop/components/pages/products/Products.tsx +++ b/react/src/webshop/components/pages/products/Products.tsx @@ -1,4 +1,4 @@ -import React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; +import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useProductService } from '../../../services/ProductService'; import { PaginationData, ResponseError } from '../../../../dashboard/props/ApiResponses'; import Product from '../../../props/models/Product'; @@ -44,6 +44,8 @@ export default function Products() { const [toMax, setToMax] = useState(0); + const activeFetchListRef = useRef(null); + const defaultSortOption = useMemo(() => { return sortByOptions?.find((option) => { return ( @@ -102,7 +104,7 @@ export default function Products() { order_dir: (defaultSortOption || sortByOptions[0])?.value.order_dir, }, { - throttledValues: ['q', 'from', 'to', 'qr', 'reservation', 'extra_payment'], + throttledValues: ['q', 'from', 'to', 'qr', 'reservation', 'extra_payment', 'postcode'], queryParams: { q: StringParam, page: NumberParam, @@ -209,16 +211,24 @@ export default function Products() { const fetchProducts = useCallback( (query: object) => { + activeFetchListRef.current?.abort(); + setErrors(null); setProgress(0); productService - .list({ ...query }) + .list({ ...query }, { onXhr: (xhr: XMLHttpRequest) => (activeFetchListRef.current = xhr) }) .then((res) => { setProducts(res.data); setToMax((max) => Math.max(res.data?.meta?.price_max, max)); }) - .catch((e: ResponseError) => setErrors(e.data?.errors)) + .catch((e: ResponseError) => { + if (e?.status === 0) { + return; + } + + setErrors(e.data?.errors); + }) .finally(() => setProgress(100)); }, [productService, setProgress], @@ -226,6 +236,10 @@ export default function Products() { useEffect(() => { fetchProducts(buildQuery(filterValuesActive)); + + return () => { + activeFetchListRef.current?.abort(); + }; }, [fetchProducts, buildQuery, filterValuesActive]); useEffect(() => { diff --git a/react/src/webshop/components/pages/redirect/Redirect.tsx b/react/src/webshop/components/pages/redirect/Redirect.tsx index bd92ecaa7..7b5e57709 100644 --- a/react/src/webshop/components/pages/redirect/Redirect.tsx +++ b/react/src/webshop/components/pages/redirect/Redirect.tsx @@ -49,11 +49,16 @@ export default function Redirect() { .confirmVerification(email_confirmation_token) .then(() => { setResolved(true); + pushSuccess( translate('push.email_verification_success.title'), translate('push.email_verification_success.description'), ); - navigateState(WebshopRoutes.IDENTITY_EMAILS, {}, {}); + + if (!target || !handleAuthTarget(target)) { + setResolved(true); + navigateState(WebshopRoutes.IDENTITY_EMAILS, {}, {}); + } }) .catch((err: ResponseError) => { pushDanger( diff --git a/react/src/webshop/components/pages/sitemap/Sitemap.tsx b/react/src/webshop/components/pages/sitemap/Sitemap.tsx index 734e8adaf..fe8bf3704 100644 --- a/react/src/webshop/components/pages/sitemap/Sitemap.tsx +++ b/react/src/webshop/components/pages/sitemap/Sitemap.tsx @@ -40,15 +40,14 @@ export default function Sitemap() { )} - {appConfigs?.has_internal_funds && - appConfigs?.products.list && - (envData.config.flags.productsMenu || authIdentity) && ( -
  • - - {translate('top_navbar.items.products')} - -
  • - )} + + {appConfigs?.has_internal_funds && (envData.config.flags.productsMenu || authIdentity) && ( +
  • + + {translate('top_navbar.items.products')} + +
  • + )} {envData.config.flags.providersMenu && (
  • diff --git a/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx b/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx index e29f1cefd..8a8fb95b9 100644 --- a/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx +++ b/react/src/webshop/components/pages/vouchers-show/elements/VoucherProducts.tsx @@ -21,7 +21,7 @@ export default function VoucherProducts({ voucher }: { voucher: Voucher }) { !voucher?.deactivated && !voucher?.product && !voucher?.external && - appConfigs?.products.list, + appConfigs?.has_internal_funds, [appConfigs, voucher], ); @@ -46,5 +46,6 @@ export default function VoucherProducts({ voucher }: { voucher: Voucher }) { if (!showProducts || !products) { return; } + return ; } diff --git a/react/src/webshop/i18n/nl/pages/fund-request.mjs b/react/src/webshop/i18n/nl/pages/fund-request.mjs index 0fd9dc865..8f9831c2a 100644 --- a/react/src/webshop/i18n/nl/pages/fund-request.mjs +++ b/react/src/webshop/i18n/nl/pages/fund-request.mjs @@ -125,10 +125,11 @@ export default { sign_up_with_email: 'Aanmelden met e-mailadres', email_required: 'Om verder te gaan met de aanvraag dient u uw e-mailadres op te geven', continue_without_email: 'Verder zonder e-mail', - warning: 'Let op!', + continue_without_email_link: 'Ga verder zonder e-mailadres', + warning: 'Let op:', + no_email_link: 'Ik heb geen e-mailadres', no_email_info: - 'Als u geen e-mailadres achterlaat ontvangt u geen essentiële berichten zoals de e-mail met de QR-code of wanneer er een transactie is geweest. Daarnaast kan u alleen inloggen met DigiD.', - skip: 'Overslaan', + 'Zonder e-mailadres ontvangt u geen belangrijke berichten over uw tegoed en uitgaven. U kunt dan alleen inloggen met DigiD.', }, fund_request_step_done: { sign_up: 'Aanmelden', diff --git a/react/src/webshop/i18n/translated/ar.json b/react/src/webshop/i18n/translated/ar.json index 14c6dcc79..74dcd10dd 100644 --- a/react/src/webshop/i18n/translated/ar.json +++ b/react/src/webshop/i18n/translated/ar.json @@ -1020,13 +1020,14 @@ }, "fund_request_email_setup": { "continue_without_email": "المتابعة بدون بريد إلكتروني", + "continue_without_email_link": "المتابعة بدون عنوان بريد إلكتروني", "email_required": "لمتابعة الطلب، يرجى إدخال عنوان البريد الإلكتروني الخاص بك", "email_sent": "البريد الإلكتروني المرسل", "email_sent_screen": "تم إرسال رسالة تأكيد بالبريد الإلكتروني", - "no_email_info": "إذا لم تترك عنوان بريد إلكتروني، فلن تتلقى رسائل أساسية مثل البريد الإلكتروني الذي يحتوي على رمز الاستجابة السريعة أو عند وجود معاملة. بالإضافة إلى ذلك، يمكنك فقط تسجيل الدخول باستخدام DigiD.", + "no_email_link": "ليس لدي عنوان بريد إلكتروني", "sign_up_with_email": "تسجيل الدخول باستخدام عنوان البريد الإلكتروني", - "skip": "تخطي", - "warning": "ملاحظة!" + "no_email_info": "بدون عنوان بريد إلكتروني، لن تتلقى رسائل مهمة حول رصيدك ونفقاتك. يمكنك بعد ذلك تسجيل الدخول باستخدام DigiD فقط.", + "warning": "ملاحظة:" }, "fund_request_overview": { "application_summary": "نظرة عامة على الطلب", @@ -2624,7 +2625,8 @@ "bank_accounts": { "title": "الحساب البنكي", "iban": "رقم الحساب المصرفي الدولي (IBAN)", - "name": "التقادم" + "name": "التقادم", + "source": "المصدر" }, "breadcrumbs": { "home": "الصفحة الرئيسية", diff --git a/react/src/webshop/i18n/translated/de.json b/react/src/webshop/i18n/translated/de.json index f28ebceb1..3123a743f 100644 --- a/react/src/webshop/i18n/translated/de.json +++ b/react/src/webshop/i18n/translated/de.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Weiterfahrt ohne E-Mail", + "continue_without_email_link": "Weiter ohne E-Mail Adresse", "email_required": "Um mit der Bewerbung fortzufahren, geben Sie bitte Ihre E-Mail-Adresse ein", "email_sent": "E-Mail gesendet", "email_sent_screen": "Eine Bestätigungs-E-Mail wurde verschickt", - "no_email_info": "Wenn Sie keine E-Mail-Adresse hinterlassen, erhalten Sie keine wichtigen Nachrichten, wie z. B. die E-Mail mit dem QR-Code oder wenn eine Transaktion stattgefunden hat. Außerdem können Sie sich nur mit DigiD anmelden.", + "no_email_link": "Ich habe keine E-Mail Adresse", "sign_up_with_email": "Anmeldung mit E-Mail Adresse", - "skip": "Überspringen", - "warning": "Achtung!" + "no_email_info": "Ohne E-Mail-Adresse erhalten Sie keine wichtigen Nachrichten über Ihr Guthaben und Ihre Ausgaben. Sie können sich dann nur mit DigiD anmelden.", + "warning": "Anmerkung:" }, "fund_request_overview": { "application_summary": "Übersicht anfordern", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Bankkonto", "iban": "IBAN", - "name": "Zuschreibung" + "name": "Zuschreibung", + "source": "Quelle" }, "breadcrumbs": { "home": "Startseite", diff --git a/react/src/webshop/i18n/translated/en-US.json b/react/src/webshop/i18n/translated/en-US.json index c7f3efbd4..d5a0ca2b9 100644 --- a/react/src/webshop/i18n/translated/en-US.json +++ b/react/src/webshop/i18n/translated/en-US.json @@ -775,13 +775,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Continuing without email", + "continue_without_email_link": "Continue without an email address", "email_required": "To proceed with the application, please provide your email address", "email_sent": "E-mail sent", "email_sent_screen": "An email confirmation has been sent", - "no_email_info": "If you do not leave an email address, you will not receive essential messages such as the email with the QR code or when there has been a transaction. In addition, you can only log in with DigiD.", + "no_email_link": "I do not have an email address", "sign_up_with_email": "Sign in with email address", - "skip": "Skip", - "warning": "Note!" + "no_email_info": "Without an e-mail address, you will not receive important messages about your credit and expenses. You can then only log in with DigiD.", + "warning": "Notice:" }, "fund_request_overview": { "application_summary": "Request Overview", @@ -2325,7 +2326,8 @@ "bank_accounts": { "title": "Bank account", "iban": "IBAN", - "name": "Attribution" + "name": "Attribution", + "source": "Source" }, "breadcrumbs": { "home": "Home", diff --git a/react/src/webshop/i18n/translated/fr.json b/react/src/webshop/i18n/translated/fr.json index c45775f6f..3a8a6d667 100644 --- a/react/src/webshop/i18n/translated/fr.json +++ b/react/src/webshop/i18n/translated/fr.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Poursuivre sans e-mail", + "continue_without_email_link": "Continuer sans adresse e-mail", "email_required": "Pour continuer avec la demande, veuillez entrer votre adresse e-mail", "email_sent": "Courriel envoyé", "email_sent_screen": "Un e-mail de confirmation a été envoyé", - "no_email_info": "Si vous ne laissez pas d'adresse e-mail, vous ne recevrez pas les messages essentiels tels que l'e-mail avec le code QR ou lorsqu'il y a eu une transaction. En outre, vous ne pourrez vous connecter qu'avec DigiD.", + "no_email_link": "Je n'ai pas d'adresse électronique", "sign_up_with_email": "S'identifier avec l'adresse e-mail", - "skip": "Sauter", - "warning": "Remarque !" + "no_email_info": "Sans adresse e-mail, vous ne recevrez pas de messages importants concernant votre crédit et vos dépenses. Vous ne pouvez donc vous connecter qu'avec DigiD.", + "warning": "Remarque :" }, "fund_request_overview": { "application_summary": "Aperçu de la demande", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Compte bancaire", "iban": "IBAN", - "name": "Ascription" + "name": "Ascription", + "source": "Source" }, "breadcrumbs": { "home": "Accueil", diff --git a/react/src/webshop/i18n/translated/pl.json b/react/src/webshop/i18n/translated/pl.json index e539c104c..d67406258 100644 --- a/react/src/webshop/i18n/translated/pl.json +++ b/react/src/webshop/i18n/translated/pl.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Kontynuacja bez wiadomości e-mail", + "continue_without_email_link": "Kontynuuj bez adresu e-mail", "email_required": "Aby kontynuować aplikację, wprowadź swój adres e-mail", "email_sent": "E-mail wysłany", "email_sent_screen": "Wiadomość e-mail z potwierdzeniem została wysłana", - "no_email_info": "Jeśli nie zostawisz adresu e-mail, nie będziesz otrzymywać ważnych wiadomości, takich jak e-mail z kodem QR lub gdy dokonano transakcji. Ponadto możesz zalogować się tylko za pomocą DigiD.", + "no_email_link": "Nie mam adresu e-mail", "sign_up_with_email": "Zaloguj się za pomocą adresu e-mail", - "skip": "Pomiń", - "warning": "Uwaga!" + "no_email_info": "Bez adresu e-mail nie będziesz otrzymywać ważnych wiadomości o swoich kredytach i wydatkach. Możesz zalogować się tylko za pomocą DigiD.", + "warning": "Uwaga:" }, "fund_request_overview": { "application_summary": "Przegląd żądań", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Konto bankowe", "iban": "IBAN", - "name": "Napis" + "name": "Napis", + "source": "Źródło" }, "breadcrumbs": { "home": "Strona główna", diff --git a/react/src/webshop/i18n/translated/ru.json b/react/src/webshop/i18n/translated/ru.json index 63d4c2587..0b529cf9c 100644 --- a/react/src/webshop/i18n/translated/ru.json +++ b/react/src/webshop/i18n/translated/ru.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Продолжение без электронной почты", + "continue_without_email_link": "Продолжить без адреса электронной почты", "email_required": "Чтобы продолжить рассмотрение заявки, введите адрес электронной почты", "email_sent": "Электронная почта отправлена", "email_sent_screen": "Подтверждение было отправлено по электронной почте", - "no_email_info": "Если вы не оставите адрес электронной почты, вы не будете получать важные сообщения, такие как письмо с QR-кодом или сообщение о транзакции. Кроме того, вы сможете войти в систему только с помощью DigiD.", + "no_email_link": "У меня нет адреса электронной почты", "sign_up_with_email": "Войдите в систему, указав адрес электронной почты", - "skip": "Скип", - "warning": "Обратите внимание!" + "no_email_info": "Без адреса электронной почты вы не будете получать важные сообщения о ваших кредитах и расходах. Вы сможете войти в систему только с помощью DigiD.", + "warning": "Примечание:" }, "fund_request_overview": { "application_summary": "Обзор запросов", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Банковский счет", "iban": "IBAN", - "name": "Аскрипция" + "name": "Аскрипция", + "source": "Источник" }, "breadcrumbs": { "home": "Главная", diff --git a/react/src/webshop/i18n/translated/tr.json b/react/src/webshop/i18n/translated/tr.json index 8ab80fdff..63983e181 100644 --- a/react/src/webshop/i18n/translated/tr.json +++ b/react/src/webshop/i18n/translated/tr.json @@ -999,13 +999,14 @@ }, "fund_request_email_setup": { "continue_without_email": "E-posta olmadan devam etme", + "continue_without_email_link": "E-posta adresi olmadan devam edin", "email_required": "Başvuruya devam etmek için lütfen e-posta adresinizi girin", "email_sent": "E-posta gönderildi", "email_sent_screen": "Bir onay e-postası gönderildi", - "no_email_info": "Bir e-posta adresi bırakmazsanız, QR kodlu e-posta gibi önemli mesajları veya bir işlem yapıldığında alamazsınız. Ayrıca, yalnızca DigiD ile giriş yapabilirsiniz.", + "no_email_link": "Bir e-posta adresim yok", "sign_up_with_email": "E-posta adresi ile oturum açın", - "skip": "Atla", - "warning": "Dikkat!" + "no_email_info": "E-posta adresi olmadan, kredi ve harcamalarınız hakkında önemli mesajlar alamazsınız. Daha sonra sadece DigiD ile giriş yapabilirsiniz.", + "warning": "Not:" }, "fund_request_overview": { "application_summary": "Talebe genel bakış", @@ -2624,7 +2625,8 @@ "bank_accounts": { "title": "Banka hesabı", "iban": "IBAN", - "name": "Ascription" + "name": "Ascription", + "source": "Kaynak" }, "breadcrumbs": { "home": "Ev", diff --git a/react/src/webshop/i18n/translated/uk.json b/react/src/webshop/i18n/translated/uk.json index cd222fab1..0c33ee1c8 100644 --- a/react/src/webshop/i18n/translated/uk.json +++ b/react/src/webshop/i18n/translated/uk.json @@ -597,13 +597,14 @@ }, "fund_request_email_setup": { "continue_without_email": "Продовження без електронної пошти", + "continue_without_email_link": "Продовжити без адреси електронної пошти", "email_required": "Щоб продовжити заповнення заявки, будь ласка, введіть свою електронну адресу", "email_sent": "Електронний лист надіслано", "email_sent_screen": "Підтвердження надіслано на електронну пошту", - "no_email_info": "Якщо ви не залишите адресу електронної пошти, ви не будете отримувати важливі повідомлення, такі як електронне повідомлення з QR-кодом або повідомлення про здійснення транзакції. Крім того, ви можете увійти в систему лише за допомогою DigiD.", + "no_email_link": "У мене немає адреси електронної пошти", "sign_up_with_email": "Увійдіть за допомогою адреси електронної пошти", - "skip": "Пропустити.", - "warning": "Зауважте!" + "no_email_info": "Без адреси електронної пошти ви не будете отримувати важливі повідомлення про ваш кредит і витрати. Тоді ви зможете увійти в систему лише за допомогою DigiD.", + "warning": "Зауважте:" }, "fund_request_overview": { "application_summary": "Огляд запитів", @@ -2485,7 +2486,8 @@ "bank_accounts": { "title": "Банківський рахунок", "iban": "IBAN", - "name": "Припис" + "name": "Припис", + "source": "Джерело" }, "breadcrumbs": { "home": "Головна сторінка", diff --git a/react/src/webshop/services/AuthService.ts b/react/src/webshop/services/AuthService.ts index bf2acc439..b64824fd4 100644 --- a/react/src/webshop/services/AuthService.ts +++ b/react/src/webshop/services/AuthService.ts @@ -58,7 +58,12 @@ export function useAuthService() { if (target && target[0] == 'fundRequest') { if (target[1]) { - navigateState(WebshopRoutes.FUND_REQUEST, { id: target[1] }); + navigateState( + WebshopRoutes.FUND_REQUEST, + { id: target[1] }, + {}, + { state: { from: WebshopRoutes.FUND_ACTIVATE } }, + ); } else { navigateState(WebshopRoutes.START, {}); } diff --git a/react/src/webshop/services/ProductService.ts b/react/src/webshop/services/ProductService.ts index 8f7d92d39..cdad800f0 100644 --- a/react/src/webshop/services/ProductService.ts +++ b/react/src/webshop/services/ProductService.ts @@ -21,8 +21,8 @@ export class ProductService { /** * Fetch list */ - public list(data: object = {}): Promise> { - return this.apiRequest.get(`${this.prefix}`, data); + public list(data: object = {}, config = {}): Promise> { + return this.apiRequest.get(`${this.prefix}`, data, config); } public sample(per_page = 6): Promise> { diff --git a/translations/cache/cache.json b/translations/cache/cache.json index c4cb3ce32..15cc2bd93 100644 --- a/translations/cache/cache.json +++ b/translations/cache/cache.json @@ -1655,6 +1655,10 @@ "fund_request.sign_up.fund_request_email_setup.continue_without_email", "Verder zonder e-mail" ], + [ + "fund_request.sign_up.fund_request_email_setup.continue_without_email_link", + "Ga verder zonder e-mailadres" + ], [ "fund_request.sign_up.fund_request_email_setup.email_required", "Om verder te gaan met de aanvraag dient u uw e-mailadres op te geven" @@ -1669,19 +1673,19 @@ ], [ "fund_request.sign_up.fund_request_email_setup.no_email_info", - "Als u geen e-mailadres achterlaat ontvangt u geen essentiële berichten zoals de e-mail met de QR-code of wanneer er een transactie is geweest. Daarnaast kan u alleen inloggen met DigiD." + "Zonder e-mailadres ontvangt u geen belangrijke berichten over uw tegoed en uitgaven. U kunt dan alleen inloggen met DigiD." ], [ - "fund_request.sign_up.fund_request_email_setup.sign_up_with_email", - "Aanmelden met e-mailadres" + "fund_request.sign_up.fund_request_email_setup.no_email_link", + "Ik heb geen e-mailadres" ], [ - "fund_request.sign_up.fund_request_email_setup.skip", - "Overslaan" + "fund_request.sign_up.fund_request_email_setup.sign_up_with_email", + "Aanmelden met e-mailadres" ], [ "fund_request.sign_up.fund_request_email_setup.warning", - "Let op!" + "Let op:" ], [ "fund_request.sign_up.fund_request_overview.application_summary", @@ -7083,6 +7087,10 @@ "profile.bank_accounts.name", "Tenaam stelling" ], + [ + "profile.bank_accounts.source", + "Bron" + ], [ "profile.bank_accounts.title", "Bankrekening"