diff --git a/.gitignore b/.gitignore index d0b9d6a..f71f2f2 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ drivers/ # Error screenshots generated by TestBench for failed integration tests error-screenshots/ webpack.generated.js +*.env diff --git a/package-lock.json b/package-lock.json index 8cfda28..293a43f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,22 +10,22 @@ "@f0rce/ace-widget": "1.0.2", "@polymer/polymer": "3.5.1", "@vaadin-component-factory/vcf-pdf-viewer": "2.0.1", - "@vaadin/bundles": "24.4.2", + "@vaadin/bundles": "24.5.1", "@vaadin/common-frontend": "0.0.19", - "@vaadin/polymer-legacy-adapter": "24.4.2", - "@vaadin/react-components": "24.4.2", - "@vaadin/react-components-pro": "24.4.2", - "@vaadin/router": "1.7.5", + "@vaadin/polymer-legacy-adapter": "24.5.1", + "@vaadin/react-components": "24.5.1", + "@vaadin/react-components-pro": "24.5.1", + "@vaadin/router": "2.0.0", "@vaadin/vaadin-development-mode-detector": "2.0.7", - "@vaadin/vaadin-lumo-styles": "24.4.2", - "@vaadin/vaadin-material-styles": "24.4.2", - "@vaadin/vaadin-themable-mixin": "24.4.2", - "@vaadin/vaadin-usage-statistics": "2.1.2", + "@vaadin/vaadin-lumo-styles": "24.5.1", + "@vaadin/vaadin-material-styles": "24.5.1", + "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/vaadin-usage-statistics": "2.1.3", "construct-style-sheets-polyfill": "3.1.0", "date-fns": "2.29.3", "lit": "3.1.4", "print-js": "1.6.0", - "proj4": "2.11.0", + "proj4": "2.12.1", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.23.1" @@ -2925,167 +2925,168 @@ } }, "node_modules/@vaadin/a11y-base": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.4.2.tgz", - "integrity": "sha512-9Er3g0Tw4v8Mq9AFSvo6+X3we3ZSluU6h+HD8FbL0CWwl3Hre5LbgcQPH0hlXCqpgQIcn7FG0RwOSEXuQ9NGGQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.5.1.tgz", + "integrity": "sha512-rPLVlLxaF7r0HjX/C3BwXN2gXLwUegWPNHe4pAhGg5sdcBDf4nGkFfibg0kJo5r2BAHgDn2xySs3oVA68vxT+g==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", + "@vaadin/component-base": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/accordion": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/accordion/-/accordion-24.4.2.tgz", - "integrity": "sha512-l8Qm1DRr8WTL1QufJDc2cdiLh3C7pVUUKHd9LF3njEQMjm7xdqknTQY395oDRU9rok8IWLVMPYnVkEDG7JM4Cg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/accordion/-/accordion-24.5.1.tgz", + "integrity": "sha512-J2JqxAV9qAqAyHxU5DxW5r84T6YsiswwZ+4fFXjcY3Snwx5fR9F9n25iCtM/34GscXEKcwUTFiFlMMjSmFEvZw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/details": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/details": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/app-layout": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/app-layout/-/app-layout-24.4.2.tgz", - "integrity": "sha512-0DcNgMOVJGj/pboSXWjMsjV9lZZDxtJSza/7fsJ0sswqQqj7XDOSBo4fd1Z62p8uhV2B0UfDhiXpX8MozDuWLA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/app-layout/-/app-layout-24.5.1.tgz", + "integrity": "sha512-X4vNw8Y9L/UFpaRuTF/HMfKh3otthuUPfX7EbaeYk56RsqWhAeyqo/Kf61ZISkqGKzl/QWOZ63uR9orfKHuHWw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/avatar": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/avatar/-/avatar-24.4.2.tgz", - "integrity": "sha512-dsdJ7RwIILW5qS///kN6nrHQpoNkB8iUMfB+uB7HodjihCc29NeT6SZ7rxqkqhFnd9KWK2LSC/tu6rDy388xFw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/avatar/-/avatar-24.5.1.tgz", + "integrity": "sha512-TNAFrGhpMqHiW75pnOINrDhuqwUFgO6V3yY8x0smk4i0QMONIuiGv1lI/zCsuEJ45HYxTBxOcLzFc4CnD9s8uQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/tooltip": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/tooltip": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/avatar-group": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/avatar-group/-/avatar-group-24.4.2.tgz", - "integrity": "sha512-pkQEZcNp3eA4AJgGBU8Y3L8jZPsMLv6gWMwiiEDkcXYIvQa1xNUITFu3t04Ro6N8lbTiqQrH8EjZHi37TcE8gg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/avatar-group/-/avatar-group-24.5.1.tgz", + "integrity": "sha512-PXzeU0DYZlj7nq2M6uuCstWDwvU2tlnv4U+Uytt7xX0fTT3mnFZCLoUeLKjWXzjTozn/0nkuT+N1vNbW45pOWg==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/avatar": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/list-box": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/avatar": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/list-box": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/board": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/board/-/board-24.4.2.tgz", - "integrity": "sha512-BLFS2zd4FnDOnFz08nXJbmrzRL+APPkvLl1nHsoBnQgL+vzxXnVc6mmRZ5R1wfuOl6xLr4+GGkm/rAuMn870VA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/board/-/board-24.5.1.tgz", + "integrity": "sha512-iXkseylTRMcbVuYV32IaoEf2I4ctAjAAF6Lhlqeyc5DOZUIRo7WCN3pvYKMh/LWKUZIOZDKZHSM56NMKqiskzw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1" } }, "node_modules/@vaadin/bundles": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/bundles/-/bundles-24.4.2.tgz", - "integrity": "sha512-JCAFkOVK6jL+0BTxk/H2oTncjMwlcKRyRbSAyGUq9ni9NC/fkM/eC7EYf4GgKzV3VwFGnvi60eZG2Ieb/vGYJw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/bundles/-/bundles-24.5.1.tgz", + "integrity": "sha512-V6J5xjQJl+RsIGetAA3m+PYzrt0tGrd2oo3mIKuQTy8XwW1rR8HErb2UEINc0M9S9ifebhaoMNBwyO3N3fHPWQ==", "peerDependencies": { "@open-wc/dedupe-mixin": "1.4.0", - "@polymer/polymer": "3.5.1", - "@vaadin/a11y-base": "24.4.2", - "@vaadin/accordion": "24.4.2", - "@vaadin/app-layout": "24.4.2", - "@vaadin/avatar": "24.4.2", - "@vaadin/avatar-group": "24.4.2", - "@vaadin/board": "24.4.2", - "@vaadin/button": "24.4.2", - "@vaadin/charts": "24.4.2", - "@vaadin/checkbox": "24.4.2", - "@vaadin/checkbox-group": "24.4.2", - "@vaadin/combo-box": "24.4.2", - "@vaadin/component-base": "24.4.2", - "@vaadin/confirm-dialog": "24.4.2", - "@vaadin/context-menu": "24.4.2", - "@vaadin/cookie-consent": "24.4.2", - "@vaadin/crud": "24.4.2", - "@vaadin/custom-field": "24.4.2", - "@vaadin/date-picker": "24.4.2", - "@vaadin/date-time-picker": "24.4.2", - "@vaadin/details": "24.4.2", - "@vaadin/dialog": "24.4.2", - "@vaadin/email-field": "24.4.2", - "@vaadin/field-base": "24.4.2", - "@vaadin/field-highlighter": "24.4.2", - "@vaadin/form-layout": "24.4.2", - "@vaadin/grid": "24.4.2", - "@vaadin/grid-pro": "24.4.2", - "@vaadin/horizontal-layout": "24.4.2", - "@vaadin/icon": "24.4.2", - "@vaadin/icons": "24.4.2", - "@vaadin/input-container": "24.4.2", - "@vaadin/integer-field": "24.4.2", - "@vaadin/item": "24.4.2", - "@vaadin/list-box": "24.4.2", - "@vaadin/lit-renderer": "24.4.2", - "@vaadin/login": "24.4.2", - "@vaadin/map": "24.4.2", - "@vaadin/menu-bar": "24.4.2", - "@vaadin/message-input": "24.4.2", - "@vaadin/message-list": "24.4.2", - "@vaadin/multi-select-combo-box": "24.4.2", - "@vaadin/notification": "24.4.2", - "@vaadin/number-field": "24.4.2", - "@vaadin/overlay": "24.4.2", - "@vaadin/password-field": "24.4.2", - "@vaadin/polymer-legacy-adapter": "24.4.2", - "@vaadin/progress-bar": "24.4.2", - "@vaadin/radio-group": "24.4.2", - "@vaadin/rich-text-editor": "24.4.2", - "@vaadin/scroller": "24.4.2", - "@vaadin/select": "24.4.2", - "@vaadin/side-nav": "24.4.2", - "@vaadin/split-layout": "24.4.2", - "@vaadin/tabs": "24.4.2", - "@vaadin/tabsheet": "24.4.2", - "@vaadin/text-area": "24.4.2", - "@vaadin/text-field": "24.4.2", - "@vaadin/time-picker": "24.4.2", - "@vaadin/tooltip": "24.4.2", - "@vaadin/upload": "24.4.2", + "@polymer/polymer": "3.5.2", + "@vaadin/a11y-base": "24.5.1", + "@vaadin/accordion": "24.5.1", + "@vaadin/app-layout": "24.5.1", + "@vaadin/avatar": "24.5.1", + "@vaadin/avatar-group": "24.5.1", + "@vaadin/board": "24.5.1", + "@vaadin/button": "24.5.1", + "@vaadin/charts": "24.5.1", + "@vaadin/checkbox": "24.5.1", + "@vaadin/checkbox-group": "24.5.1", + "@vaadin/combo-box": "24.5.1", + "@vaadin/component-base": "24.5.1", + "@vaadin/confirm-dialog": "24.5.1", + "@vaadin/context-menu": "24.5.1", + "@vaadin/cookie-consent": "24.5.1", + "@vaadin/crud": "24.5.1", + "@vaadin/custom-field": "24.5.1", + "@vaadin/date-picker": "24.5.1", + "@vaadin/date-time-picker": "24.5.1", + "@vaadin/details": "24.5.1", + "@vaadin/dialog": "24.5.1", + "@vaadin/email-field": "24.5.1", + "@vaadin/field-base": "24.5.1", + "@vaadin/field-highlighter": "24.5.1", + "@vaadin/form-layout": "24.5.1", + "@vaadin/grid": "24.5.1", + "@vaadin/grid-pro": "24.5.1", + "@vaadin/horizontal-layout": "24.5.1", + "@vaadin/icon": "24.5.1", + "@vaadin/icons": "24.5.1", + "@vaadin/input-container": "24.5.1", + "@vaadin/integer-field": "24.5.1", + "@vaadin/item": "24.5.1", + "@vaadin/list-box": "24.5.1", + "@vaadin/lit-renderer": "24.5.1", + "@vaadin/login": "24.5.1", + "@vaadin/map": "24.5.1", + "@vaadin/menu-bar": "24.5.1", + "@vaadin/message-input": "24.5.1", + "@vaadin/message-list": "24.5.1", + "@vaadin/multi-select-combo-box": "24.5.1", + "@vaadin/notification": "24.5.1", + "@vaadin/number-field": "24.5.1", + "@vaadin/overlay": "24.5.1", + "@vaadin/password-field": "24.5.1", + "@vaadin/polymer-legacy-adapter": "24.5.1", + "@vaadin/popover": "24.5.1", + "@vaadin/progress-bar": "24.5.1", + "@vaadin/radio-group": "24.5.1", + "@vaadin/rich-text-editor": "24.5.1", + "@vaadin/scroller": "24.5.1", + "@vaadin/select": "24.5.1", + "@vaadin/side-nav": "24.5.1", + "@vaadin/split-layout": "24.5.1", + "@vaadin/tabs": "24.5.1", + "@vaadin/tabsheet": "24.5.1", + "@vaadin/text-area": "24.5.1", + "@vaadin/text-field": "24.5.1", + "@vaadin/time-picker": "24.5.1", + "@vaadin/tooltip": "24.5.1", + "@vaadin/upload": "24.5.1", "@vaadin/vaadin-development-mode-detector": "2.0.7", - "@vaadin/vaadin-lumo-styles": "24.4.2", - "@vaadin/vaadin-themable-mixin": "24.4.2", - "@vaadin/vaadin-usage-statistics": "2.1.2", - "@vaadin/vertical-layout": "24.4.2", - "@vaadin/virtual-list": "24.4.2", + "@vaadin/vaadin-lumo-styles": "24.5.1", + "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/vaadin-usage-statistics": "2.1.3", + "@vaadin/vertical-layout": "24.5.1", + "@vaadin/virtual-list": "24.5.1", "cookieconsent": "3.1.1", "highcharts": "9.2.2", - "lit": "3.1.4", + "lit": "3.2.1", "ol": "6.13.0", "quickselect": "2.0.0", "rbush": "3.0.1" @@ -3235,6 +3236,9 @@ "@vaadin/polymer-legacy-adapter": { "optional": true }, + "@vaadin/popover": { + "optional": true + }, "@vaadin/progress-bar": { "optional": true }, @@ -3316,82 +3320,83 @@ } }, "node_modules/@vaadin/button": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/button/-/button-24.4.2.tgz", - "integrity": "sha512-wtXqYgDukMkLOp3wx0q1nU5CBATuoWk2K8UFEnn4hSW6qD38Iug3uTzHoSz8ECitbEJFk1FAAMSSpIQbQpoViw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/button/-/button-24.5.1.tgz", + "integrity": "sha512-POxJ8C1OfUcv9bSbwHAVgPV6Y08z9w2PGlsZqWqBrLcpz/xoSvN21o3NfVuTSdjPKjCYhWtLvyQS3Dufet3XUw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/charts": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/charts/-/charts-24.4.2.tgz", - "integrity": "sha512-VAJuJKRTu6Zac1f2D4ATUqQDgxkbwEJRg2TRpjw8CSyPABg9vSoOwVa3vhdwq5sctVJh7O9IdNkzLY+9E2wmEg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/charts/-/charts-24.5.1.tgz", + "integrity": "sha512-Ce9Xaj+DDVf8qngMLL6gTLN3l5LzZYRa9tNSAxZAOjFt4gXFwUY+NDJRAAlGPiXcfxR4bjVNjdB1xaD9fYdLww==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "highcharts": "9.2.2" } }, "node_modules/@vaadin/checkbox": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.4.2.tgz", - "integrity": "sha512-FQwtqDomm7L8zOBIX1gnvibMWz4CeA58kS0W61iiZBo62BPj/MzlFfxdL2uJq82sGAyG8RymSv4qPTHMgnzIog==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.5.1.tgz", + "integrity": "sha512-+Du5sF6cDjiX8REwZh7mR594fi7F9Lr83F03EaOvUv1UhnkIMnnxI+skzMovxqYc0wmkbt5n3M+jnqipDcx6og==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox-group": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox-group/-/checkbox-group-24.4.2.tgz", - "integrity": "sha512-x6ArQijQVeymihFckpraGISUM4MI0HpSwjwIs3dpmDEVLkbRAp5hLjfZhX9kccq/eKPEf3itajA5DYYxibS0DA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox-group/-/checkbox-group-24.5.1.tgz", + "integrity": "sha512-ulh1Q3jz1h83YOe0frbWck3IIxGpRLwPS4sky2qCrtxM+JltTKWjkRrcwZJdv8p8yR9Vo3IAas+3vxvdXJmwjg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/checkbox": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/checkbox": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", + "lit": "^3.0.0" } }, "node_modules/@vaadin/combo-box": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/combo-box/-/combo-box-24.4.2.tgz", - "integrity": "sha512-cN2rnp9hbx4woTSJAFQw6KF16IjUTbH6GxxGCpuF4Mkx6qvrO3nGacyFdL5a4rsSNDYdDUM7JoiggAkEmaT8SA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/combo-box/-/combo-box-24.5.1.tgz", + "integrity": "sha512-3tcnj26cTJTISuoWL2lX1yvVz8/bXMzGnpde+x+yhth2CfzWlBZudc/+oD6MIFD5O9ehp3UPa1KWD4/l26f7IA==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/common-frontend": { @@ -3406,9 +3411,9 @@ } }, "node_modules/@vaadin/component-base": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.4.2.tgz", - "integrity": "sha512-n9psD+BsC/i2FaqxU/YnYBFIeWP7qmXfdVvMadVcWjJ1NKmvU1Xvna0/IPJ6BwSShCf8vzS3yJc2ePQaV5OInw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.5.1.tgz", + "integrity": "sha512-+fs8ukmFuhiD3cLoE07yWAsxZcvApEwN+fohNrSpquCLcGbQsbjUV04JPzBhJ+KFSfwAMMDgEyBVUUrzZjm7eQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -3418,610 +3423,629 @@ } }, "node_modules/@vaadin/confirm-dialog": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/confirm-dialog/-/confirm-dialog-24.4.2.tgz", - "integrity": "sha512-6xnofp97GXaoqURJCjOKxb5mSL2lNcHbGmHsmLf2AHEI0mpDqFhtZI6Ifkk+cMPE8vtW4XN5pAtuIZgta/3yfQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/confirm-dialog/-/confirm-dialog-24.5.1.tgz", + "integrity": "sha512-HvqhLIhP7qLB34NxL5qIqK12X2uAKT/SjFeOm5x16F7UYbTgr29dMB2DCE/PsOv2xFM/HBG27i6Hy9tbct0N8Q==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/dialog": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/dialog": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/context-menu": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/context-menu/-/context-menu-24.4.2.tgz", - "integrity": "sha512-DGdFVy8Hl5TmXWz3havjDxEyWm+MkR653qlH1HSmxiESeBCIBUitAqzICL0IJKtDujZopOd03lKwxrNDpCEDZg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/context-menu/-/context-menu-24.5.1.tgz", + "integrity": "sha512-vp/7/sBPi5W64yPbHo2qucM0rtnCc+Uf49KilM3c3iCmF84w7zPeC86oLidC1T0gFjob8djt/mYeJudW0g72mg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/list-box": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/list-box": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/cookie-consent": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/cookie-consent/-/cookie-consent-24.4.2.tgz", - "integrity": "sha512-9b3NqDK/DNoTJRrNf9WlPfhbeDehMgU8hqNF6aMyoX7S+OuRfsJ8GlyEWsSxS27xCuZ9LHFakooTVQF/x/54OQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/cookie-consent/-/cookie-consent-24.5.1.tgz", + "integrity": "sha512-abHkykqrGfPq1U31TXQGo6ZzTWcgL6agY2BhPUHSjSx/gi7Xtvw3BEIo/GjVhUDTpiIRClinyV9UBPOXraNuSA==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", "cookieconsent": "^3.0.6" } }, "node_modules/@vaadin/crud": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/crud/-/crud-24.4.2.tgz", - "integrity": "sha512-pRmwL+5HEzysJ6scbACXz4jiexgK9Y8uyihPaa2MGDBEGJWGsVAfIblFJL4QoHVVpGW66tZSox/zfLp9lGt3Vw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/crud/-/crud-24.5.1.tgz", + "integrity": "sha512-IsvgwZxX/dmbVx2gxjQlPng+zodzLfImHARrO3A/vIBh8ouyPP+jZ2OPk++Qoyn+BX4ridafdozjx67wzBymsQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/confirm-dialog": "~24.4.2", - "@vaadin/dialog": "~24.4.2", - "@vaadin/form-layout": "~24.4.2", - "@vaadin/grid": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/confirm-dialog": "~24.5.1", + "@vaadin/dialog": "~24.5.1", + "@vaadin/form-layout": "~24.5.1", + "@vaadin/grid": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/custom-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/custom-field/-/custom-field-24.4.2.tgz", - "integrity": "sha512-qBHFRcH8yDFdfWZWTqb3GR+DEVP4ok8MD98p5el+rZZc/ox4uQkxWBQBNrkYOaPg2EM3sToNKJMAz2MbSphexg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/custom-field/-/custom-field-24.5.1.tgz", + "integrity": "sha512-WzpqucSNuHe+WKyCcq8lBJwj+4EQftg+RQZeMiucz77qlXaM1SPMuRy1fryO3LI63SukskpMSTCRliSmvI22gw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/date-picker": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/date-picker/-/date-picker-24.4.2.tgz", - "integrity": "sha512-nFSwGjHr8CaBAsyf7+jDlznOoGyqH+XybqU5kyVqZMiQDnUQupmvRDtn8yuEG7NkFQiOu+jUMUure5yN3myRog==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/date-picker/-/date-picker-24.5.1.tgz", + "integrity": "sha512-WUIcqNm2RfvmOfNAu57XXvpu5KtyJKcigEaKSSN9+s1R5harRoz3Lm72pyhgulXWUz3PMKmcF6nXVwQ0ICNc5A==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.2.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/date-time-picker": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/date-time-picker/-/date-time-picker-24.4.2.tgz", - "integrity": "sha512-69+yq1bv3bFDgZinyn1dsl6oCly+7ux7hKMNARRwvU52gHrRUYv2oKnIjHwknc3w95lUOyqzjrBldHgLL6PMjg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/date-time-picker/-/date-time-picker-24.5.1.tgz", + "integrity": "sha512-NL7yvjr1pLucHP9RjzwmOvXAgoB20MK8YgfjbGgqjbqjahnGc2gj4cHxJTra9jVGAqekfKzwIsi8gpHY/vVUkA==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/custom-field": "~24.4.2", - "@vaadin/date-picker": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/time-picker": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/custom-field": "~24.5.1", + "@vaadin/date-picker": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/time-picker": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/details": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/details/-/details-24.4.2.tgz", - "integrity": "sha512-8s0RBfIIged0xobdBbSlM4plzYUSmrPNuenUmYHGrMiiUNaibe38Gr8CXeUpFpsDPl9ekOFub47XGdw1qUwYNg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/details/-/details-24.5.1.tgz", + "integrity": "sha512-68W7q12mqxtUOaWYKMnh1O1ACC70ykd38qcAr2bhHts+jVU/SANZGtyh72gnLvpbFAuwhwwUkQzhVe/pb5TkGA==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/dialog": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/dialog/-/dialog-24.4.2.tgz", - "integrity": "sha512-fX9Rsegqg6omspJ+Q6DBzivj1QNhqg1enuVfy75Y/McSTMiBJIrhWNk2VJL+V6M/+lo+1XOzMDeaKpPy9nVeFA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/dialog/-/dialog-24.5.1.tgz", + "integrity": "sha512-p8qt1b97F02xZYiwttZTWHMQo9+vxX3tFIQ5vTdq/f+FZZvpp1IVsrYcjLRgrDU/zqg4/VwAIoYLeBtsGibnRQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/email-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/email-field/-/email-field-24.4.2.tgz", - "integrity": "sha512-8X5Z4H3moLKvxAGeLkK8Vo0pIXbS6D1R7uzejbmmPrCJaxbL3jNFLZly/FajPIXviowbGznM8quWihrYcdt/NA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/email-field/-/email-field-24.5.1.tgz", + "integrity": "sha512-TQezI8NwBEZnYFUE2ta0ByxBJ1j2MSJA3OqUmVFNT1Jd1Xfqqyq/CgOowBg9ov4HGr2sjuxLBI5+xsvdj0WSyQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/field-base": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.4.2.tgz", - "integrity": "sha512-B8B9/uXXMrX/bPJlBRPgsP12XVhk9RK82SgeL7sriVJFFqqn2bUFo40R0QdaJ6PVLsjAKdvwaQo+kaA38usrMg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.5.1.tgz", + "integrity": "sha512-GALRiF+FlVbGwyaPh9ACencmyZlhGnKOvqxHgAk2tbkndkm71dNStlHGf5x/SlF6BTe5H3D6KLSXIonNMBAFLw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/field-highlighter": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/field-highlighter/-/field-highlighter-24.4.2.tgz", - "integrity": "sha512-DFnI8OraKzjggp40PAE2VxHlajndRxLg2HwLTeaqmPrjQPl+TTBF6hR8VQEvcE67ptTKrbHeBCtfFFs5Fc8wWA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/field-highlighter/-/field-highlighter-24.5.1.tgz", + "integrity": "sha512-VaQYlqhgAe0v1llZvHy6YKj7IRPvjSGYDpcKfgHwSoSxXd26irmgtaLn/HCns06hQG0arO2mcH5wt3IRCMHmMQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/form-layout": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/form-layout/-/form-layout-24.4.2.tgz", - "integrity": "sha512-hCSmZWz/g+hJCfO5lnUdwGtvnYSX/Mh9Ttrn/8nK9ZdUlhyn5zSSRCKi4PfoJT+8sFwwlxPiNbwmX6pfDlLC9g==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/form-layout/-/form-layout-24.5.1.tgz", + "integrity": "sha512-NpZF4GkxcyF2hVbcI1JfkWiISbWv5ydQG5W/le82ANWzAQ4GdFOOGVZCXQJnb5qw7n9P5ZgyRABsbwAZuk8p2w==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/grid": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.4.2.tgz", - "integrity": "sha512-QoC1jCgCvEZ+R60Fo64h/Hc/LBGCZ/o33z+cxtOCOWjrFpue6LBhHRsIG5NE+JPMH+itykGZBih3K3ryZ00CsQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.5.1.tgz", + "integrity": "sha512-PSmwkjGIHz31QqBnq2GndttS9zxIKRwsyQrTFHonl01obrFjxm3yXHFvVR6047vxzUb7EE7DHqnu4543eg+Ctg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/checkbox": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/checkbox": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid-pro": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/grid-pro/-/grid-pro-24.4.2.tgz", - "integrity": "sha512-j7iaEbZp06QLrozAWuf94lbJU3/CiKZRvW5qm+a2sRKlXeohYjFDq6MYzTbJgHa29gdKkbx/SlmguydEZQJCBw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/grid-pro/-/grid-pro-24.5.1.tgz", + "integrity": "sha512-8bu8Pj2vSf1rtpD2D+vI+tOfWSBfzNEids/dHIXZqL+BkWwx9hQiQbqpovXn6Zsro4GN8MhjNfdlHDj5369fhQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/checkbox": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/grid": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/select": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/checkbox": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/grid": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/select": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/horizontal-layout": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/horizontal-layout/-/horizontal-layout-24.4.2.tgz", - "integrity": "sha512-iJQ2PJexJBFB/RK2kaHzQeG69kXZRW4SmDgCWCU99so2G6FY8a3fnQXEVqHvnTvyApr3MdrKpkN1ks78PxWGYg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/horizontal-layout/-/horizontal-layout-24.5.1.tgz", + "integrity": "sha512-cN06VIw9iK4YjcoTXEE8gXvP/rg7kD+zytRT0HDYRKpcCs2smja4bcIYuU7uRkdQgJnfciJm4GGKq8Irbrd7eQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/icon": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.4.2.tgz", - "integrity": "sha512-bS2UjecY0srCpgs0CaCNA3ernMyRuaHt2RczFmiiA5k/9lT/kBADTBHa8u5+hMskUtCwdSbAGn+GUwFIVMyxKw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.5.1.tgz", + "integrity": "sha512-dzkCUzF0k3kYZKX0dE0EW2zXJz8sblQ4MNYvMw6Itevo8kH5a5vHhltCq9Nm9YX5TPFuJERH6acoLQ5o1C3fYg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/icons": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/icons/-/icons-24.4.2.tgz", - "integrity": "sha512-7o2CybdMnJs6UFjkT4dkci4ddIn2uKvW0JjeI2iHbQ+5+zAZ6OY/0ZLRE6LtyRd1CzF6vdRDb5h7Bc3zUgACYA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/icons/-/icons-24.5.1.tgz", + "integrity": "sha512-mKmth6oHrqDXxG4UXsx7WNhh+H8hTFFdCvnvZ0FzLloJLmnPIF/YLlpJJuaTo5gbOuHKYqC3wgctmvFu8kzXSA==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/icon": "~24.4.2" + "@vaadin/icon": "~24.5.1" } }, "node_modules/@vaadin/input-container": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.4.2.tgz", - "integrity": "sha512-NmRi7yScrN/vGuJae3ZEcpUXhp63vHIzjd58nN6B5oJW8d4mr+IVysZAM3Bvr+UNtqaLchkjHs+79U560lKAWA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.5.1.tgz", + "integrity": "sha512-uRvO9ZsW4VaIaGtdOb+igWPu6tXdeqpuzS0eoAaIrSmWe/fsg9C1SazDrQiJ8ZawrH6I9IwP/yuiTv++TA0l/g==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/integer-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/integer-field/-/integer-field-24.4.2.tgz", - "integrity": "sha512-/vrhPt58nSIYkg9bRBiZzYPzYV1uTMnC0CnpKgaPezIR3aOCCjwW/3C4pnzPLrnasjAn4wftoxDWhMxN17QhfQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/integer-field/-/integer-field-24.5.1.tgz", + "integrity": "sha512-lTWJhmCky3wPQuEJEQo5yUy/GVW6aj978t+i33Ukv3VuOhOJsmcphOQZNK8BomxYItRIJ9pSnF+g4P9XvopiJw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/number-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/number-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1" } }, "node_modules/@vaadin/item": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/item/-/item-24.4.2.tgz", - "integrity": "sha512-/FOYSC2kqzCJwjjPsXrRzyo6J+LTP8rX1chmDUFjkE/PkYzu1ihj9vgrgqjHAH8mAbbMgV89eg8PQyrs/t9cEA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/item/-/item-24.5.1.tgz", + "integrity": "sha512-fyYmvxlqlELz0GoEv+ENqNibHLaQZ6Lvsh9dxKcyDcMto1vuF553zyK9pjpJ9MKgHBSjINLYKVWjztwurX/Bgw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/list-box": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/list-box/-/list-box-24.4.2.tgz", - "integrity": "sha512-H2bb1uCtoRArLiWpvWCY/fGpAArIHvKDgwyFvyoaAx5uKdSOrky6PBQWr2rYHiw3tpComNdpWJht2/uGfrnVjA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/list-box/-/list-box-24.5.1.tgz", + "integrity": "sha512-OhDFi114j+kkYpxfIc2R467JL7A3y45grncjHAupARLbiWpe0ef2wyuD8BNBxbnfgL71QVEq/G2PHOESn4n8rQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.4.2.tgz", - "integrity": "sha512-CZkf4ZN+GC7CsM7BxG4r0WkstNm/C8qNTUk5UV9xvh0bmvAbRu2B9QIl+FEJhRrCNfR1p5OtymBpbWCG+vT5AQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.5.1.tgz", + "integrity": "sha512-/YSO4Fs6QN2BNGiIDpb7kCfB893zEj0f2hwGVeiLkd/YIomIT80KJXiZF5p4K/Fkj9Lb98pgi3xDw65vfco5WA==", "dependencies": { "lit": "^3.0.0" } }, "node_modules/@vaadin/login": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/login/-/login-24.4.2.tgz", - "integrity": "sha512-fzsxuTMrLhQE7z1F6TwURnKihv0CdFle5UsFOjgQEPwWc39cVKTPL6HBHldBoWvmI5usJzuEG1kvq3qBVzmRkw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/login/-/login-24.5.1.tgz", + "integrity": "sha512-0wfduxhPIiqPJrLq3bouKWJj7as/zq+ObK61hmO49lpBgR0PX6gNAt7wES8THPGI7dDm/KbIv9jkJr7OPQ7Bzg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/password-field": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/password-field": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/map": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/map/-/map-24.4.2.tgz", - "integrity": "sha512-MzMcMoCSM25f6r7zzmQKWSFre0vL70pJV7r89araxMztq5iZEi5mGuGkTWcgcPzJTS4XLCaMPqsugfMXQHkyiQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/map/-/map-24.5.1.tgz", + "integrity": "sha512-P4oBy8oOjjG3cUB9bkNqWzayZWfl2j/vKX5kUEwfh4pL5s6E1rjZdKi0XyIIbv1hZN4/s1Fwk0RYLGsxGur1fQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "ol": "6.13.0" } }, "node_modules/@vaadin/menu-bar": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/menu-bar/-/menu-bar-24.4.2.tgz", - "integrity": "sha512-S/ksF50cwGyYtzuiZ3+X64GZG8ET9BfCnP44SxMifTdtH/KJiRMFgSjKGehKvSBBtUbQ2k3IqVhe32s/pe0FpA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/menu-bar/-/menu-bar-24.5.1.tgz", + "integrity": "sha512-/8zovkkTpfe+qcy+i4zVfm9u4AqEwFJzomU6PBvuI02GzusrrIEA02e9y3MZNaXt8xf47BDBCNQt82oDg2av6w==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/context-menu": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/list-box": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/context-menu": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/list-box": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/message-input": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/message-input/-/message-input-24.4.2.tgz", - "integrity": "sha512-Sx6SGL41I4+Y5v6VtJjukkL6IJlFoqg+bbb5JSOlT16dy8SSLD5jjKAhQ/Einw2UdvQepTPMnRrgFUw84KAd9g==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/message-input/-/message-input-24.5.1.tgz", + "integrity": "sha512-67fUgMX03meCc1dmsKrv0lehkk5v3nMAX1yraWqN2V+C3XSD4FvZ0b/Djcvawhc8RMIWwCAGp2znouhuck6nkQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/text-area": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/text-area": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/message-list": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/message-list/-/message-list-24.4.2.tgz", - "integrity": "sha512-TQY7JAxtcPrfBltiuNQWLlCV/vs3SpfI7DGw4IbFFnV/qH9l8cu4ZBXb8TL9PO8y8odx9dnXdZPbpK/U9VhIzQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/message-list/-/message-list-24.5.1.tgz", + "integrity": "sha512-KcMZ6N6wyTuCDwhdM78AoG1nJa8EaYCRVFK5lurG3cS3hjtImrN0gjIlrHNI/8Ruj2f7dg5+oTiQtDmla6tYng==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/avatar": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/avatar": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/multi-select-combo-box": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/multi-select-combo-box/-/multi-select-combo-box-24.4.2.tgz", - "integrity": "sha512-qGN7cKJxUnXmBIYcaYN/5/QMrGohwcOL2AWjyGphCrtSlPUcS/9zWGZsDXhiFtb6G3iznt/JOQlbf+gEhs61PQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/multi-select-combo-box/-/multi-select-combo-box-24.5.1.tgz", + "integrity": "sha512-CoUxSgnfTXDhh4y8ug8T2d/1ODAeaUyfaPEdcziV+X73MmJGF8h9LWXgR5EXIM6SL5IxDCgjceDz+qpmLQlvlQ==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/combo-box": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/combo-box": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/notification": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/notification/-/notification-24.4.2.tgz", - "integrity": "sha512-bAFKZx+edwzaaFL3eiSRu7nH8wtBc32sdE+8H6n6Qmj1x10tCAys7bxs72gpcjRqWHA+ObfXxcuLwIupW5MpwA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/notification/-/notification-24.5.1.tgz", + "integrity": "sha512-hY4MZx8btKpogjl9haXbwoxFA143qvmxFHeIExnFESfMdqwPap5P6AWKxuGj+C8kIzx3sIzLeFxVCF7d8N+XuA==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/number-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/number-field/-/number-field-24.4.2.tgz", - "integrity": "sha512-LBcS5Pa8GwhjH64httBKYZbFo2LQch6aXwYeklW9QTgnlUOQvWqyERvuOyhkzq2Sg4N5APeY/8H084w35ZVPRg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/number-field/-/number-field-24.5.1.tgz", + "integrity": "sha512-VzC40nGRxCqeLU3Wgvao/09w7XL+dqFEcWxLY5J9muLv8k3PDsuU26Dm9yuVrPfH9qdKT82eOGZKJuD9uQ+b+A==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/overlay": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/overlay/-/overlay-24.4.2.tgz", - "integrity": "sha512-6N1HmPVCccF6lXdJS4uCE5JhcTwALQQmWRq+urCPWr3L+EljF6RvvVWDPsk79t1tPfCp6gNWesRZVm0LlsRZRQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/overlay/-/overlay-24.5.1.tgz", + "integrity": "sha512-ioz/YfMoikwP9qoQ2kJ9q8CuxvyW2Q6JmszMoW4tqTHnXZuf7VTpu2An/0Pc9sTcRaSRReelai+VevZg+jUhlg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/password-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/password-field/-/password-field-24.4.2.tgz", - "integrity": "sha512-9Co3cMHV8ANFR+M4N7XDZfgJOHPCsBHSY+ZAah1zP3jULMyqCP4XXYslAcgRFLfgLq1JIt137+ZJyzqvCU3rJg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/password-field/-/password-field-24.5.1.tgz", + "integrity": "sha512-2K40drYzsZYHgFelTKSwsM84WPsTLc0XIDbw++HFQjY/kAGtsWYqSoY38MUWYuWUMVNxt6hBK/EdTqHbLsivSw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/polymer-legacy-adapter": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/polymer-legacy-adapter/-/polymer-legacy-adapter-24.4.2.tgz", - "integrity": "sha512-/XDL8t6HSsJAzo3R5ONgjfEi4lYJtSU4pPwCU5qOHuR7GWCrH1OPlVkDY3xbJdTD+/hB3ft0eQN4WmP/34dmgQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/polymer-legacy-adapter/-/polymer-legacy-adapter-24.5.1.tgz", + "integrity": "sha512-ixsoN2rce+gXOyo79+rlb+GiCmft5I+p2MVzaRegkv6AAR3viD4TK/I2nuVglw6TFJK2+GfXP/2IXwhTk5E/3A==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/vaadin-themable-mixin": "~24.5.1", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/popover": { + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/popover/-/popover-24.5.1.tgz", + "integrity": "sha512-Rfj0zVXfJx4DNWvl/5UhrOdPiyzj/E8ByAHDxacIRfc5W5mHAsdJK/6BbR4wS9Bcz7j00aaN+Tw6ceQuCm5mWg==", + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/progress-bar": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/progress-bar/-/progress-bar-24.4.2.tgz", - "integrity": "sha512-0V3gBnQz4ogZfw7PDMDpr13T276W2vsL8yoPDknTqbRfpmJB0DJbauV4sZorgt6YgrEQ0K5HQYpi1xMvCi59Eg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/progress-bar/-/progress-bar-24.5.1.tgz", + "integrity": "sha512-bAlnA3lrpS5l8S8yHxHDuC63yOhh25c0dtnK5CMGNAzzYablGd6T4tacLXrlFUy/dbupnmT8VO479xMY4GLyWw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/radio-group": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/radio-group/-/radio-group-24.4.2.tgz", - "integrity": "sha512-VrUszPExkOWrroYBVMpGt1lqYmj9WJqHhxoPOnS6BVDZiJxhKiEcwbk/kfR40YxraxYRPP+vsnxADbAG1EaZBQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/radio-group/-/radio-group-24.5.1.tgz", + "integrity": "sha512-RV00m4eF8LKiwvpWRKESUHQwtXtbN+IAUSbj7MWTCe9BHqwseg6dZXhh/53biLhHEv21cHKIVScPB2JyVzYQ3Q==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/react-components": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/react-components/-/react-components-24.4.2.tgz", - "integrity": "sha512-gzr4NqnmAKhUeuOCiC8CgLP1i0rRI4mtayQy6dW1xgU30SC66Tb2i01mas/xe2msVKpE05yQAxb92PjAXp3XPQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/react-components/-/react-components-24.5.1.tgz", + "integrity": "sha512-j8wfa03JStt8b9OrmCS9s0YeOgStt1usW7AQePzqjnCV4zhI0TcLY/O1kRqxP1Bs3IyOeXnQW5G9XoP65nHNGQ==", "dependencies": { - "@lit/react": "^1.0.0", - "@vaadin/a11y-base": "24.4.2", - "@vaadin/accordion": "24.4.2", - "@vaadin/app-layout": "24.4.2", - "@vaadin/avatar": "24.4.2", - "@vaadin/avatar-group": "24.4.2", - "@vaadin/button": "24.4.2", - "@vaadin/checkbox": "24.4.2", - "@vaadin/checkbox-group": "24.4.2", - "@vaadin/combo-box": "24.4.2", - "@vaadin/component-base": "24.4.2", - "@vaadin/confirm-dialog": "24.4.2", - "@vaadin/context-menu": "24.4.2", - "@vaadin/custom-field": "24.4.2", - "@vaadin/date-picker": "24.4.2", - "@vaadin/date-time-picker": "24.4.2", - "@vaadin/details": "24.4.2", - "@vaadin/dialog": "24.4.2", - "@vaadin/email-field": "24.4.2", - "@vaadin/field-base": "24.4.2", - "@vaadin/field-highlighter": "24.4.2", - "@vaadin/form-layout": "24.4.2", - "@vaadin/grid": "24.4.2", - "@vaadin/horizontal-layout": "24.4.2", - "@vaadin/icon": "24.4.2", - "@vaadin/icons": "24.4.2", - "@vaadin/input-container": "24.4.2", - "@vaadin/integer-field": "24.4.2", - "@vaadin/item": "24.4.2", - "@vaadin/list-box": "24.4.2", - "@vaadin/lit-renderer": "24.4.2", - "@vaadin/login": "24.4.2", - "@vaadin/menu-bar": "24.4.2", - "@vaadin/message-input": "24.4.2", - "@vaadin/message-list": "24.4.2", - "@vaadin/multi-select-combo-box": "24.4.2", - "@vaadin/notification": "24.4.2", - "@vaadin/number-field": "24.4.2", - "@vaadin/overlay": "24.4.2", - "@vaadin/password-field": "24.4.2", - "@vaadin/progress-bar": "24.4.2", - "@vaadin/radio-group": "24.4.2", - "@vaadin/scroller": "24.4.2", - "@vaadin/select": "24.4.2", - "@vaadin/side-nav": "24.4.2", - "@vaadin/split-layout": "24.4.2", - "@vaadin/tabs": "24.4.2", - "@vaadin/tabsheet": "24.4.2", - "@vaadin/text-area": "24.4.2", - "@vaadin/text-field": "24.4.2", - "@vaadin/time-picker": "24.4.2", - "@vaadin/tooltip": "24.4.2", - "@vaadin/upload": "24.4.2", - "@vaadin/vaadin-lumo-styles": "24.4.2", - "@vaadin/vaadin-material-styles": "24.4.2", - "@vaadin/vaadin-themable-mixin": "24.4.2", - "@vaadin/vertical-layout": "24.4.2", - "@vaadin/virtual-list": "24.4.2" + "@lit/react": "^1.0.5", + "@vaadin/a11y-base": "24.5.1", + "@vaadin/accordion": "24.5.1", + "@vaadin/app-layout": "24.5.1", + "@vaadin/avatar": "24.5.1", + "@vaadin/avatar-group": "24.5.1", + "@vaadin/button": "24.5.1", + "@vaadin/checkbox": "24.5.1", + "@vaadin/checkbox-group": "24.5.1", + "@vaadin/combo-box": "24.5.1", + "@vaadin/component-base": "24.5.1", + "@vaadin/confirm-dialog": "24.5.1", + "@vaadin/context-menu": "24.5.1", + "@vaadin/custom-field": "24.5.1", + "@vaadin/date-picker": "24.5.1", + "@vaadin/date-time-picker": "24.5.1", + "@vaadin/details": "24.5.1", + "@vaadin/dialog": "24.5.1", + "@vaadin/email-field": "24.5.1", + "@vaadin/field-base": "24.5.1", + "@vaadin/field-highlighter": "24.5.1", + "@vaadin/form-layout": "24.5.1", + "@vaadin/grid": "24.5.1", + "@vaadin/horizontal-layout": "24.5.1", + "@vaadin/icon": "24.5.1", + "@vaadin/icons": "24.5.1", + "@vaadin/input-container": "24.5.1", + "@vaadin/integer-field": "24.5.1", + "@vaadin/item": "24.5.1", + "@vaadin/list-box": "24.5.1", + "@vaadin/lit-renderer": "24.5.1", + "@vaadin/login": "24.5.1", + "@vaadin/menu-bar": "24.5.1", + "@vaadin/message-input": "24.5.1", + "@vaadin/message-list": "24.5.1", + "@vaadin/multi-select-combo-box": "24.5.1", + "@vaadin/notification": "24.5.1", + "@vaadin/number-field": "24.5.1", + "@vaadin/overlay": "24.5.1", + "@vaadin/password-field": "24.5.1", + "@vaadin/popover": "24.5.1", + "@vaadin/progress-bar": "24.5.1", + "@vaadin/radio-group": "24.5.1", + "@vaadin/scroller": "24.5.1", + "@vaadin/select": "24.5.1", + "@vaadin/side-nav": "24.5.1", + "@vaadin/split-layout": "24.5.1", + "@vaadin/tabs": "24.5.1", + "@vaadin/tabsheet": "24.5.1", + "@vaadin/text-area": "24.5.1", + "@vaadin/text-field": "24.5.1", + "@vaadin/time-picker": "24.5.1", + "@vaadin/tooltip": "24.5.1", + "@vaadin/upload": "24.5.1", + "@vaadin/vaadin-lumo-styles": "24.5.1", + "@vaadin/vaadin-material-styles": "24.5.1", + "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/vertical-layout": "24.5.1", + "@vaadin/virtual-list": "24.5.1" }, "peerDependencies": { "@types/react": "^18.2.37", @@ -4039,19 +4063,19 @@ } }, "node_modules/@vaadin/react-components-pro": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/react-components-pro/-/react-components-pro-24.4.2.tgz", - "integrity": "sha512-JrdV8Cx0w3b4sZ19rJ6n/JX/iEp7ris79m3lnmOxTDDUQAwizklHrrZo7oznXiZ6gqfX8T+baZ7q0TBwUyi18g==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/react-components-pro/-/react-components-pro-24.5.1.tgz", + "integrity": "sha512-2qoodwGLwkNtIeSNIXoQJ9WleuHBFhS1KGbsI2/cOeidop64wfQ2fyJ7vCE5uML/Ku7zA+wG2UTCpSV/LQXWeg==", "dependencies": { - "@lit/react": "^1.0.0", - "@vaadin/board": "24.4.2", - "@vaadin/charts": "24.4.2", - "@vaadin/cookie-consent": "24.4.2", - "@vaadin/crud": "24.4.2", - "@vaadin/grid-pro": "24.4.2", - "@vaadin/map": "24.4.2", - "@vaadin/react-components": "24.4.2", - "@vaadin/rich-text-editor": "24.4.2" + "@lit/react": "^1.0.5", + "@vaadin/board": "24.5.1", + "@vaadin/charts": "24.5.1", + "@vaadin/cookie-consent": "24.5.1", + "@vaadin/crud": "24.5.1", + "@vaadin/grid-pro": "24.5.1", + "@vaadin/map": "24.5.1", + "@vaadin/react-components": "24.5.1", + "@vaadin/rich-text-editor": "24.5.1" }, "peerDependencies": { "@types/react": "^18.2.37", @@ -4069,205 +4093,221 @@ } }, "node_modules/@vaadin/rich-text-editor": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/rich-text-editor/-/rich-text-editor-24.4.2.tgz", - "integrity": "sha512-cx49BLDufgYsDF21JEdnqpjFRj0Wx27N5F9grhy2TSOP1ZGlJCpnXmqZOIXLhofDTy40R9tr6z80EbMs3VUcaw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/rich-text-editor/-/rich-text-editor-24.5.1.tgz", + "integrity": "sha512-sxD+up7emg/6lJ7F8PSWKiTVLvtou4BR4NhBDEmJCxm+B3aR6PXTNAukkRSMV1Md8rUbqLLu7c2NLVVdUgwZRg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/confirm-dialog": "~24.4.2", - "@vaadin/text-field": "~24.4.2", - "@vaadin/tooltip": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/confirm-dialog": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/text-field": "~24.5.1", + "@vaadin/tooltip": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/router": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@vaadin/router/-/router-1.7.5.tgz", - "integrity": "sha512-uRN3vd1ihgd596bF/NMZqpgxau0nlvIc0/JDd1EwStFNbZID/xIVse5LXdQhIyUKLmSl4T0GeCQK505xerWX0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vaadin/router/-/router-2.0.0.tgz", + "integrity": "sha512-IjOlzuUsrVhfBId+ypcdDLM3+GZHo64DUlkr8IjFe04A4kMvt0zVFIpPH03X52/tMiwyYOF0Sw6p53DXkWiZcA==", "dependencies": { - "@vaadin/vaadin-usage-statistics": "^2.1.0", - "path-to-regexp": "2.4.0" + "@vaadin/vaadin-usage-statistics": "^2.1.2", + "path-to-regexp": "^6.3.0", + "type-fest": "^4.26.1" + } + }, + "node_modules/@vaadin/router/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@vaadin/scroller": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/scroller/-/scroller-24.4.2.tgz", - "integrity": "sha512-B/8rszPm9gW5lbmoYTN9yAnGUn3pzOPalWTpDJqi5xfuTha/fsnBXc4w4rwvEVOsiOZi2fpKg4adW3ukTygBNw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/scroller/-/scroller-24.5.1.tgz", + "integrity": "sha512-R7Dkc4N3qCAxEK9CVvijK0iO1zG+gVp9boQ9pSVT1EhOpTlST+g1R5fmAZ9hZgdF2hs4yROGBQ0jHQDYF1N/Kw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/select": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/select/-/select-24.4.2.tgz", - "integrity": "sha512-ragWK24WDJkjrWvLiSpTWB9plpZcWpT9xTB3bl7E7HUniCb+rvADC/ftq2G/FcWOENEP7exDN6E1hP7MGIxUAA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/select/-/select-24.5.1.tgz", + "integrity": "sha512-9D40ivG1Q2eL7FLHAnQjK9+61/r0Hi2U+KwNrZvJnecFtamARPmZBRHqhyGThWVZ0sC7SvEveP3JgY+0w3Yjdg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.2.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/list-box": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/list-box": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/side-nav": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/side-nav/-/side-nav-24.4.2.tgz", - "integrity": "sha512-UUwmt+3/NnXhZihByCdq3fUdznIDDW9RbOGBRl4mzSNvTZfeqwxdAyUg0j8AvXWtdo95bKwATqT4P/8dmpH1Bg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/side-nav/-/side-nav-24.5.1.tgz", + "integrity": "sha512-N2pYW7MXRoUibTmYyCyEf0L3R9EZW+bOaa59Bw8yTY8GnM2IUo7BNussgL52Y+PT+Irx/CXahHUUUdHqbwnsRA==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/split-layout": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/split-layout/-/split-layout-24.4.2.tgz", - "integrity": "sha512-SG23Py2h41y3srBuLjrLrF1HIoPwoVugXXLzv07ZJtd9Fu3lS4csdr194OzGt8UmVwByi0MJX0EtLr0CaXf0SQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/split-layout/-/split-layout-24.5.1.tgz", + "integrity": "sha512-/gFb9OePtv+9lIrGJEZQ4oyf/+1Zwi+yuvqemrs05aDJslKzR9ol0RRhLwv1+48hLoIH8allxfpA93Lv+5zJUg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", + "lit": "^3.0.0" } }, "node_modules/@vaadin/tabs": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/tabs/-/tabs-24.4.2.tgz", - "integrity": "sha512-TyZ6WZhjn+bbKlrk96khRyN5rFt+orljawBHcHxKgSwmceNU2EFsUyEwXh6RzlMihoeUu4lZF8Q83CuPAFisRA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/tabs/-/tabs-24.5.1.tgz", + "integrity": "sha512-pLOQCyc6W1pJsvTQPTcChvqnKblBmm/wepYuwUVKdx1idHEnVg/0uSXSis7kTS2PoE2Geih5JhDs2/aTPSTUcw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/tabsheet": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/tabsheet/-/tabsheet-24.4.2.tgz", - "integrity": "sha512-CvbfNZ1pQobr1e9yS8HHIZJKVimsdpG+pAzUBfutfpKFNKdYTHLf1bBOcuGoU/athYTX0moN442PcUySf7P15g==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/tabsheet/-/tabsheet-24.5.1.tgz", + "integrity": "sha512-UH9nXX4uEouquyERHWUoexE5gAl12oEvpYuX9h//qoK6b5nKgfk6xHVJ//fRAEL4kULw4eN6R7JuewPTZAenbg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/scroller": "~24.4.2", - "@vaadin/tabs": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/scroller": "~24.5.1", + "@vaadin/tabs": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/text-area": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/text-area/-/text-area-24.4.2.tgz", - "integrity": "sha512-M1M53yut37FDn86+AML0x584AmS9vwDyQ1DhC9SWtYOwZyFBJMnjm8tJNO0guOAOFXgbGGr8xqYnjxWWp2FhiA==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/text-area/-/text-area-24.5.1.tgz", + "integrity": "sha512-xvfmF3+lgozrib9pyprFJaqTK6umnmNiwZTz9RUn46EjnkuYQ0OoYJ0bXyeUTqX/Uv/2zr8MKoX9PtpvuQWTAw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/text-field": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.4.2.tgz", - "integrity": "sha512-WqTTu/X/iA1EyYyJg3c9ktnUYAxYjUoipEkLWqaka+Ya/OhG9IMwPkwXPzywGqUolHHJRFJ2veEIIa0Z0HuY6w==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.5.1.tgz", + "integrity": "sha512-k7nHpNzzJbKaMulPr48BQqPzheunKFeV6CYgWK5Su3P43j/sXALsJErAJ4qnmma9ZC5zy0LEQ4POGrL/q/tKCw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, "node_modules/@vaadin/time-picker": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/time-picker/-/time-picker-24.4.2.tgz", - "integrity": "sha512-PghKzLzjZHxiOFq/RK9wEs5mud97AcawT55Y3K82rnU/ee3e8dE40RimE0OYdz0yurkb6WwUyxWm9eBsEUQl3A==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/time-picker/-/time-picker-24.5.1.tgz", + "integrity": "sha512-FQQGxsQoaCajpi/8Fx14Gr/EYWfflDcPSF8P1uVOXu6SB8ZXNnCyCs072cW0/3rdDcFFSKIzpq0Wulr70AkW+A==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/combo-box": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/field-base": "~24.4.2", - "@vaadin/input-container": "~24.4.2", - "@vaadin/item": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/combo-box": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/field-base": "~24.5.1", + "@vaadin/input-container": "~24.5.1", + "@vaadin/item": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/tooltip": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/tooltip/-/tooltip-24.4.2.tgz", - "integrity": "sha512-SlGgjfRTlN5baV8j4m47NSNHzumwTvW4RftGF8v58vBU2NOU7MiA95332IC8vzWekIq4MOAvUZPxrX4DXBgaBQ==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/tooltip/-/tooltip-24.5.1.tgz", + "integrity": "sha512-ctcRwkTcy02lgXL3lMg5iaSsi8sImA5MnRSdUlGG/34CGuA3XvlZftt4jI/FGXiPeKcwrBg1fTfSR6iGsRsAuw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/overlay": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/overlay": "~24.5.1", + "@vaadin/popover": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", + "lit": "^3.0.0" } }, "node_modules/@vaadin/upload": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/upload/-/upload-24.4.2.tgz", - "integrity": "sha512-Suo7P4bZ99Pn6SqfLYi9Arcr4JJsErtq0h7t0zTd6cI5xPD+WVFnHMTboo+U0JKPmKHkbpD/0UfpK/NeCdaBvw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/upload/-/upload-24.5.1.tgz", + "integrity": "sha512-j5jjAS3yBTa40wj3VcpJ50nNC0YqJ1HHhqqxCazyI88Nx4R3mT6PJ9vS6W2rPDXdzHSx+WVa3px3DpTlmmpmfw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.4.2", - "@vaadin/button": "~24.4.2", - "@vaadin/component-base": "~24.4.2", - "@vaadin/progress-bar": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/a11y-base": "~24.5.1", + "@vaadin/button": "~24.5.1", + "@vaadin/component-base": "~24.5.1", + "@vaadin/progress-bar": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, @@ -4277,39 +4317,39 @@ "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==" }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.4.2.tgz", - "integrity": "sha512-n7deJjAqliRDr0QSGOiWjtRTTF23C353p2byq4lSNLp3utHbguZZsnrjs0oRHW7kmbjpeAEwETKeieSrUjlqUw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.5.1.tgz", + "integrity": "sha512-4HIlIaN0yFgWVPvuvF62bmonYmvVV1lLkDpwe0m7ECO4yNMoxGdsFYQe0ggdiw10HBGOLwMSwa1q1HkluaRxPw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/icon": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/icon": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.4.2.tgz", - "integrity": "sha512-Mck8vprXlbOcc+suqUsmjkWDcf+kocKgHKBaWF+mAl8EdjOsV/35LJjIFzL7fRvt6mwaMgrtcPONBzYa4qW28A==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.5.1.tgz", + "integrity": "sha512-NqzjLUYwt74s8nC2oR4SKdneTUoJ739WXf0qLBRcFK2cYiHLQFF81RHiCcU5VQpFj0NY9VeuawBjMztnZPTpwg==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.4.2.tgz", - "integrity": "sha512-WhZ4sJcj5WjWCSQcxUkqmvRJzRnJnzTMC8Zu90aQHE+ZpkuoX9lEgA7Ikw8GL+OnAlOpiHfiC4cMsMbu6xPlAg==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.5.1.tgz", + "integrity": "sha512-NQ1+GVS/8Lxv9DpRTzLVxp/N+L0EYvfidmzWS2lLF0PfHQxk00AFNRVKuCbsxrckTblRJHkf3rbQTo3hl8SC2Q==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "lit": "^3.0.0" } }, "node_modules/@vaadin/vaadin-usage-statistics": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.2.tgz", - "integrity": "sha512-xKs1PvRfTXsG0eWWcImLXWjv7D+f1vfoIvovppv6pZ5QX8xgcxWUdNgERlOOdGt3CTuxQXukTBW3+Qfva+OXSg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", + "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", "hasInstallScript": true, "dependencies": { "@vaadin/vaadin-development-mode-detector": "^2.0.0" @@ -4319,29 +4359,29 @@ } }, "node_modules/@vaadin/vertical-layout": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/vertical-layout/-/vertical-layout-24.4.2.tgz", - "integrity": "sha512-qAm/3IHVKuB7Ek4HA6Ua1d9JxXEBNYEXw+unqtTrXf7sUp07fKVAzieeO5UJZTY9CvO+Nnj8XlrsVnK+9hC0Cw==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/vertical-layout/-/vertical-layout-24.5.1.tgz", + "integrity": "sha512-WmqlkSGIErVuB9r4qB8n7yO720eqxWj12DM1/WFYdgx9LZKpW05095qeDVFrT4OsXc00hQ8j8BIT75kDDJHOlw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2" + "@vaadin/component-base": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1" } }, "node_modules/@vaadin/virtual-list": { - "version": "24.4.2", - "resolved": "https://registry.npmjs.org/@vaadin/virtual-list/-/virtual-list-24.4.2.tgz", - "integrity": "sha512-pvXDPVfDoe+iv582CJlF8BFxNEvYuqyWHEGejTs0W8p32rtnDcEEj4TLGJXXgMEbGdJZ7Vdx8YbO64BZOYYR5Q==", + "version": "24.5.1", + "resolved": "https://registry.npmjs.org/@vaadin/virtual-list/-/virtual-list-24.5.1.tgz", + "integrity": "sha512-fGimNR25/wA4oMTWv/4z0SGTIlrKU0qVUjv94XlaVnSGFKlu+7eBA5aC9NQeqktANBrgGCe3L/FBQTSSt0TjlQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.4.2", - "@vaadin/lit-renderer": "~24.4.2", - "@vaadin/vaadin-lumo-styles": "~24.4.2", - "@vaadin/vaadin-material-styles": "~24.4.2", - "@vaadin/vaadin-themable-mixin": "~24.4.2", + "@vaadin/component-base": "~24.5.1", + "@vaadin/lit-renderer": "~24.5.1", + "@vaadin/vaadin-lumo-styles": "~24.5.1", + "@vaadin/vaadin-material-styles": "~24.5.1", + "@vaadin/vaadin-themable-mixin": "~24.5.1", "lit": "^3.0.0" } }, @@ -7556,9 +7596,9 @@ } }, "node_modules/path-to-regexp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", - "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" }, "node_modules/pbf": { "version": "3.2.1", @@ -7652,9 +7692,9 @@ "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==" }, "node_modules/proj4": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.11.0.tgz", - "integrity": "sha512-SasuTkAx8HnWQHfIyhkdUNJorSJqINHAN3EyMWYiQRVorftz9DHz650YraFgczwgtHOxqnfuDxSNv3C8MUnHeg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.12.1.tgz", + "integrity": "sha512-vmhP3hmstjXjzFwg8QXJwpoj4n7GVrXk3ZW3DzNK/Ur4cuwXq7ZiMXaWYvLYLQbX8n4MXgbwTr4lthOUZltBpA==", "dependencies": { "mgrs": "1.0.0", "wkt-parser": "^1.3.3" diff --git a/package.json b/package.json index aae3eec..3395e11 100644 --- a/package.json +++ b/package.json @@ -6,22 +6,22 @@ "@f0rce/ace-widget": "1.0.2", "@polymer/polymer": "3.5.1", "@vaadin-component-factory/vcf-pdf-viewer": "2.0.1", - "@vaadin/bundles": "24.4.2", + "@vaadin/bundles": "24.5.1", "@vaadin/common-frontend": "0.0.19", - "@vaadin/polymer-legacy-adapter": "24.4.2", - "@vaadin/react-components": "24.4.2", - "@vaadin/react-components-pro": "24.4.2", - "@vaadin/router": "1.7.5", + "@vaadin/polymer-legacy-adapter": "24.5.1", + "@vaadin/react-components": "24.5.1", + "@vaadin/react-components-pro": "24.5.1", + "@vaadin/router": "2.0.0", "@vaadin/vaadin-development-mode-detector": "2.0.7", - "@vaadin/vaadin-lumo-styles": "24.4.2", - "@vaadin/vaadin-material-styles": "24.4.2", - "@vaadin/vaadin-themable-mixin": "24.4.2", - "@vaadin/vaadin-usage-statistics": "2.1.2", + "@vaadin/vaadin-lumo-styles": "24.5.1", + "@vaadin/vaadin-material-styles": "24.5.1", + "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/vaadin-usage-statistics": "2.1.3", "construct-style-sheets-polyfill": "3.1.0", "date-fns": "2.29.3", "lit": "3.1.4", "print-js": "1.6.0", - "proj4": "2.11.0", + "proj4": "2.12.1", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.23.1" @@ -51,22 +51,22 @@ "@f0rce/ace-widget": "1.0.2", "@polymer/polymer": "3.5.1", "@vaadin-component-factory/vcf-pdf-viewer": "2.0.1", - "@vaadin/bundles": "24.4.2", + "@vaadin/bundles": "24.5.1", "@vaadin/common-frontend": "0.0.19", - "@vaadin/polymer-legacy-adapter": "24.4.2", - "@vaadin/react-components": "24.4.2", - "@vaadin/react-components-pro": "24.4.2", - "@vaadin/router": "1.7.5", + "@vaadin/polymer-legacy-adapter": "24.5.1", + "@vaadin/react-components": "24.5.1", + "@vaadin/react-components-pro": "24.5.1", + "@vaadin/router": "2.0.0", "@vaadin/vaadin-development-mode-detector": "2.0.7", - "@vaadin/vaadin-lumo-styles": "24.4.2", - "@vaadin/vaadin-material-styles": "24.4.2", - "@vaadin/vaadin-themable-mixin": "24.4.2", - "@vaadin/vaadin-usage-statistics": "2.1.2", + "@vaadin/vaadin-lumo-styles": "24.5.1", + "@vaadin/vaadin-material-styles": "24.5.1", + "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/vaadin-usage-statistics": "2.1.3", "construct-style-sheets-polyfill": "3.1.0", "date-fns": "2.29.3", "lit": "3.1.4", "print-js": "1.6.0", - "proj4": "2.11.0", + "proj4": "2.12.1", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.23.1" @@ -91,7 +91,7 @@ "workbox-core": "7.1.0", "workbox-precaching": "7.1.0" }, - "hash": "0962b593830d75a70657cde2e956e8c49b704d39c45bfd150cda9fdac99f1c6e" + "hash": "1a0f17d48b329307b5862bc57499307d1b89f7d89260121c2b7189f76957c436" }, "overrides": { "@vaadin/bundles": "$@vaadin/bundles", diff --git a/pom.xml b/pom.xml index a9cae3e..1687fbf 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,8 @@ 21 - 24.4.6 + 24.5.1 + 24.4.6 @@ -119,6 +120,10 @@ commons-beanutils 1.9.4 + + com.fasterxml.jackson.core + jackson-core + org.mockito mockito-core @@ -181,6 +186,16 @@ viritin 2.8.22 + + org.apache.poi + poi-ooxml + 5.2.3 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + com.flowingcode.addons simple-timer @@ -240,6 +255,11 @@ freemarker 2.3.32 + + com.auth0 + java-jwt + 4.4.0 + org.apache.maven.plugins maven-surefire-plugin @@ -279,7 +299,7 @@ com.vaadin vaadin-maven-plugin - ${vaadin.version} + ${vaadin-maven-plugin.version} @@ -340,7 +360,7 @@ com.vaadin vaadin-maven-plugin - ${vaadin.version} + ${vaadin-maven-plugin.version} diff --git a/src/main/bundles/prod.bundle b/src/main/bundles/prod.bundle index 1f34d4d..3338417 100644 Binary files a/src/main/bundles/prod.bundle and b/src/main/bundles/prod.bundle differ diff --git a/src/main/java/com/primefactorsolutions/model/Actividad.java b/src/main/java/com/primefactorsolutions/model/Actividad.java new file mode 100644 index 0000000..f7df96d --- /dev/null +++ b/src/main/java/com/primefactorsolutions/model/Actividad.java @@ -0,0 +1,111 @@ +package com.primefactorsolutions.model; + +public final class Actividad { + private String nombre; + private double lunes; + private double martes; + private double miercoles; + private double jueves; + private double viernes; + private double sabado; + private double domingo; + + public Actividad(final Builder builder) { + this.nombre = builder.nombre; + this.lunes = builder.lunes; + this.martes = builder.martes; + this.miercoles = builder.miercoles; + this.jueves = builder.jueves; + this.viernes = builder.viernes; + this.sabado = builder.sabado; + this.domingo = builder.domingo; + } + + public String getNombre() { + return nombre; + } + + public double getLunes() { + return lunes; + } + + public double getMartes() { + return martes; + } + + public double getMiercoles() { + return miercoles; + } + + public double getJueves() { + return jueves; + } + + public double getViernes() { + return viernes; + } + + public double getSabado() { + return sabado; + } + + public double getDomingo() { + return domingo; + } + + // Builder para crear instancias de Actividad + public static class Builder { + private String nombre; + private double lunes; + private double martes; + private double miercoles; + private double jueves; + private double viernes; + private double sabado; + private double domingo; + + public Builder nombre(final String nombre) { + this.nombre = nombre; + return this; + } + + public Builder lunes(final double horas) { + this.lunes = horas; + return this; + } + + public Builder martes(final double horas) { + this.martes = horas; + return this; + } + + public Builder miercoles(final double horas) { + this.miercoles = horas; + return this; + } + + public Builder jueves(final double horas) { + this.jueves = horas; + return this; + } + + public Builder viernes(final double horas) { + this.viernes = horas; + return this; + } + + public Builder sabado(final double horas) { + this.sabado = horas; + return this; + } + + public Builder domingo(final double horas) { + this.domingo = horas; + return this; + } + + public Actividad build() { + return new Actividad(this); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/primefactorsolutions/model/HoursWorked.java b/src/main/java/com/primefactorsolutions/model/HoursWorked.java new file mode 100644 index 0000000..d02310f --- /dev/null +++ b/src/main/java/com/primefactorsolutions/model/HoursWorked.java @@ -0,0 +1,56 @@ +package com.primefactorsolutions.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; + +import java.util.UUID; + +@Entity +public class HoursWorked extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @ManyToOne + private Employee employee; + + private int weekNumber; + private double totalHours; + + public HoursWorked() { } + + public UUID getId() { + return id; + } + + public void setId(final UUID id) { + this.id = id; + } + + public Employee getEmployee() { + return employee; + } + + public void setEmployee(final Employee value) { + this.employee = value; + } + + public int getWeekNumber() { + return weekNumber; + } + + public void setWeekNumber(final int weekNumber) { + this.weekNumber = weekNumber; + } + + public double getTotalHours() { + return totalHours; + } + + public void setTotalHours(final double totalHours) { + this.totalHours = totalHours; + } +} diff --git a/src/main/java/com/primefactorsolutions/repositories/EmployeeRepository.java b/src/main/java/com/primefactorsolutions/repositories/EmployeeRepository.java index e27a88b..3016f8e 100644 --- a/src/main/java/com/primefactorsolutions/repositories/EmployeeRepository.java +++ b/src/main/java/com/primefactorsolutions/repositories/EmployeeRepository.java @@ -8,4 +8,6 @@ import java.util.UUID; public interface EmployeeRepository extends JpaRepository { Optional findByUsername(String username); + + Optional findByPersonalEmail(String personalEmail); } diff --git a/src/main/java/com/primefactorsolutions/repositories/HoursWorkedRepository.java b/src/main/java/com/primefactorsolutions/repositories/HoursWorkedRepository.java new file mode 100644 index 0000000..e5ad85b --- /dev/null +++ b/src/main/java/com/primefactorsolutions/repositories/HoursWorkedRepository.java @@ -0,0 +1,10 @@ +package com.primefactorsolutions.repositories; + +import com.primefactorsolutions.model.HoursWorked; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HoursWorkedRepository extends JpaRepository { + // Puedes definir consultas personalizadas aquí si es necesario. +} diff --git a/src/main/java/com/primefactorsolutions/service/AccountService.java b/src/main/java/com/primefactorsolutions/service/AccountService.java new file mode 100644 index 0000000..8400a6e --- /dev/null +++ b/src/main/java/com/primefactorsolutions/service/AccountService.java @@ -0,0 +1,101 @@ +package com.primefactorsolutions.service; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTCreationException; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.auth0.jwt.interfaces.JWTVerifier; +import com.primefactorsolutions.model.Employee; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; + +@Service +@Slf4j +public class AccountService { + private final EmailService emailService; + private final EmployeeService employeeService; + private final String secret; + + public AccountService(final EmailService emailService, final EmployeeService employeeService, + @Value("${application.jwtSecret}") final String secret) { + this.emailService = emailService; + this.employeeService = employeeService; + this.secret = secret; + } + + public void sendResetPasswordEmail(final String personalEmail) { + final Employee employee = employeeService.getEmployeeByPersonalEmail(personalEmail); + + if (employee == null) { + log.warn("Could not find employee for email {}", personalEmail); + return; + } + + final String link = createResetPasswordLink(employee.getUsername()); + final String content = "Visit this link to reset your password: " + link; + emailService.sendEmail(personalEmail, "PFS - Reset Password", content); + } + + public void resetPassword(final String username, final String newPassword, final String token) { + DecodedJWT decodedJWT; + + try { + Algorithm algorithm = Algorithm.HMAC512(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withIssuer("pfs") + .build(); + + decodedJWT = verifier.verify(token); + final Instant expiry = decodedJWT.getExpiresAtAsInstant(); + final String claim = decodedJWT.getClaim("username").asString(); + + if (expiry.isBefore(Instant.now()) + || !username.equals(claim)) { + log.warn("token invalid {} {} {}", username, claim, expiry); + return; + } + } catch (JWTVerificationException e) { + log.warn("error updating password", e); + return; + } + + final Employee employee = employeeService.getDetachedEmployeeByUsername(username); + + if (employee == null) { + log.warn("Could not find employee for username {}", username); + return; + } + + if (StringUtils.isBlank(newPassword) || newPassword.length() < 8) { + throw new IllegalArgumentException("New password should be at least 8 chars long"); + } + + employeeService.updatePassword(employee, newPassword); + + log.info("updated password for {}", username); + } + + private String createResetPasswordLink(final String username) { + String token = ""; + + try { + Algorithm algorithm = Algorithm.HMAC512(secret); + token = JWT.create() + .withIssuer("pfs") + .withClaim("username", username) + .withExpiresAt(Instant.now().plus(1, ChronoUnit.HOURS)) + .sign(algorithm); + } catch (JWTCreationException e) { + throw new RuntimeException(e); + } + + return String.format("https://intra.primefactorsolutions.com/reset-password?username=%s&token=%s", username, + token); + } +} diff --git a/src/main/java/com/primefactorsolutions/service/EmailService.java b/src/main/java/com/primefactorsolutions/service/EmailService.java new file mode 100644 index 0000000..8045887 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/service/EmailService.java @@ -0,0 +1,32 @@ +package com.primefactorsolutions.service; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +@Slf4j +public class EmailService { + public static final String NO_REPLY_PRIMEFACTORSOLUTIONS_COM = "no-reply@primefactorsolutions.com"; + private final JavaMailSender emailSender; + + public void sendEmail(final String email, final String title, final String messageContent) { + try { + final SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(NO_REPLY_PRIMEFACTORSOLUTIONS_COM); + message.setBcc(NO_REPLY_PRIMEFACTORSOLUTIONS_COM); + message.setTo(email); + message.setSubject(title); + message.setText(messageContent); + + emailSender.send(message); + log.info("Sent email to {}", email); + } catch (Exception e) { + log.error("Error sending email to {}", email, e); + throw e; + } + } +} diff --git a/src/main/java/com/primefactorsolutions/service/EmployeeService.java b/src/main/java/com/primefactorsolutions/service/EmployeeService.java index 4313877..e63c88a 100644 --- a/src/main/java/com/primefactorsolutions/service/EmployeeService.java +++ b/src/main/java/com/primefactorsolutions/service/EmployeeService.java @@ -18,12 +18,18 @@ import java.util.Collections; @Service @AllArgsConstructor public class EmployeeService { + private static final String USERPASSWORD = "userPassword"; + private static final String OBJECTCLASS = "objectclass"; + private static final String ORGANIZATIONAL_PERSON = "organizationalPerson"; + private static final String INET_ORG_PERSON = "inetOrgPerson"; + private static final String TOP = "top"; + private static final String PERSON = "person"; + public static final String BASE_DN = "dc=primefactorsolutions,dc=com"; + private final EmployeeRepository employeeRepository; private final LdapTemplate ldapTemplate; private final EntityManager entityManager; - public static final String BASE_DN = "dc=primefactorsolutions,dc=com"; - protected Name buildDn(final Employee employee) { return LdapNameBuilder.newInstance(BASE_DN) .add("ou", "users") @@ -63,6 +69,10 @@ public class EmployeeService { return employees.subList(start, end); } + public Employee getEmployeeByPersonalEmail(final String email) { + return employeeRepository.findByPersonalEmail(email).orElse(null); + } + public Employee createOrUpdate(final Employee employee) { if (employee.getId() == null) { final Name dn = buildDn(employee); @@ -74,28 +84,29 @@ public class EmployeeService { } public Employee getEmployee(final UUID id) { - Optional employee = employeeRepository.findById(id); + final Optional employee = employeeRepository.findById(id); + return employee.orElse(null); } private Attributes buildAttributes(final Employee employee) { final Attributes attrs = new BasicAttributes(); - final BasicAttribute ocattr = new BasicAttribute("objectclass"); - ocattr.add("top"); - ocattr.add("person"); - ocattr.add("organizationalPerson"); - ocattr.add("inetOrgPerson"); + final BasicAttribute ocattr = new BasicAttribute(OBJECTCLASS); + ocattr.add(TOP); + ocattr.add(PERSON); + ocattr.add(ORGANIZATIONAL_PERSON); + ocattr.add(INET_ORG_PERSON); attrs.put(ocattr); attrs.put("cn", String.format("%s %s", employee.getFirstName(), employee.getLastName())); attrs.put("sn", String.format("%s %s", employee.getFirstName(), employee.getLastName())); attrs.put("uid", employee.getUsername()); - attrs.put("userpassword", String.format("%s%s", employee.getUsername(), 123)); + attrs.put(USERPASSWORD, String.format("%s%s", employee.getUsername(), 123)); return attrs; } - public void updatePassword(final Employee employee) { - final Attribute attr = new BasicAttribute("userpassword", employee.getUsername() + "123"); + public void updatePassword(final Employee employee, final String newPassword) { + final Attribute attr = new BasicAttribute(USERPASSWORD, newPassword); final ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr); ldapTemplate.modifyAttributes(buildDn(employee), new ModificationItem[] {item}); diff --git a/src/main/java/com/primefactorsolutions/service/HoursWorkedService.java b/src/main/java/com/primefactorsolutions/service/HoursWorkedService.java new file mode 100644 index 0000000..2da3c4b --- /dev/null +++ b/src/main/java/com/primefactorsolutions/service/HoursWorkedService.java @@ -0,0 +1,35 @@ +package com.primefactorsolutions.service; + +import com.primefactorsolutions.model.HoursWorked; +import com.primefactorsolutions.repositories.HoursWorkedRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class HoursWorkedService { + private final HoursWorkedRepository hoursWorkedRepository; + + @Autowired + public HoursWorkedService(final HoursWorkedRepository hoursWorkedRepository) { + this.hoursWorkedRepository = hoursWorkedRepository; + } + + public List findAll() { + return hoursWorkedRepository.findAll(); + } + + public HoursWorked saveHoursWorked(final HoursWorked hoursWorked) { + return hoursWorkedRepository.save(hoursWorked); + } + + public HoursWorked save(final HoursWorked hoursWorked) { + return hoursWorkedRepository.save(hoursWorked); + } + + public void deleteHoursWorked(final Long id) { + hoursWorkedRepository.deleteById(id); + } +} + diff --git a/src/main/java/com/primefactorsolutions/service/ReportService.java b/src/main/java/com/primefactorsolutions/service/ReportService.java index 0de93fd..beaa21a 100644 --- a/src/main/java/com/primefactorsolutions/service/ReportService.java +++ b/src/main/java/com/primefactorsolutions/service/ReportService.java @@ -2,6 +2,7 @@ package com.primefactorsolutions.service; import com.openhtmltopdf.pdfboxout.PdfBoxRenderer; import com.openhtmltopdf.pdfboxout.PdfRendererBuilder; +import com.primefactorsolutions.repositories.HoursWorkedRepository; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; @@ -9,15 +10,77 @@ import freemarker.template.TemplateExceptionHandler; import lombok.SneakyThrows; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import java.io.*; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; import java.util.TimeZone; @Service public class ReportService { + private final HoursWorkedRepository hoursWorkedRepository; + + public ReportService(final HoursWorkedRepository hoursWorkedRepository) { + this.hoursWorkedRepository = hoursWorkedRepository; + } + + // Este método ahora solo crea el archivo Excel a partir de los datos que recibe. + public byte[] writeAsExcel(final String reportName, final List headers, + final List> data) + throws IOException { + return createExcelFile(reportName, headers, data); + } + + private byte[] createExcelFile(final String reportName, final List headers, + final List> data) + throws IOException { + try (Workbook workbook = new XSSFWorkbook(); + ByteArrayOutputStream os = new ByteArrayOutputStream()) { + Sheet sheet = workbook.createSheet(reportName); + + // Crear encabezados + Row headerRow = sheet.createRow(0); + CellStyle headerStyle = workbook.createCellStyle(); + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + + for (int i = 0; i < headers.size(); i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers.get(i)); + cell.setCellStyle(headerStyle); + } + + // Crear filas de datos + for (int i = 0; i < data.size(); i++) { + Row dataRow = sheet.createRow(i + 1); + Map rowData = data.get(i); + int cellIndex = 0; + for (String key : headers) { + Cell cell = dataRow.createCell(cellIndex++); + Object value = rowData.get(key); + switch (value) { + case String s -> cell.setCellValue(s); + case Number number -> cell.setCellValue(number.doubleValue()); + case null -> cell.setCellValue(""); // Manejo de valores nulos + default -> { + } + } + } + } + + workbook.write(os); + return os.toByteArray(); + } catch (IOException e) { + System.err.println("Error al generar el archivo Excel: " + e.getMessage()); + throw e; // Propagar la excepción después de registrarla + } + } @SneakyThrows public byte[] writeAsPdf(final String reportName, final Object model) { diff --git a/src/main/java/com/primefactorsolutions/views/EmployeeView.java b/src/main/java/com/primefactorsolutions/views/EmployeeView.java index 43e01f7..a02d5a9 100644 --- a/src/main/java/com/primefactorsolutions/views/EmployeeView.java +++ b/src/main/java/com/primefactorsolutions/views/EmployeeView.java @@ -158,6 +158,18 @@ public class EmployeeView extends BeanValidationForm implements HasUrl configureComponents(); addClassName("main-layout"); + + getBinder().setConverter("team", new Converter() { + @Override + public Result convertToModel(final Object o, final ValueContext valueContext) { + return Result.ok(new Team((String) o)); + } + + @Override + public Object convertToPresentation(final Object o, final ValueContext valueContext) { + return ((Team) o).getName(); + } + }); } private void configureComponents() { diff --git a/src/main/java/com/primefactorsolutions/views/EvaluationView.java b/src/main/java/com/primefactorsolutions/views/EvaluationView.java index 95298de..84a1a36 100644 --- a/src/main/java/com/primefactorsolutions/views/EvaluationView.java +++ b/src/main/java/com/primefactorsolutions/views/EvaluationView.java @@ -196,7 +196,6 @@ public class EvaluationView extends Main implements HasUrlParameter { final MenuBar navMenuBar = new MenuBar(); prev = navMenuBar.addItem("Anterior pregunta", (ComponentEventListener>) menuItemClickEvent -> { - log.info(">>> prev"); this.currSubmission.setResponse(this.questionEditor.getValue()); this.assessmentService.saveSubmission(assessment.getId(), this.currSubmission); this.currSubmission = this.assessmentService.getPrevSubmission(assessment.getId(), this.currSubmission); @@ -253,7 +252,6 @@ public class EvaluationView extends Main implements HasUrlParameter { start = new Button("Empezar"); start.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_SUCCESS); start.addClickListener((ComponentEventListener>) buttonClickEvent -> { - log.info(">>> start"); this.assessment = this.assessmentService.startAssessment(this.assessment.getId()); if (tf.getValue().trim().equalsIgnoreCase(this.assessment.getCandidate().getEmail())) { @@ -318,7 +316,6 @@ public class EvaluationView extends Main implements HasUrlParameter { } private void goToNext() { - log.info(">>> next"); Submission found = this.assessmentService.getNextSubmission(assessment.getId(), this.currSubmission.getId()); diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java new file mode 100644 index 0000000..88d86e6 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java @@ -0,0 +1,161 @@ +package com.primefactorsolutions.views; + +import com.primefactorsolutions.model.Employee; +import com.primefactorsolutions.model.Actividad; +import com.primefactorsolutions.service.EmployeeService; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.datepicker.DatePicker; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.html.Label; +import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.spring.annotation.SpringComponent; +import jakarta.annotation.security.PermitAll; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; + +import java.time.LocalDate; +import java.util.List; + +@SpringComponent +@PermitAll +@Scope("prototype") +@PageTitle("Hours Worked Month") +@Route(value = "/hours-worked-month/me", layout = MainLayout.class) +public class HoursWorkedMonthView extends VerticalLayout { + private final EmployeeService employeeService; + private final ComboBox employeeComboBox = new ComboBox<>("Empleado"); + private final ComboBox equipoDropdown = new ComboBox<>("Equipo"); + private final Grid grid = new Grid<>(Actividad.class); + + private final Label totalCompletadoLabel = new Label(); + private final Label horasPendientesLabel = new Label(); + private final Label totalAcumuladasLabel = new Label(); + private final Label horasAdeudadasLabel = new Label(); + private final Button actualizarButton = new Button("Actualizar"); + private final Button guardarButton = new Button("Guardar"); + private final Button cerrarButton = new Button("Cerrar"); + + private LocalDate selectedMonth; + + @Autowired + public HoursWorkedMonthView(final EmployeeService employeeService) { + this.employeeService = employeeService; + configurarVista(); + } + + private void configurarVista() { + DatePicker monthPicker = new DatePicker("Selecciona un mes"); + monthPicker.setValue(LocalDate.now()); + monthPicker.addValueChangeListener(event -> { + selectedMonth = event.getValue().withDayOfMonth(1); + //cargarDatosMes(selectedMonth); + }); + + equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); + equipoDropdown.setWidth("250px"); + + setEmployeeComboBoxProperties(); + + configurarGrid(); + + actualizarButton.addClickListener(event -> actualizarDatos()); + guardarButton.addClickListener(event -> guardarActividades()); + cerrarButton.addClickListener(event -> closeView()); + + HorizontalLayout headerLayout = new HorizontalLayout(monthPicker, equipoDropdown, employeeComboBox); + add( + headerLayout, grid, totalCompletadoLabel, + horasPendientesLabel, totalAcumuladasLabel, + horasAdeudadasLabel, actualizarButton, + guardarButton, cerrarButton); + } + + private void setEmployeeComboBoxProperties() { + employeeComboBox.setWidth("250px"); + employeeComboBox.setPlaceholder("Buscar empleado..."); + employeeComboBox.setItems(employeeService.findAllEmployees()); + employeeComboBox.setItemLabelGenerator(employee -> employee.getFirstName() + " " + employee.getLastName()); + } + + private void configurarGrid() { + grid.removeAllColumns(); + grid.addColumn(Actividad::getLunes).setHeader("Lunes"); + grid.addColumn(Actividad::getMartes).setHeader("Martes"); + grid.addColumn(Actividad::getMiercoles).setHeader("Miércoles"); + grid.addColumn(Actividad::getJueves).setHeader("Jueves"); + grid.addColumn(Actividad::getViernes).setHeader("Viernes"); + grid.addColumn(Actividad::getSabado).setHeader("Sábado"); + grid.addColumn(Actividad::getDomingo).setHeader("Domingo"); + grid.addColumn(this::calcularTotalPorDia).setHeader("Total Semanal").setKey("totalSemanal"); + } + +// private void cargarDatosMes(final LocalDate month) { +// List actividadesDelMes = obtenerActividadesDelMes(month); +// grid.setItems(actividadesDelMes); +// +// double totalCompletado = calcularTotalCompletado(actividadesDelMes); +// double horasPendientes = calcularHorasPendientes(totalCompletado); +// double totalAcumuladas = 166; +// double horasAdeudadas = 2; +// +// totalCompletadoLabel.setText("Prom. Hrs/Semana Completadas: " + totalCompletado); +// horasPendientesLabel.setText("Prom. Hrs/Semana Pendientes: " + horasPendientes); +// totalAcumuladasLabel.setText("Total Hrs./Mes Acumuladas: " + totalAcumuladas); +// horasAdeudadasLabel.setText("Total Hrs./Mes Adeudadas: " + horasAdeudadas); +// } + +// private List obtenerActividadesDelMes(final LocalDate month) { +// LocalDate startOfMonth = month.with(TemporalAdjusters.firstDayOfMonth()); +// LocalDate endOfMonth = month.with(TemporalAdjusters.lastDayOfMonth()); +// +// List actividadesDelMes = new ArrayList<>(); +// +// for (LocalDate date = startOfMonth; date.isBefore(endOfMonth.plusDays(1)); date = date.plusDays(1)) { +// Actividad actividad = new Actividad.Builder() +// .lunes(0) +// .martes(0) +// .miercoles(0) +// .jueves(0) +// .viernes(0) +// .sabado(0) +// .domingo(0) +// .build(); +// actividadesDelMes.add(actividad); +// } +// +// return actividadesDelMes; +// } + + private double calcularTotalCompletado(final List actividades) { + return actividades.stream() + .mapToDouble(this::calcularTotalPorDia) + .sum(); + } + + private double calcularTotalPorDia(final Actividad actividad) { + return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles() + + actividad.getJueves() + actividad.getViernes() + actividad.getSabado() + + actividad.getDomingo(); + } + + private double calcularHorasPendientes(final double totalCompletado) { + return 40 - totalCompletado; + } + + private void actualizarDatos() { + Notification.show("Datos actualizados."); + } + + private void guardarActividades() { + Notification.show("Actividades guardadas correctamente."); + } + + private void closeView() { + getUI().ifPresent(ui -> ui.navigate("")); + } +} diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java index faa4208..2c95054 100644 --- a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java @@ -1,19 +1,33 @@ package com.primefactorsolutions.views; - +import com.primefactorsolutions.model.Actividad; +import com.primefactorsolutions.model.Employee; +import com.primefactorsolutions.model.HoursWorked; +import com.primefactorsolutions.service.EmployeeService; +import com.primefactorsolutions.service.HoursWorkedService; import com.vaadin.flow.component.datepicker.DatePicker; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.combobox.ComboBox; -import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.component.html.H2; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.spring.annotation.SpringComponent; import jakarta.annotation.security.PermitAll; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; +import com.vaadin.flow.component.html.Label; + + +import java.time.DayOfWeek; import java.time.LocalDate; +import java.time.temporal.IsoFields; +import java.time.temporal.WeekFields; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; @SpringComponent @PermitAll @@ -21,20 +35,107 @@ import java.time.LocalDate; @PageTitle("Hours Worked") @Route(value = "/hours-worked/me", layout = MainLayout.class) public class HoursWorkedView extends VerticalLayout { - public HoursWorkedView() { - H2 title = new H2("Registro de Horas Trabajadas"); + private final List actividades = new ArrayList<>(); + private final Grid grid = new Grid<>(Actividad.class); - DatePicker datePicker = new DatePicker("Selecciona una fecha"); - datePicker.setValue(LocalDate.now()); + private final ComboBox employeeComboBox = new ComboBox<>("Employee"); + private LocalDate selectedStartOfWeek; + private int weekNumber; + + @Autowired + private final EmployeeService employeeService; + + private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas."); + private final Label totalCompletadoLabel = new Label(); + private final Label horasPendientesLabel = new Label(); + + @Autowired + private final HoursWorkedService hoursWorkedService; + public HoursWorkedView(final EmployeeService employeeService, final HoursWorkedService hoursWorkedService) { + this.employeeService = employeeService; + this.hoursWorkedService = hoursWorkedService; + configurarVista(); + cargarDatos(); + } + + private void cargarDatos() { + List listaDeHorasTrabajadas = obtenerDatos(); // Obtenemos la lista aquí + grid.setItems(actividades); + + double totalHoras = calcularTotalHoras(listaDeHorasTrabajadas); // Pasa la lista aquí + } + + private void setEmployeeComboBoxProperties() { + employeeComboBox.setWidth("250px"); + employeeComboBox.setPlaceholder("Buscar empleado..."); + employeeComboBox.setItems(employeeService.findAllEmployees()); + employeeComboBox.setItemLabelGenerator(employee -> employee.getFirstName() + " " + employee.getLastName()); + + employeeComboBox.setAllowCustomValue(false); + employeeComboBox.addCustomValueSetListener(event -> + Notification.show("Selecciona un empleado válido de la lista.") + ); + + employeeComboBox.addValueChangeListener(event -> { + Employee selectedEmployee = event.getValue(); + if (selectedEmployee != null) { + Notification.show("Empleado seleccionado: " + + selectedEmployee.getFirstName() + " " + + selectedEmployee.getLastName()); + } + }); + } + + private int getWeekOfYear(final LocalDate date) { + return date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); + } + + private void configurarVista() { + DatePicker fechaPicker = new DatePicker("Selecciona una fecha"); + fechaPicker.addValueChangeListener(event -> { + LocalDate selectedDate = event.getValue(); + if (selectedDate != null) { + selectedStartOfWeek = getStartOfWeek(selectedDate); + LocalDate endOfWeek = selectedStartOfWeek.plusDays(6); + fechasLabel.setText("Semana del " + selectedStartOfWeek + " al " + endOfWeek); + weekNumber = getWeekOfYear(selectedDate); + } + }); + + Button verMesButton = new Button("Ver Mes", event -> { + getUI().ifPresent(ui -> ui.navigate(HoursWorkedMonthView.class)); + }); ComboBox equipoDropdown = new ComboBox<>("Equipo"); - equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); // Ejemplo de datos + equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); + equipoDropdown.setWidth("250px"); - TextField empleadoSearch = new TextField("Empleado (Search)"); + setEmployeeComboBoxProperties(); - HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, empleadoSearch); + HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, employeeComboBox); + filtersLayout.setSpacing(true); - Grid grid = new Grid<>(Actividad.class, false); + configurarGrid(); + HorizontalLayout actividadFormLayout = configurarFormularioActividades(); + + Button actualizarButton = new Button("Actualizar Totales", event -> actualizarTotales()); + Button guardarButton = new Button("Guardar", event -> guardarActividades()); + Button cerrarButton = new Button("Cerrar", event -> this.closeView()); + + HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, + cerrarButton, verMesButton); + + VerticalLayout totalesLayout = new VerticalLayout(totalCompletadoLabel, horasPendientesLabel); + totalesLayout.setSpacing(true); + totalesLayout.setPadding(true); + + add(fechaPicker, fechasLabel, filtersLayout, grid, actividadFormLayout, buttonsLayout, totalesLayout); + + } + + private void configurarGrid() { + grid.removeAllColumns(); + grid.setItems(actividades); grid.addColumn(Actividad::getNombre).setHeader("Actividad"); grid.addColumn(Actividad::getLunes).setHeader("Lunes"); grid.addColumn(Actividad::getMartes).setHeader("Martes"); @@ -43,155 +144,127 @@ public class HoursWorkedView extends VerticalLayout { grid.addColumn(Actividad::getViernes).setHeader("Viernes"); grid.addColumn(Actividad::getSabado).setHeader("Sábado"); grid.addColumn(Actividad::getDomingo).setHeader("Domingo"); - - grid.setItems( - new Actividad.Builder() - .nombre("Actividad 1") - .lunes(3) - .martes(3) - .miercoles(3) - .jueves(3) - .viernes(3) - .sabado(1) - .domingo(2) - .build(), - new Actividad.Builder() - .nombre("Actividad 2") - .lunes(2) - .martes(2) - .miercoles(2) - .jueves(2) - .viernes(2) - .sabado(0) - .domingo(1) - .build(), - new Actividad.Builder() - .nombre("Meeting 1") - .lunes(0) - .martes(0.5) - .miercoles(0.5) - .jueves(0) - .viernes(0) - .sabado(0.5) - .domingo(0) - .build() - ); - - Button actualizarButton = new Button("Actualizar"); - Button guardarButton = new Button("Guardar"); - Button cerrarButton = new Button("Cerrar"); - - HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton); - - add(title, datePicker, filtersLayout, grid, buttonsLayout); + grid.addColumn(this::calcularTotalPorDia).setHeader("Total Día").setKey("totalDia"); } - public static final class Actividad { - private final String nombre; - private final double lunes; - private final double martes; - private final double miercoles; - private final double jueves; - private final double viernes; - private final double sabado; - private final double domingo; + private HorizontalLayout configurarFormularioActividades() { + TextField actividadNombre = new TextField("Actividad"); + actividadNombre.setWidth("200px"); - private Actividad(final Builder builder) { - this.nombre = builder.nombre; - this.lunes = builder.lunes; - this.martes = builder.martes; - this.miercoles = builder.miercoles; - this.jueves = builder.jueves; - this.viernes = builder.viernes; - this.sabado = builder.sabado; - this.domingo = builder.domingo; + TextField lunesHoras = crearCampoHora("Lunes"); + TextField martesHoras = crearCampoHora("Martes"); + TextField miercolesHoras = crearCampoHora("Miércoles"); + TextField juevesHoras = crearCampoHora("Jueves"); + TextField viernesHoras = crearCampoHora("Viernes"); + TextField sabadoHoras = crearCampoHora("Sábado"); + TextField domingoHoras = crearCampoHora("Domingo"); + + Button agregarActividadButton = new Button("Agregar Actividad", e -> { + try { + Actividad nuevaActividad = new Actividad.Builder() + .nombre(actividadNombre.getValue()) + .lunes(parseHoras(lunesHoras.getValue())) + .martes(parseHoras(martesHoras.getValue())) + .miercoles(parseHoras(miercolesHoras.getValue())) + .jueves(parseHoras(juevesHoras.getValue())) + .viernes(parseHoras(viernesHoras.getValue())) + .sabado(parseHoras(sabadoHoras.getValue())) + .domingo(parseHoras(domingoHoras.getValue())) + .build(); + + actividades.add(nuevaActividad); + grid.setItems(actividades); + actualizarTotales(); + Notification.show("Actividad agregada correctamente"); + // Limpiar los campos de entrada + actividadNombre.clear(); + lunesHoras.clear(); + martesHoras.clear(); + miercolesHoras.clear(); + juevesHoras.clear(); + viernesHoras.clear(); + sabadoHoras.clear(); + domingoHoras.clear(); + } catch (NumberFormatException ex) { + Notification.show("Error: Por favor ingresa números válidos para las horas."); + } + }); + + return new HorizontalLayout( + actividadNombre, lunesHoras, martesHoras, miercolesHoras, + juevesHoras, viernesHoras, sabadoHoras, domingoHoras, agregarActividadButton); + } + + private TextField crearCampoHora(final String placeholder) { + TextField field = new TextField(placeholder); + field.setWidth("80px"); + field.setPlaceholder("0.0"); + return field; + } + + private double parseHoras(final String value) { + if (value == null || value.trim().isEmpty()) { + return 0.0; + } + return Double.parseDouble(value); + } + + private LocalDate getStartOfWeek(final LocalDate date) { + WeekFields weekFields = WeekFields.of(Locale.getDefault()); + return date.with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()); + } + + private double calcularTotalPorDia(final Actividad actividad) { + return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles() + + actividad.getJueves() + actividad.getViernes() + actividad.getSabado() + actividad.getDomingo(); + } + + private void actualizarTotales() { + double totalSemanaCompletada = actividades.stream() + .mapToDouble(this::calcularTotalPorDia) + .sum(); + double horasPendientes = 40 - totalSemanaCompletada; + + totalCompletadoLabel.setText("Total Hrs/Semana Completadas: " + totalSemanaCompletada); + horasPendientesLabel.setText("Horas Pendientes: " + horasPendientes); + } + + private void guardarActividades() { + Employee selectedEmployee = employeeComboBox.getValue(); + + if (selectedEmployee == null) { + Notification.show("Por favor, selecciona un empleado antes de guardar."); + return; } - public static class Builder { - private String nombre; - private double lunes; - private double martes; - private double miercoles; - private double jueves; - private double viernes; - private double sabado; - private double domingo; + double totalHorasSemana = actividades.stream() + .mapToDouble(this::calcularTotalPorDia) + .sum(); - public Builder nombre(final String nombre) { - this.nombre = nombre; - return this; - } + HoursWorked hoursWorked = new HoursWorked(); + hoursWorked.setEmployee(selectedEmployee); + hoursWorked.setWeekNumber(weekNumber); + hoursWorked.setTotalHours(totalHorasSemana); - public Builder lunes(final double lunes) { - this.lunes = lunes; - return this; - } - - public Builder martes(final double martes) { - this.martes = martes; - return this; - } - - public Builder miercoles(final double miercoles) { - this.miercoles = miercoles; - return this; - } - - public Builder jueves(final double jueves) { - this.jueves = jueves; - return this; - } - - public Builder viernes(final double viernes) { - this.viernes = viernes; - return this; - } - - public Builder sabado(final double sabado) { - this.sabado = sabado; - return this; - } - - public Builder domingo(final double domingo) { - this.domingo = domingo; - return this; - } - - public Actividad build() { - return new Actividad(this); - } - } - - public String getNombre() { - return nombre; - } - - public double getLunes() { - return lunes; - } - - public double getMartes() { - return martes; - } - - public double getMiercoles() { - return miercoles; - } - - public double getJueves() { - return jueves; - } - - public double getViernes() { - return viernes; - } - - public double getSabado() { - return sabado; - } - - public double getDomingo() { - return domingo; + try { + hoursWorkedService.saveHoursWorked(hoursWorked); // Usa saveHoursWorked directamente + Notification.show("Actividades guardadas correctamente."); + } catch (Exception e) { + Notification.show("Error al guardar actividades: " + e.getMessage()); } } -} + + private double calcularTotalHoras(final List listaDeHorasTrabajadas) { + return listaDeHorasTrabajadas.stream() + .mapToDouble(HoursWorked::getTotalHours) + .sum(); + } + + private List obtenerDatos() { + return new ArrayList<>(); + } + + private void closeView() { + getUI().ifPresent(ui -> ui.navigate(HoursWorkedView.class)); + } +} \ No newline at end of file diff --git a/src/main/java/com/primefactorsolutions/views/InitAccountView.java b/src/main/java/com/primefactorsolutions/views/InitAccountView.java new file mode 100644 index 0000000..2cc8524 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/InitAccountView.java @@ -0,0 +1,53 @@ +package com.primefactorsolutions.views; + +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.button.ButtonVariant; +import com.vaadin.flow.component.formlayout.FormLayout; +import com.vaadin.flow.component.html.H3; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.PasswordField; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.BeforeEnterObserver; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.auth.AnonymousAllowed; + +@Route("init-account") +@PageTitle("PFS Intra") +@AnonymousAllowed +public class InitAccountView extends VerticalLayout implements BeforeEnterObserver { + + public InitAccountView() { + setSizeFull(); + setAlignItems(Alignment.CENTER); + setJustifyContentMode(JustifyContentMode.CENTER); + + final VerticalLayout vl = new VerticalLayout(); + vl.setJustifyContentMode(JustifyContentMode.CENTER); + vl.setWidth("400px"); + + final PasswordField password = new PasswordField("Password"); + final PasswordField confirmPassword = new PasswordField("Confirm Password"); + + final FormLayout formLayout = new FormLayout(password, confirmPassword); + formLayout.setColspan(password, 3); + formLayout.setColspan(confirmPassword, 3); + + final Button primaryButton = new Button("Submit"); + primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + + final Button secondaryButton = new Button("Cancel"); + HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton); + + vl.add(new H3("Set Account Password")); + vl.add(formLayout); + vl.add(hl); + + add(vl); + } + + @Override + public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) { + } +} \ No newline at end of file diff --git a/src/main/java/com/primefactorsolutions/views/LoginView.java b/src/main/java/com/primefactorsolutions/views/LoginView.java index 6864493..9a280c5 100644 --- a/src/main/java/com/primefactorsolutions/views/LoginView.java +++ b/src/main/java/com/primefactorsolutions/views/LoginView.java @@ -1,5 +1,6 @@ package com.primefactorsolutions.views; +import com.vaadin.flow.component.html.Anchor; import com.vaadin.flow.component.html.H1; import com.vaadin.flow.component.login.LoginForm; import com.vaadin.flow.component.orderedlayout.VerticalLayout; @@ -23,9 +24,11 @@ public class LoginView extends VerticalLayout implements BeforeEnterObserver { setJustifyContentMode(JustifyContentMode.CENTER); login.setAction("login"); + login.setForgotPasswordButtonVisible(false); add(new H1("PFS Intra")); add(login); + add(new Anchor("/password-recovery", "Reset password?")); } @Override diff --git a/src/main/java/com/primefactorsolutions/views/MainLayout.java b/src/main/java/com/primefactorsolutions/views/MainLayout.java index d7e59b6..5670c38 100644 --- a/src/main/java/com/primefactorsolutions/views/MainLayout.java +++ b/src/main/java/com/primefactorsolutions/views/MainLayout.java @@ -1,6 +1,7 @@ package com.primefactorsolutions.views; import com.primefactorsolutions.model.Employee; +import com.vaadin.flow.component.Component; import com.vaadin.flow.component.Text; import com.vaadin.flow.component.applayout.AppLayout; import com.vaadin.flow.component.applayout.DrawerToggle; @@ -16,7 +17,6 @@ import com.vaadin.flow.component.menubar.MenuBarVariant; import com.vaadin.flow.component.orderedlayout.FlexComponent; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.Scroller; -import com.vaadin.flow.component.shared.Tooltip; import com.vaadin.flow.component.sidenav.SideNav; import com.vaadin.flow.component.sidenav.SideNavItem; import com.vaadin.flow.router.PageTitle; @@ -51,18 +51,6 @@ public class MainLayout extends AppLayout { final HorizontalLayout header = authContext.getAuthenticatedUser(UserDetails.class) .map(user -> { - final Avatar loggedUser = new Avatar(user.getUsername()); - loggedUser.getStyle().set("display", "block"); - loggedUser.getElement().setAttribute("tabindex", "-1"); - final MenuBar menuBar = new MenuBar(); - menuBar.addThemeVariants(MenuBarVariant.LUMO_ICON); - final MenuItem actions = createIconItem(menuBar, VaadinIcon.ELLIPSIS_V, null, "", - false); - final SubMenu actionsSubMenu = actions.getSubMenu(); - final MenuItem signOutMenuItem = createIconItem(actionsSubMenu, VaadinIcon.EXIT, "Sign-out", - null, true); - signOutMenuItem.addClickListener(c -> this.authContext.logout()); - String employeeId = "N/A"; if (user instanceof Employee) { @@ -73,11 +61,19 @@ public class MainLayout extends AppLayout { } } - final Tooltip tooltip = Tooltip.forComponent(loggedUser) - .withText("Employee id: " + employeeId) - .withPosition(Tooltip.TooltipPosition.TOP_START); + final Avatar loggedUser = new Avatar(user.getUsername()); + loggedUser.getStyle().set("display", "block"); + loggedUser.getElement().setAttribute("tabindex", "-1"); - final HorizontalLayout hl = new HorizontalLayout(loggedUser, menuBar); + final MenuBar menuBar = new MenuBar(); + menuBar.addThemeVariants(MenuBarVariant.LUMO_TERTIARY_INLINE); + final MenuItem actions = createIconItem(menuBar, loggedUser, null, employeeId); + final SubMenu actionsSubMenu = actions.getSubMenu(); + final MenuItem signOutMenuItem = createIconItem(actionsSubMenu, + createIcon(VaadinIcon.EXIT, true), "Sign-out", null); + signOutMenuItem.addClickListener(c -> this.authContext.logout()); + + final HorizontalLayout hl = new HorizontalLayout(menuBar); hl.setJustifyContentMode(FlexComponent.JustifyContentMode.END); return hl; @@ -88,17 +84,9 @@ public class MainLayout extends AppLayout { addToNavbar(true, toggle, viewTitle, header); } - private MenuItem createIconItem(final HasMenuItems menu, final VaadinIcon iconName, - final String label, final String ariaLabel, final boolean isChild) { - final Icon icon = new Icon(iconName); - - if (isChild) { - icon.getStyle().set("width", "var(--lumo-icon-size-s)"); - icon.getStyle().set("height", "var(--lumo-icon-size-s)"); - icon.getStyle().set("marginRight", "var(--lumo-space-s)"); - } - - final MenuItem item = menu.addItem(icon, e -> { + private MenuItem createIconItem(final HasMenuItems menu, final Component component, + final String label, final String ariaLabel) { + final MenuItem item = menu.addItem(component, e -> { }); if (ariaLabel != null) { @@ -112,6 +100,18 @@ public class MainLayout extends AppLayout { return item; } + private Icon createIcon(final VaadinIcon iconName, final boolean isChild) { + final Icon icon = new Icon(iconName); + + if (isChild) { + icon.getStyle().set("width", "var(--lumo-icon-size-s)"); + icon.getStyle().set("height", "var(--lumo-icon-size-s)"); + icon.getStyle().set("marginRight", "var(--lumo-space-s)"); + } + + return icon; + } + private void addDrawerContent() { final Span appName = new Span("pfs-intra"); appName.addClassNames(LumoUtility.FontWeight.SEMIBOLD, LumoUtility.FontSize.LARGE); @@ -124,8 +124,8 @@ public class MainLayout extends AppLayout { final SideNav nav = new SideNav(); authContext.getAuthenticatedUser(UserDetails.class).ifPresent(u -> { - SideNavItem recruiting = new SideNavItem("Recruiting", MainView.class, - LineAwesomeIcon.BUSINESS_TIME_SOLID.create()); + SideNavItem recruiting = new SideNavItem("Recruiting"); + recruiting.setPrefixComponent(LineAwesomeIcon.BUSINESS_TIME_SOLID.create()); recruiting.addItem(new SideNavItem("Assessments", AssessmentsListView.class, LineAwesomeIcon.RIBBON_SOLID.create())); recruiting.addItem(new SideNavItem("Candidates", CandidatesListView.class, @@ -133,8 +133,8 @@ public class MainLayout extends AppLayout { recruiting.addItem(new SideNavItem("Questions", QuestionsListView.class, LineAwesomeIcon.QUESTION_SOLID.create())); - SideNavItem admin = new SideNavItem("Admin", MainView.class, - LineAwesomeIcon.BUILDING.create()); + SideNavItem admin = new SideNavItem("Admin"); + admin.setPrefixComponent(LineAwesomeIcon.BUILDING.create()); admin.addItem(new SideNavItem("Employees", EmployeesListView.class, LineAwesomeIcon.USER_EDIT_SOLID.create())); admin.addItem(new SideNavItem("Documents", DocumentsListView.class, diff --git a/src/main/java/com/primefactorsolutions/views/PasswordRecoveryView.java b/src/main/java/com/primefactorsolutions/views/PasswordRecoveryView.java new file mode 100644 index 0000000..2d9c4a5 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/PasswordRecoveryView.java @@ -0,0 +1,67 @@ +package com.primefactorsolutions.views; + +import com.primefactorsolutions.service.AccountService; +import com.vaadin.flow.component.ClickEvent; +import com.vaadin.flow.component.ComponentEventListener; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.button.ButtonVariant; +import com.vaadin.flow.component.formlayout.FormLayout; +import com.vaadin.flow.component.html.H3; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.EmailField; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.BeforeEnterObserver; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.auth.AnonymousAllowed; + +@Route("password-recovery") +@PageTitle("PFS Intra") +@AnonymousAllowed +public class PasswordRecoveryView extends VerticalLayout implements BeforeEnterObserver { + + public PasswordRecoveryView(final AccountService accountService) { + setSizeFull(); + setAlignItems(Alignment.CENTER); + setJustifyContentMode(JustifyContentMode.CENTER); + + final VerticalLayout vl = new VerticalLayout(); + vl.setJustifyContentMode(JustifyContentMode.CENTER); + vl.setWidth("400px"); + + final EmailField personalEmail = new EmailField("Personal Email"); + personalEmail.setRequired(true); + + final EmailField confirmPersonalEmail = new EmailField("Confirm Personal Email"); + confirmPersonalEmail.setRequired(true); + + final FormLayout formLayout = new FormLayout(personalEmail, confirmPersonalEmail); + formLayout.setColspan(personalEmail, 3); + formLayout.setColspan(confirmPersonalEmail, 3); + + final Button primaryButton = new Button("Submit"); + primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + primaryButton.addClickListener((ComponentEventListener>) buttonClickEvent -> { + if (personalEmail.getValue().equals(confirmPersonalEmail.getValue())) { + accountService.sendResetPasswordEmail(personalEmail.getValue()); + getUI().ifPresent(ui -> ui.navigate(MainView.class)); + } + }); + + final Button secondaryButton = new Button("Cancel"); + final HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton); + secondaryButton.addClickListener((ComponentEventListener>) buttonClickEvent -> + getUI().ifPresent(ui -> ui.navigate(MainView.class))); + + vl.add(new H3("PFS - Password Recovery")); + vl.add(formLayout); + vl.add(hl); + + add(vl); + } + + @Override + public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) { + } +} \ No newline at end of file diff --git a/src/main/java/com/primefactorsolutions/views/ReporteView.java b/src/main/java/com/primefactorsolutions/views/ReporteView.java new file mode 100644 index 0000000..1416a56 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/ReporteView.java @@ -0,0 +1,87 @@ +package com.primefactorsolutions.views; + +import com.primefactorsolutions.model.HoursWorked; +import com.primefactorsolutions.service.HoursWorkedService; +import com.primefactorsolutions.service.ReportService; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.html.Anchor; +import com.vaadin.flow.component.html.H2; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.StreamResource; +import jakarta.annotation.security.PermitAll; +import org.springframework.beans.factory.annotation.Autowired; +import com.vaadin.flow.component.notification.Notification; + +import java.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@PermitAll +@Route(value = "/reportes", layout = MainLayout.class) +@PageTitle("Reporte de Horas Trabajadas") +public class ReporteView extends VerticalLayout { + + private final HoursWorkedService hoursWorkedService; + private final ReportService reportService; + + @Autowired + public ReporteView(final HoursWorkedService hoursWorkedService, final ReportService reportService) { + this.hoursWorkedService = hoursWorkedService; + this.reportService = reportService; + + H2 title = new H2("Reporte de Horas Trabajadas"); + add(title); + + Button reportButton = new Button("Generar Reporte de Horas Trabajadas", event -> generateHoursWorkedReport()); + add(reportButton); + } + + private void generateHoursWorkedReport() { + List hoursWorkedList = hoursWorkedService.findAll(); // Obtener la lista de HoursWorked + + if (hoursWorkedList.isEmpty()) { + Notification.show("No hay horas trabajadas disponibles para generar el reporte.", + 3000, Notification.Position.MIDDLE); + return; + } + + try { + List headers = List.of("ID", "Employee ID", "Week Number", "Total Hours"); + + List> data = hoursWorkedList.stream() + .map(hoursWorked -> { + Map map = new HashMap<>(); + map.put("ID", hoursWorked.getId().toString()); + map.put("Employee ID", hoursWorked.getEmployee().getId().toString()); + map.put("Week Number", hoursWorked.getWeekNumber()); + map.put("Total Hours", hoursWorked.getTotalHours()); + return map; + }) + .collect(Collectors.toList()); + + byte[] excelBytes = reportService.writeAsExcel("hours_worked_report", headers, data); + + StreamResource excelResource = new StreamResource("hours_worked_report.xlsx", + () -> new ByteArrayInputStream(excelBytes)); + excelResource.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + excelResource.setCacheTime(0); + + Anchor downloadLink = new Anchor(excelResource, "Descargar Reporte de Horas Trabajadas"); + downloadLink.getElement().setAttribute("download", true); + + add(downloadLink); + Notification.show("Reporte de horas trabajadas generado exitosamente.", + 3000, Notification.Position.MIDDLE); + + } catch (Exception e) { + Notification.show("Error al generar el reporte de horas trabajadas. Inténtalo de nuevo.", + 3000, Notification.Position.MIDDLE); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/primefactorsolutions/views/ResetPasswordView.java b/src/main/java/com/primefactorsolutions/views/ResetPasswordView.java new file mode 100644 index 0000000..c39edb2 --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/ResetPasswordView.java @@ -0,0 +1,71 @@ +package com.primefactorsolutions.views; + +import com.primefactorsolutions.service.AccountService; +import com.vaadin.flow.component.ClickEvent; +import com.vaadin.flow.component.ComponentEventListener; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.button.ButtonVariant; +import com.vaadin.flow.component.formlayout.FormLayout; +import com.vaadin.flow.component.html.H3; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.PasswordField; +import com.vaadin.flow.router.*; +import com.vaadin.flow.server.auth.AnonymousAllowed; + +import java.util.List; + +@Route("reset-password") +@PageTitle("PFS Intra") +@AnonymousAllowed +public class ResetPasswordView extends VerticalLayout implements BeforeEnterObserver { + private String username; + private String token; + + public ResetPasswordView(final AccountService accountService) { + setSizeFull(); + setAlignItems(Alignment.CENTER); + setJustifyContentMode(JustifyContentMode.CENTER); + + final VerticalLayout vl = new VerticalLayout(); + vl.setJustifyContentMode(JustifyContentMode.CENTER); + vl.setWidth("400px"); + + final PasswordField password = new PasswordField("Password"); + final PasswordField confirmPassword = new PasswordField("Confirm Password"); + + final FormLayout formLayout = new FormLayout(password, confirmPassword); + formLayout.setColspan(password, 3); + formLayout.setColspan(confirmPassword, 3); + + final Button primaryButton = new Button("Submit"); + primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + primaryButton.addClickListener((ComponentEventListener>) buttonClickEvent -> { + accountService.resetPassword(username, password.getValue(), token); + getUI().ifPresent(ui -> ui.navigate(MainView.class)); + }); + + final Button secondaryButton = new Button("Cancel"); + secondaryButton.addClickListener((ComponentEventListener>) buttonClickEvent -> + getUI().ifPresent(ui -> ui.navigate(MainView.class))); + + HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton); + + vl.add(new H3("PFS - Reset Password")); + vl.add(formLayout); + vl.add(hl); + + add(vl); + } + + @Override + public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) { + final Location location = beforeEnterEvent.getLocation(); + final QueryParameters queryParameters = location.getQueryParameters(); + + this.username = queryParameters.getParameters().getOrDefault("username", List.of()).stream() + .findFirst().orElse(null); + this.token = queryParameters.getParameters().getOrDefault("token", List.of()).stream() + .findFirst().orElse(null); + } +} \ No newline at end of file diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index fd2c3c7..980f089 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,2 +1,3 @@ spring.ldap.url=ldap://localhost:8391 spring.ldap.embedded.port=8391 +application.jwtSecret=test123 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f88aa2f..e6bfb54 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -44,3 +44,5 @@ spring.sql.init.mode=${SQL_INIT:embedded} spring.h2.console.enabled=true spring.h2.console.settings.web-allow-others=true + +application.jwtSecret=${JWT_SECRET:changeme} \ No newline at end of file