Merge pull request 'feat/issue-23/chat-rct' (#24) from feat/issue-23/chat-rct into dev

Reviewed-on: #24
release/1.0.2
Frédérik Benoist 2024-02-20 22:02:58 +01:00
commit 87b36947f2
14 changed files with 1188 additions and 11 deletions

View File

@ -39,6 +39,7 @@
- eslint-plugin-sonarjs : [npm](https://www.npmjs.com/package/eslint-plugin-sonarjs), [GitHub](https://github.com/SonarSource/eslint-plugin-sonarjs) - Plugin ESLint pour les règles SonarJS
- eslint-plugin-unicorn : [npm](https://www.npmjs.com/package/eslint-plugin-unicorn), [GitHub](https://github.com/sindresorhus/eslint-plugin-unicorn) - Plugin ESLint pour des règles diverses et utiles
- eslint-plugin-vue : [npm](https://www.npmjs.com/package/eslint-plugin-vue), [GitHub](https://github.com/vuejs/eslint-plugin-vue) - Plugin ESLint pour les règles Vue.js
- md-editor-v3 : [npm] (https://www.npmjs.com/package/md-editor-v3), [GitHub](https://github.com/imzbf/md-editor-v3) - A pretty markdown viewer
- msw : [npm](https://www.npmjs.com/package/msw), [GitHub](https://github.com/mswjs/msw) - Outil de simulation de requêtes HTTP pour les tests
- postcss-html : [npm](https://www.npmjs.com/package/postcss-html), [GitHub](https://github.com/yisar/postcss-html) - Plugin PostCSS pour traiter les fichiers HTML en CSS
- postcss-scss : [npm](https://www.npmjs.com/package/postcss-scss), [GitHub](https://github.com/postcss/postcss-scss) - Plugin PostCSS pour la syntaxe SCSS

View File

@ -35,6 +35,7 @@
"export-from-json": "^1.7.4",
"jwt-decode": "^3.1.2",
"mapbox-gl": "2.15.0",
"md-editor-v3": "^4.11.2",
"ofetch": "^1.3.3",
"pinia": "^2.1.7",
"prismjs": "^1.29.0",

View File

@ -79,6 +79,9 @@ dependencies:
mapbox-gl:
specifier: 2.15.0
version: 2.15.0
md-editor-v3:
specifier: ^4.11.2
version: 4.11.2(@codemirror/view@6.24.0)(@lezer/common@1.2.1)(vue@3.3.8)
ofetch:
specifier: ^1.3.3
version: 1.3.3
@ -762,6 +765,307 @@ packages:
vue: 3.3.8(typescript@5.2.2)
dev: false
/@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1):
resolution: {integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
dev: false
/@codemirror/commands@6.3.3:
resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==}
dependencies:
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
dev: false
/@codemirror/lang-angular@0.1.3:
resolution: {integrity: sha512-xgeWGJQQl1LyStvndWtruUvb4SnBZDAu/gvFH/ZU+c0W25tQR8e5hq7WTwiIY2dNxnf+49mRiGI/9yxIwB6f5w==}
dependencies:
'@codemirror/lang-html': 6.4.8
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.1
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@codemirror/lang-cpp@6.0.2:
resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==}
dependencies:
'@codemirror/language': 6.10.1
'@lezer/cpp': 1.1.2
dev: false
/@codemirror/lang-css@6.2.1(@codemirror/view@6.24.0):
resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/css': 1.1.7
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-html@6.4.8:
resolution: {integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.24.0)
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
'@lezer/css': 1.1.7
'@lezer/html': 1.3.8
dev: false
/@codemirror/lang-java@6.0.1:
resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==}
dependencies:
'@codemirror/language': 6.10.1
'@lezer/java': 1.1.1
dev: false
/@codemirror/lang-javascript@6.2.1:
resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/lint': 6.5.0
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
'@lezer/javascript': 1.4.13
dev: false
/@codemirror/lang-json@6.0.1:
resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==}
dependencies:
'@codemirror/language': 6.10.1
'@lezer/json': 1.0.2
dev: false
/@codemirror/lang-less@6.0.2(@codemirror/view@6.24.0):
resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.24.0)
'@codemirror/language': 6.10.1
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-liquid@6.2.1:
resolution: {integrity: sha512-J1Mratcm6JLNEiX+U2OlCDTysGuwbHD76XwuL5o5bo9soJtSbz2g6RU3vGHFyS5DC8rgVmFSzi7i6oBftm7tnA==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/lang-html': 6.4.8
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@codemirror/lang-markdown@6.2.4:
resolution: {integrity: sha512-UghkA1vSMs8bT7RSZM6vsIocigyah2bV00eRQuZy76401UmFZdsTsbQNBGdyxRQDOLeEvF5iFwap0BM8LKyd+g==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/lang-html': 6.4.8
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
'@lezer/markdown': 1.2.0
dev: false
/@codemirror/lang-php@6.0.1:
resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==}
dependencies:
'@codemirror/lang-html': 6.4.8
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/php': 1.0.2
dev: false
/@codemirror/lang-python@6.1.4(@codemirror/view@6.24.0):
resolution: {integrity: sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/python': 1.1.11
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-rust@6.0.1:
resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==}
dependencies:
'@codemirror/language': 6.10.1
'@lezer/rust': 1.0.2
dev: false
/@codemirror/lang-sass@6.0.2(@codemirror/view@6.24.0):
resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.24.0)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/sass': 1.0.4
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-sql@6.5.5(@codemirror/view@6.24.0):
resolution: {integrity: sha512-DvOaP2RXLb2xlxJxxydTFfwyYw5YDqEFea6aAfgh9UH0kUD6J1KFZ0xPgPpw1eo/5s2w3L6uh5PVR7GM23GxkQ==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-vue@0.1.3:
resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==}
dependencies:
'@codemirror/lang-html': 6.4.8
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.10.1
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@codemirror/lang-wast@6.0.2:
resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==}
dependencies:
'@codemirror/language': 6.10.1
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@codemirror/lang-xml@6.0.2(@codemirror/view@6.24.0):
resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/xml': 1.0.4
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-yaml@6.0.0(@codemirror/view@6.24.0):
resolution: {integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/language': 6.10.1
'@codemirror/state': 6.4.0
'@lezer/common': 1.2.1
'@lezer/yaml': 1.0.2
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/language-data@6.4.1(@codemirror/view@6.24.0):
resolution: {integrity: sha512-NYhC3NvEMwUxSWS1sB5AePUtr5g2ASSYOZ37YixicDG8PWHslDV9mmXIX0KvmtEm50V8FT4F5i4HAsk/7i78LA==}
dependencies:
'@codemirror/lang-angular': 0.1.3
'@codemirror/lang-cpp': 6.0.2
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.24.0)
'@codemirror/lang-html': 6.4.8
'@codemirror/lang-java': 6.0.1
'@codemirror/lang-javascript': 6.2.1
'@codemirror/lang-json': 6.0.1
'@codemirror/lang-less': 6.0.2(@codemirror/view@6.24.0)
'@codemirror/lang-liquid': 6.2.1
'@codemirror/lang-markdown': 6.2.4
'@codemirror/lang-php': 6.0.1
'@codemirror/lang-python': 6.1.4(@codemirror/view@6.24.0)
'@codemirror/lang-rust': 6.0.1
'@codemirror/lang-sass': 6.0.2(@codemirror/view@6.24.0)
'@codemirror/lang-sql': 6.5.5(@codemirror/view@6.24.0)
'@codemirror/lang-vue': 0.1.3
'@codemirror/lang-wast': 6.0.2
'@codemirror/lang-xml': 6.0.2(@codemirror/view@6.24.0)
'@codemirror/lang-yaml': 6.0.0(@codemirror/view@6.24.0)
'@codemirror/language': 6.10.1
'@codemirror/legacy-modes': 6.3.3
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/language@6.10.1:
resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
style-mod: 4.1.0
dev: false
/@codemirror/legacy-modes@6.3.3:
resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==}
dependencies:
'@codemirror/language': 6.10.1
dev: false
/@codemirror/lint@6.5.0:
resolution: {integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
crelt: 1.0.6
dev: false
/@codemirror/search@6.5.6:
resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==}
dependencies:
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
crelt: 1.0.6
dev: false
/@codemirror/state@6.4.0:
resolution: {integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==}
dev: false
/@codemirror/view@6.24.0:
resolution: {integrity: sha512-zK6m5pNkdhdJl8idPP1gA4N8JKTiSsOz8U/Iw+C1ChMwyLG7+MLiNXnH/wFuAk6KeGEe33/adOiAh5jMqee03w==}
dependencies:
'@codemirror/state': 6.4.0
style-mod: 4.1.0
w3c-keyname: 2.2.8
dev: false
/@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.1):
resolution: {integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==}
engines: {node: ^14 || ^16 || >=18}
@ -1270,6 +1574,125 @@ packages:
resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
dev: false
/@lezer/common@1.2.1:
resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==}
dev: false
/@lezer/cpp@1.1.2:
resolution: {integrity: sha512-macwKtyeUO0EW86r3xWQCzOV9/CF8imJLpJlPv3sDY57cPGeUZ8gXWOWNlJr52TVByMV3PayFQCA5SHEERDmVQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/css@1.1.7:
resolution: {integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/highlight@1.2.0:
resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
dependencies:
'@lezer/common': 1.2.1
dev: false
/@lezer/html@1.3.8:
resolution: {integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/java@1.1.1:
resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/javascript@1.4.13:
resolution: {integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/json@1.0.2:
resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/lr@1.4.0:
resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==}
dependencies:
'@lezer/common': 1.2.1
dev: false
/@lezer/markdown@1.2.0:
resolution: {integrity: sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
dev: false
/@lezer/php@1.0.2:
resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/python@1.1.11:
resolution: {integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/rust@1.0.2:
resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/sass@1.0.4:
resolution: {integrity: sha512-AqW4myvp73sbMk6y0+gJrMjN5xtqFZzqTftzO3YcO8gSL5d3pymIP3deQllAI8+s1ZoSzH6kD4hsoFLpkD9Kfg==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/xml@1.0.4:
resolution: {integrity: sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@lezer/yaml@1.0.2:
resolution: {integrity: sha512-XCkwuxe+eumJ28nA9e1S6XKsXz9W7V/AG+WBiWOtiIuUpKcZ/bHuvN8bLxSDREIcybSRpEd/jvphh4vgm6Ed2g==}
dependencies:
'@lezer/common': 1.2.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.4.0
dev: false
/@mapbox/geojson-rewind@0.5.2:
resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==}
hasBin: true
@ -1817,18 +2240,33 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true
/@types/linkify-it@3.0.5:
resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
dev: false
/@types/mapbox-gl@2.7.17:
resolution: {integrity: sha512-5lDO2W6glPCqiRuqKh0a7MPOwnVt1/KWcYnxsL3z5rmjuOcFdHEa+KzUwCzqsAlbAegIIhgQiREZzJ9o1ze1gQ==}
dependencies:
'@types/geojson': 7946.0.13
dev: true
/@types/markdown-it@12.2.3:
resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
dependencies:
'@types/linkify-it': 3.0.5
'@types/mdurl': 1.0.5
dev: false
/@types/mdast@3.0.14:
resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==}
dependencies:
'@types/unist': 2.0.9
dev: true
/@types/mdurl@1.0.5:
resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
dev: false
/@types/minimist@1.2.5:
resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
dev: true
@ -2116,6 +2554,10 @@ packages:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true
/@vavt/util@1.4.1:
resolution: {integrity: sha512-EhYyvt5w+GE6IO1JzDFZLmJOXQmWHnx3OBvA3YY/ZB1kWqHlhJTpL4x7TuANTzK7q1Y6G/okk4eFpLVWxvEBVA==}
dev: false
/@videojs-player/vue@1.0.0(@types/video.js@7.3.55)(video.js@8.6.1)(vue@3.3.8):
resolution: {integrity: sha512-WonTezRfKu3fYdQLt/ta+nuKH6gMZUv8l40Jke/j4Lae7IqeO/+lLAmBnh3ni88bwR+vkFXIlZ2Ci7VKInIYJg==}
peerDependencies:
@ -2961,6 +3403,20 @@ packages:
engines: {node: '>=0.8'}
dev: true
/codemirror@6.0.1(@lezer/common@1.2.1):
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1)
'@codemirror/commands': 6.3.3
'@codemirror/language': 6.10.1
'@codemirror/lint': 6.5.0
'@codemirror/search': 6.5.6
'@codemirror/state': 6.4.0
'@codemirror/view': 6.24.0
transitivePeerDependencies:
- '@lezer/common'
dev: false
/color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
@ -3029,6 +3485,12 @@ packages:
engines: {node: '>= 0.6'}
dev: true
/copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
dependencies:
toggle-selection: 1.0.6
dev: false
/cosmiconfig@8.3.6(typescript@5.2.2):
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
@ -5157,6 +5619,11 @@ packages:
yallist: 4.0.0
dev: true
/lru-cache@8.0.5:
resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==}
engines: {node: '>=16.14'}
dev: false
/m3u8-parser@6.2.0:
resolution: {integrity: sha512-qlC00JTxYOxawcqg+RB8jbyNwL3foY/nCY61kyWP+RCuJE9APLeqB/nSlTjb4Mg0yRmyERgjswpdQxMvkeoDrg==}
dependencies:
@ -5231,6 +5698,19 @@ packages:
vt-pbf: 3.1.3
dev: false
/markdown-it-image-figures@2.1.1(markdown-it@13.0.2):
resolution: {integrity: sha512-mwXSQ2nPeVUzCMIE3HlLvjRioopiqyJLNph0pyx38yf9mpqFDhNGnMpAXF9/A2Xv0oiF2cVyg9xwfF0HNAz05g==}
engines: {node: '>=12.0.0'}
peerDependencies:
markdown-it: '*'
dependencies:
markdown-it: 13.0.2
dev: false
/markdown-it-task-lists@2.1.1:
resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==}
dev: false
/markdown-it@13.0.2:
resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
hasBin: true
@ -5245,6 +5725,29 @@ packages:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
dev: true
/md-editor-v3@4.11.2(@codemirror/view@6.24.0)(@lezer/common@1.2.1)(vue@3.3.8):
resolution: {integrity: sha512-By9GeY2h5wvxvijXiy5QzqYrPzP7H5+dFvi5Irs/76sLiXt4TP+AE1y5uJ9hEcDTpz1EFbKWAk4ywfJytHrlIw==}
peerDependencies:
vue: ^3.2.47
dependencies:
'@codemirror/lang-markdown': 6.2.4
'@codemirror/language-data': 6.4.1(@codemirror/view@6.24.0)
'@types/markdown-it': 12.2.3
'@vavt/util': 1.4.1
codemirror: 6.0.1(@lezer/common@1.2.1)
copy-to-clipboard: 3.3.3
lru-cache: 8.0.5
markdown-it: 13.0.2
markdown-it-image-figures: 2.1.1(markdown-it@13.0.2)
markdown-it-task-lists: 2.1.1
medium-zoom: 1.1.0
punycode: 2.3.1
vue: 3.3.8(typescript@5.2.2)
transitivePeerDependencies:
- '@codemirror/view'
- '@lezer/common'
dev: false
/mdast-util-from-markdown@0.8.5:
resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==}
dependencies:
@ -5276,6 +5779,10 @@ packages:
/mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
/medium-zoom@1.1.0:
resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==}
dev: false
/meow@10.1.5:
resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -6507,7 +7014,6 @@ packages:
/punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
dev: true
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@ -7003,6 +7509,10 @@ packages:
acorn: 8.11.2
dev: true
/style-mod@4.1.0:
resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==}
dev: false
/style-search@0.1.0:
resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
dev: true
@ -7379,6 +7889,10 @@ packages:
dependencies:
is-number: 7.0.0
/toggle-selection@1.0.6:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
dev: false
/token-stream@1.0.0:
resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
dev: true

View File

@ -34,6 +34,13 @@ export default [
{
title: 'Dotsoft',
icon: { icon: 'tabler-database-star' },
children: [
{
title: 'Chat RCT',
to: { name: 'chat-rct' },
icon: { icon: 'tabler-message-chatbot' },
},
],
},
{
title: 'XADMIN',

View File

@ -34,6 +34,13 @@ export default [
{
title: 'Dotsoft',
icon: { icon: 'tabler-database-star' },
children: [
{
title: 'Chat RCT',
to: { name: 'chat-rct' },
icon: { icon: 'tabler-message-chatbot' },
},
],
},
{
title: 'XADMIN',

View File

@ -0,0 +1,18 @@
<script setup lang="ts">
import ChatRctPrompt from '@/views/pages/chat/rct/view/CharRctPrompt.vue'
import ChatRctWizard from '@/views/pages/chat/rct/view/ChatRctWizard.vue'
</script>
<template>
<VRow>
<!-- 👉 Chat RCT Wizard -->
<VCol cols="12">
<ChatRctWizard />
</VCol>
<!-- 👉 Chat RCT Prompt -->
<VCol cols="12">
<ChatRctPrompt />
</VCol>
</VRow>
</template>

View File

@ -48,8 +48,8 @@ const page = ref(1)
const sortBy = ref('request_id')
const orderBy = ref('desc')
const beginDate = ref<Date | null>(null)
const endDate = ref<Date | null>(null)
const beginDate = ref<string | null>(null)
const endDate = ref<string | null>(null)
const sortByMapping = (sortby: string) => {
const headerMapping: { [key: string]: string } = {
@ -104,8 +104,8 @@ watch(endDate, newEndDate => {
})
const selectLastMonth = () => {
beginDate.value = startOfMonth(subMonths(new Date(), 1))
endDate.value = endOfMonth(subMonths(new Date(), 1))
beginDate.value = format(startOfMonth(subMonths(new Date(), 1)), 'yyyyMMdd')
endDate.value = format(endOfMonth(subMonths(new Date(), 1)), 'yyyyMMdd')
}
const selectThisMonth = () => {
@ -113,18 +113,19 @@ const selectThisMonth = () => {
const firstDayOfMonth = startOfMonth(today)
const lastDayOfMonth = endOfMonth(today)
beginDate.value = firstDayOfMonth
endDate.value = today < lastDayOfMonth ? today : lastDayOfMonth
beginDate.value = format(firstDayOfMonth, 'yyyyMMdd')
endDate.value = format(today < lastDayOfMonth ? today : lastDayOfMonth, 'yyyyMMdd')
}
const selectLast7Days = () => {
beginDate.value = startOfDay(subDays(new Date(), 6))
endDate.value = startOfDay(new Date())
beginDate.value = format(startOfDay(subDays(new Date(), 6)), 'yyyyMMdd')
endDate.value = format(startOfDay(new Date()), 'yyyyMMdd')
}
const selectToday = () => {
beginDate.value = startOfDay(new Date())
endDate.value = startOfDay(new Date())
const today = new Date()
beginDate.value = endDate.value = format(today, 'yyyyMMdd')
}
const clearDates = () => {

View File

@ -126,6 +126,21 @@
"Note: Click on the button below to access DOTSOFT Back-office": "Note: Click on the button below to access DOTSOFT Back-office",
"Open Back-office": "Open Back-office",
"Mount drive": "Mount drive",
"Chat RCT": "Chat RCT",
"Your RCT Item": "Your RCT Item",
"Store Distributor": "Store Distributor",
"Possible actions to realize": "Possible actions to realize",
"Store where item is required": "Store where item is required",
"Specify an RCT": "Specify an RCT",
"Previous": "Previous",
"Next": "Next",
"Select distributor": "Select distributor",
"Select store": "Select store",
"Yes": "Yes",
"No": "No",
"Resend RCT": "Resend RCT ?",
"Summary": "Summary",
"The request has been processed successfully": "The request has been processed successfully",
"---------------------------": "---------------------------",
"UI Elements": "عناصر واجهة المستخدم",
"Forms & Tables": "النماذج والجداول",

View File

@ -126,6 +126,21 @@
"Note: Click on the button below to access DOTSOFT Back-office": "Note: Click on the button below to access DOTSOFT Back-office",
"Open Back-office": "Open Back-office",
"Mount drive": "Mount drive",
"Chat RCT": "Chat RCT",
"Your RCT Item": "Your RCT Item",
"Store Distributor": "Store Distributor",
"Store where item is required": "Store where item is required",
"Possible actions to realize": "Possible actions to realize",
"Specify an RCT": "Specify an RCT",
"Previous": "Previous",
"Next": "Next",
"Select distributor": "Select distributor",
"Select store": "Select store",
"Yes": "Yes",
"No": "No",
"Resend RCT": "Resend RCT ?",
"Summary": "Summary",
"The request has been processed successfully": "The request has been processed successfully",
"---------------------------": "---------------------------",
"UI Elements": "UI Elements",
"Forms & Tables": "Forms & Tables",

View File

@ -127,6 +127,21 @@
"Note: Click on the button below to access DOTSOFT Back-office": "Note: Cliquez sur le bouton ci-dessous pour accéder au Back-office DOTSOFT",
"Open Back-office": "Ouvrir DOTSOFT",
"Mount drive": "Monter lecteur",
"Chat RCT": "Chat RCT",
"Your RCT Item": "RCT recherchée",
"Store Distributor": "Sélection distributeur",
"Store where item is required": "Sélection Boutique",
"Possible actions to realize": "Actions possibles à effectuer",
"Specify an RCT": "Saisissez la RCT",
"Previous": "Précédent",
"Next": "Suivant",
"Select distributor": "Selectionner un distributeur",
"Select store": "Selectionner une boutique",
"Yes": "Oui",
"No": "Non",
"Resend RCT": "Renvoyer RCT ?",
"Summary": "Résumé",
"The request has been processed successfully": "La demande a été traitée avec succès",
"---------------------------": "---------------------------",
"UI Elements": "ÉLÉMENTS DE L'UI",
"Forms & Tables": "Formulaires et tableaux",

144
src/stores/chatrct.store.ts Normal file
View File

@ -0,0 +1,144 @@
export const useChatRctStore = defineStore('chatrct', {
state: () => ({
ref_rct: null,
ref_r: null,
id_produit: 0,
distributor: null,
distributor_list: [],
store: null,
store_list: [],
prompt_rct: '### Bonjour,\n Indiquez-moi la RCT sur laquelle vous souhaitez faire des recherches ...',
prompt_distributor: '',
prompt_store: '',
output_actions: '',
loading: false,
actions_lib: [],
actions_flag: false,
actions_proc: 'cache',
resend_data: 'No',
prompt_gen() {
return `${this.prompt_rct}\n${this.prompt_distributor}\n${this.prompt_store}`
},
}),
actions: {
async validateRct() {
this.loading = true
const { data } = await useApi<any>(`/chatrct/rct?itemId=${this.ref_rct}`)
if (data.value) {
const jsonData = JSON.parse(data.value)
if (jsonData.response.id_produit) {
this.id_produit = jsonData.response.id_produit
this.ref_r = jsonData.response.ref_r
this.distributor_list = jsonData.response.distributor_list
}
else { this.id_produit = 0 }
this.prompt_store = ''
this.prompt_distributor = ''
this.prompt_rct = jsonData.response.lines.join('\n')
}
this.loading = false
return (this.id_produit > 0)
},
async validateDistributor() {
this.loading = true
const { data } = await useApi<any>(`/chatrct/distributor/${this.distributor}?itemId=${this.ref_rct}&produitId=${this.id_produit}`)
if (data.value) {
const jsonData = JSON.parse(data.value)
this.prompt_distributor = jsonData.response.lines.join('\n')
this.store = null
this.store_list = jsonData.response.store_list
}
this.loading = false
return true
},
async validateStore() {
this.loading = true
const { data } = await useApi<any>(`/chatrct/store/${this.store}?distributorId=${this.distributor}&itemId=${this.ref_rct}&produitId=${this.id_produit}`)
if (data.value) {
const jsonData = JSON.parse(data.value)
this.prompt_store = jsonData.response.lines.join('\n')
this.actions_lib = jsonData.response.actions
this.actions_flag = jsonData.response.actions_flag
this.actions_proc = jsonData.response.actions_proc
}
this.loading = false
return true
},
async validateActions() {
this.loading = true
if (this.actions_proc === 'cache') {
const currentDate = new Date().toISOString().slice(0, 10).replace(/-/g, '')
const requestBodyCache = {
itemId: this.ref_r,
comment: `HDPOS Force Cache ${currentDate}`,
proc: this.actions_proc,
}
const { data } = await useApi<any>('/chatrct/rct/forceCache', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestBodyCache),
})
if (data.value)
this.output_actions = data.value.output
}
else if (this.actions_proc === 'exception') {
const tomorrowDate = new Date(Date.now() + 86400000).toISOString().slice(0, 10).replace(/-/g, '')
const requestBodyException = {
id_produit: this.id_produit,
id_distrib: this.distributor,
fdate: tomorrowDate,
forcer_cache: 1,
modul_trait: 'HDPOS',
}
const { data } = await useApi<any>('/chatrct/rct/forceException', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestBodyException),
})
if (data.value)
this.output_actions = data.value.output
}
this.loading = false
// Check for "ERREUR" at the beginning of the string
return !this.output_actions.startsWith('ERREUR')
},
clearState() {
this.ref_rct = null
this.distributor = null
this.store = null
this.resend_data = 'No'
},
clearPrompts() {
this.prompt_rct = '### Bonjour,\n Indiquez-moi la RCT sur laquelle vous souhaitez faire des recherches ...'
this.prompt_distributor = ''
this.prompt_store = ''
this.output_actions = ''
},
},
})

View File

@ -0,0 +1,33 @@
<script setup lang="ts">
import { MdPreview } from 'md-editor-v3'
import { useChatRctStore } from '@stores/chatrct.store'
import 'md-editor-v3/lib/preview.css'
import 'md-editor-v3/lib/style.css'
const id = 'chatrct-prompt'
const store = useChatRctStore()
const chatText = computed(() => store.prompt_gen())
</script>
<template>
<VCard>
<div
v-if="store.loading"
class="loading-container"
>
<VProgressCircular
:size="60"
color="primary"
indeterminate
/>
<span> Je recherche vos données. Veuillez patienter ...</span>
</div>
<MdPreview
v-else
:editor-id="id"
:model-value="chatText"
/>
</VCard>
</template>

View File

@ -0,0 +1,405 @@
<script setup lang="ts">
import { VForm } from 'vuetify/components/VForm'
import { useChatRctStore } from '@stores/chatrct.store'
const { t } = useI18n()
const numberedSteps = [
{
title: t('Item'),
subtitle: t('Your RCT Item'),
},
{
title: t('Distributor'),
subtitle: t('Store Distributor'),
},
{
title: t('Store'),
subtitle: t('Store where item is required'),
},
{
title: t('Actions'),
subtitle: t('Possible actions to realize'),
},
]
const currentStep = ref(0)
const isCurrentStepValid = ref(true)
const refRctForm = ref<VForm>()
const refDistributorForm = ref<VForm>()
const refStoreForm = ref<VForm>()
const refActionsForm = ref<VForm>()
const isSnackbarActions = ref(false)
const store = useChatRctStore()
store.clearState()
store.clearPrompts()
const validateRctForm = async () => {
const validRctForm = await refRctForm.value?.validate()
if (validRctForm && validRctForm.valid) {
const valid = await store.validateRct()
if (valid) {
currentStep.value++
isCurrentStepValid.value = true
}
else { isCurrentStepValid.value = false }
}
}
const validateDistributorForm = async () => {
const validDistributorForm = await refDistributorForm.value?.validate()
if (validDistributorForm && validDistributorForm.valid) {
const valid = await store.validateDistributor()
if (valid) {
currentStep.value++
isCurrentStepValid.value = true
}
else { isCurrentStepValid.value = false }
}
}
const validateStoreForm = async () => {
const validStoreForm = await refStoreForm.value?.validate()
if (validStoreForm && validStoreForm.valid) {
if (store.store_list && Array.isArray(store.store_list) && store.store_list.length > 0) {
const valid = store.store_list.some((s: { id: any }) => s.id === store.store)
const validStore = await store.validateStore()
if (valid && validStore) {
currentStep.value++
isCurrentStepValid.value = true
}
else { isCurrentStepValid.value = false }
}
else { isCurrentStepValid.value = false }
}
}
const validateActionsForm = async () => {
const validActionsForm = await refActionsForm.value?.validate()
if (validActionsForm && validActionsForm.valid) {
if (store.resend_data === 'Yes') {
const valid = await store.validateActions()
if (valid) {
currentStep.value++
isCurrentStepValid.value = true
isSnackbarActions.value = true
}
else { isCurrentStepValid.value = false }
}
else { isCurrentStepValid.value = false }
}
}
const decrementStep = () => {
currentStep.value--
if (currentStep.value === 0) {
store.clearPrompts()
}
else if (currentStep.value === 1) {
store.prompt_distributor = ''
}
else if (currentStep.value === 2) {
store.prompt_store = ''
store.output_actions = ''
}
}
</script>
<template>
<VCard>
<VCardText>
<!-- 👉 Stepper -->
<AppStepper
v-model:current-step="currentStep"
:items="numberedSteps"
align="start"
:is-active-step-valid="isCurrentStepValid"
/>
</VCardText>
<VDivider />
<VCardText>
<VWindow
v-model="currentStep"
class="disable-tab-transition"
>
<!-- 👉 Item Step -->
<VWindowItem>
<VForm
ref="refRctForm"
@submit.prevent="validateRctForm"
>
<VRow>
<VCol cols="12">
<h6 class="text-h6 font-weight-medium">
{{ $t('Item') }}
</h6>
<p class="mb-0">
{{ $t('Your RCT Item') }}
</p>
</VCol>
<VCol
cols="12"
md="6"
>
<AppTextField
v-model="store.ref_rct"
:placeholder="$t('Specify an RCT')"
:rules="[requiredValidator]"
label="RCT"
/>
</VCol>
<VCol cols="12">
<div class="d-flex flex-wrap gap-4 justify-sm-space-between justify-center mt-8">
<VBtn
color="secondary"
variant="tonal"
disabled
>
<VIcon
icon="tabler-arrow-left"
start
class="flip-in-rtl"
/>
{{ $t('Previous') }}
</VBtn>
<VBtn type="submit">
{{ $t('Next') }}
<VIcon
icon="tabler-arrow-right"
end
class="flip-in-rtl"
/>
</VBtn>
</div>
</VCol>
</VRow>
</VForm>
</VWindowItem>
<!-- 👉 Distributor Step -->
<VWindowItem>
<VForm
ref="refDistributorForm"
@submit.prevent="validateDistributorForm"
>
<VRow>
<VCol cols="12">
<h6 class="text-h6 font-weight-medium">
{{ $t('Distributor') }}
</h6>
<p class="mb-0">
{{ $t('Store Distributor') }}
</p>
</VCol>
<VCol
cols="12"
md="6"
>
<AppSelect
v-model="store.distributor"
:items="store.distributor_list"
:placeholder="$t('Select distributor')"
:rules="[requiredValidator]"
item-title="name"
item-value="id"
:label="$t('Distributor')"
:return-object="false"
/>
</VCol>
<VCol cols="12">
<div class="d-flex flex-wrap gap-4 justify-sm-space-between justify-center mt-8">
<VBtn
color="secondary"
variant="tonal"
@click="decrementStep"
>
<VIcon
icon="tabler-arrow-left"
start
class="flip-in-rtl"
/>
{{ $t('Previous') }}
</VBtn>
<VBtn type="submit">
{{ $t('Next') }}
<VIcon
icon="tabler-arrow-right"
end
class="flip-in-rtl"
/>
</VBtn>
</div>
</VCol>
</VRow>
</VForm>
</VWindowItem>
<!-- 👉 Store Step -->
<VWindowItem>
<VForm
ref="refStoreForm"
@submit.prevent="validateStoreForm"
>
<VRow>
<VCol cols="12">
<h6 class="text-h6 font-weight-medium">
{{ $t('Store') }}
</h6>
<p class="mb-0">
{{ $t('Store where item is required') }}
</p>
</VCol>
<VCol
cols="12"
md="6"
>
<AppCombobox
v-model="store.store"
:items="store.store_list"
:placeholder="$t('Select store')"
:rules="[requiredValidator]"
item-title="name"
item-value="id"
:label="$t('Store')"
:return-object="false"
/>
</VCol>
<VCol cols="12">
<div class="d-flex flex-wrap gap-4 justify-sm-space-between justify-center mt-8">
<VBtn
color="secondary"
variant="tonal"
@click="decrementStep"
>
<VIcon
icon="tabler-arrow-left"
start
class="flip-in-rtl"
/>
{{ $t('Previous') }}
</VBtn>
<VBtn type="submit">
{{ $t('Next') }}
<VIcon
icon="tabler-arrow-right"
end
class="flip-in-rtl"
/>
</VBtn>
</div>
</VCol>
</VRow>
</VForm>
</VWindowItem>
<!-- 👉 Actions Step -->
<VWindowItem>
<VForm
ref="refActionsForm"
@submit.prevent="validateActionsForm"
>
<VRow>
<VCol cols="12">
<p
v-for="(action, index) in store.actions_lib"
:key="index"
class="mb-0"
>
{{ action }}
</p>
</VCol>
<VCol
v-if="store.actions_flag"
cols="12"
sm="8"
>
<VRadioGroup
v-model="store.resend_data"
class="mb-3"
>
<template #label>
<div class="text-high-emphasis">
{{ $t('Resend RCT') }}
</div>
</template>
<VRadio
value="Yes"
:label="$t('Yes')"
class="ms-2"
/>
<VRadio
value="No"
:label="$t('No')"
class="ms-2"
/>
</VRadioGroup>
{{ store.output_actions }}
</VCol>
<VCol cols="12">
<div class="d-flex flex-wrap gap-4 justify-sm-space-between justify-center mt-8">
<VBtn
color="secondary"
variant="tonal"
@click="decrementStep"
>
<VIcon
icon="tabler-arrow-left"
start
class="flip-in-rtl"
/>
{{ $t('Previous') }}
</VBtn>
<VBtn
v-if="store.actions_flag"
color="success"
type="submit"
>
{{ $t('Submit') }}
</VBtn>
</div>
</VCol>
</VRow>
</VForm>
<!-- Snackbar Export -->
<VSnackbar
v-model="isSnackbarActions"
location="center"
>
{{ $t('The request has been processed successfully') }}
<template #actions>
<VBtn
color="error"
@click="isSnackbarActions = false"
>
{{ $t("Close") }}
</VBtn>
</template>
</VSnackbar>
</VWindowItem>
</VWindow>
</VCardText>
</VCard>
</template>

1
typed-router.d.ts vendored
View File

@ -41,6 +41,7 @@ declare module 'vue-router/auto/routes' {
export interface RouteNamedMap {
'root': RouteRecordInfo<'root', '/', Record<never, never>, Record<never, never>>,
'$error': RouteRecordInfo<'$error', '/:error(.*)', { error: ParamValue<true> }, { error: ParamValue<false> }>,
'chat-rct': RouteRecordInfo<'chat-rct', '/chat/rct', Record<never, never>, Record<never, never>>,
'flux-bl-not-sent': RouteRecordInfo<'flux-bl-not-sent', '/flux/bl/not_sent', Record<never, never>, Record<never, never>>,
'login': RouteRecordInfo<'login', '/login', Record<never, never>, Record<never, never>>,
'obi-order-details-id': RouteRecordInfo<'obi-order-details-id', '/obi/order/details/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,