Compare commits
17 Commits
feat/issue
...
main
| Author | SHA1 | Date |
|---|---|---|
|
|
4ddba10fa3 | |
|
|
87b36947f2 | |
|
|
fe0d48703b | |
|
|
c4f87d7b14 | |
|
|
60c5d0ee7f | |
|
|
5f95cc87cf | |
|
|
124dfee0b3 | |
|
|
ab1148912b | |
|
|
4e8fafb2ad | |
|
|
d0841d9e6a | |
|
|
4ba95b3e88 | |
|
|
6d9ccbc57a | |
|
|
8a9fe74487 | |
|
|
f3a986258b | |
|
|
7353016937 | |
|
|
5419bb538e | |
|
|
088fb74dd1 |
|
|
@ -125,7 +125,9 @@ declare global {
|
|||
const registerPlugins_: typeof import('./src/@core/utils/plugins')['registerPlugins_']
|
||||
const requiredValidator: typeof import('./src/@core/utils/validators')['requiredValidator']
|
||||
const resolveComponent: typeof import('vue')['resolveComponent']
|
||||
const resolveOrderStatus: typeof import('./src/utils/order')['resolveOrderStatus']
|
||||
const resolveRef: typeof import('@vueuse/core')['resolveRef']
|
||||
const resolveStatus: typeof import('./src/utils/order')['resolveStatus']
|
||||
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
|
||||
const resolveVuetifyTheme: typeof import('./src/@core/utils/vuetify')['resolveVuetifyTheme']
|
||||
const setActivePinia: typeof import('pinia')['setActivePinia']
|
||||
|
|
@ -480,6 +482,7 @@ declare module 'vue' {
|
|||
readonly registerPlugins: UnwrapRef<typeof import('./src/@core/utils/plugins')['registerPlugins']>
|
||||
readonly requiredValidator: UnwrapRef<typeof import('./src/@core/utils/validators')['requiredValidator']>
|
||||
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
|
||||
readonly resolveOrderStatus: UnwrapRef<typeof import('./src/utils/order')['resolveOrderStatus']>
|
||||
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
|
||||
readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
|
||||
readonly resolveVuetifyTheme: UnwrapRef<typeof import('./src/@core/utils/vuetify')['resolveVuetifyTheme']>
|
||||
|
|
@ -824,6 +827,7 @@ declare module '@vue/runtime-core' {
|
|||
readonly registerPlugins: UnwrapRef<typeof import('./src/@core/utils/plugins')['registerPlugins']>
|
||||
readonly requiredValidator: UnwrapRef<typeof import('./src/@core/utils/validators')['requiredValidator']>
|
||||
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
|
||||
readonly resolveOrderStatus: UnwrapRef<typeof import('./src/utils/order')['resolveOrderStatus']>
|
||||
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
|
||||
readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
|
||||
readonly resolveVuetifyTheme: UnwrapRef<typeof import('./src/@core/utils/vuetify')['resolveVuetifyTheme']>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
# Dépendances avec les liens npm et GitHub
|
||||
|
||||
## Dépendances de développement
|
||||
- @antfu/eslint-config-vue : [npm](https://www.npmjs.com/package/@antfu/eslint-config-vue), [GitHub](https://github.com/antfu/eslint-config) - Configuration ESLint pour les projets Vue.js
|
||||
- @antfu/utils : [npm](https://www.npmjs.com/package/@antfu/utils), [GitHub](https://github.com/antfu/utils) - Utilitaires utiles pour le développement avec Vite
|
||||
- @fullcalendar/core : [npm](https://www.npmjs.com/package/@fullcalendar/core), [GitHub](https://github.com/fullcalendar/fullcalendar) - Bibliothèque de calendrier complète pour les applications web
|
||||
- @fullcalendar/daygrid : [npm](https://www.npmjs.com/package/@fullcalendar/daygrid), [GitHub](https://github.com/fullcalendar/daygrid) - Extension de grille de jours pour FullCalendar
|
||||
- @fullcalendar/interaction : [npm](https://www.npmjs.com/package/@fullcalendar/interaction), [GitHub](https://github.com/fullcalendar/interaction) - Prise en charge de l'interaction utilisateur pour FullCalendar
|
||||
- @fullcalendar/list : [npm](https://www.npmjs.com/package/@fullcalendar/list), [GitHub](https://github.com/fullcalendar/list) - Extension de liste pour FullCalendar
|
||||
- @fullcalendar/timegrid : [npm](https://www.npmjs.com/package/@fullcalendar/timegrid), [GitHub](https://github.com/fullcalendar/timegrid) - Extension de grille temporelle pour FullCalendar
|
||||
- @fullcalendar/vue3 : [npm](https://www.npmjs.com/package/@fullcalendar/vue3), [GitHub](https://github.com/fullcalendar/vue) - Intégration Vue 3 pour FullCalendar
|
||||
- @iconify-json/mdi : [npm](https://www.npmjs.com/package/@iconify-json/mdi), [GitHub](https://github.com/iconify/iconify-json) - Bibliothèque d'icônes Material Design pour Iconify
|
||||
- @iconify/tools : [npm](https://www.npmjs.com/package/@iconify/tools), [GitHub](https://github.com/iconify/iconify-tools) - Outils pour travailler avec Iconify
|
||||
- @iconify/utils : [npm](https://www.npmjs.com/package/@iconify/utils), [GitHub](https://github.com/iconify/iconify-utils) - Utilitaires pour Iconify
|
||||
- @iconify/vue : [npm](https://www.npmjs.com/package/@iconify/vue), [GitHub](https://github.com/iconify/iconify-vue) - Composant Vue pour Iconify
|
||||
- @intlify/unplugin-vue-i18n : [npm](https://www.npmjs.com/package/@intlify/unplugin-vue-i18n), [GitHub](https://github.com/intlify/unplugin) - Plugin Vue I18n pour Vite
|
||||
- @tabler/icons : [npm](https://www.npmjs.com/package/@tabler/icons), [GitHub](https://github.com/tabler/tabler-icons) - Bibliothèque d'icônes Tabler
|
||||
- @tiptap/extension-character-count : [npm](https://www.npmjs.com/package/@tiptap/extension-character-count), [GitHub](https://github.com/ueberdosis/tiptap) - Extension pour compter le nombre de caractères dans Tiptap
|
||||
- @tiptap/extension-placeholder : [npm](https://www.npmjs.com/package/@tiptap/extension-placeholder), [GitHub](https://github.com/ueberdosis/tiptap) - Extension de l'indicateur de position dans Tiptap
|
||||
- @tiptap/extension-subscript : [npm](https://www.npmjs.com/package/@tiptap/extension-subscript), [GitHub](https://github.com/ueberdosis/tiptap) - Extension pour le texte en indice dans Tiptap
|
||||
- @tiptap/extension-superscript : [npm](https://www.npmjs.com/package/@tiptap/extension-superscript), [GitHub](https://github.com/ueberdosis/tiptap) - Extension pour le texte en exposant dans Tiptap
|
||||
- @tiptap/extension-underline : [npm](https://www.npmjs.com/package/@tiptap/extension-underline), [GitHub](https://github.com/ueberdosis/tiptap) - Extension pour souligner le texte dans Tiptap
|
||||
- @types/mapbox-gl : [npm](https://www.npmjs.com/package/@types/mapbox-gl), [GitHub](https://github.com/DefinitelyTyped/DefinitelyTyped) - Types TypeScript pour Mapbox GL
|
||||
- @types/node : [npm](https://www.npmjs.com/package/@types/node), [GitHub](https://github.com/DefinitelyTyped/DefinitelyTyped) - Types TypeScript pour Node.js
|
||||
- @types/webfontloader : [npm](https://www.npmjs.com/package/@types/webfontloader), [GitHub](https://github.com/DefinitelyTyped/DefinitelyTyped) - Types TypeScript pour WebFontLoader
|
||||
- @typescript-eslint/eslint-plugin : [npm](https://www.npmjs.com/package/@typescript-eslint/eslint-plugin), [GitHub](https://github.com/typescript-eslint/typescript-eslint) - Plugin ESLint pour TypeScript
|
||||
- @typescript-eslint/parser : [npm](https://www.npmjs.com/package/@typescript-eslint/parser), [GitHub](https://github.com/typescript-eslint/typescript-eslint) - Analyseur ESLint pour TypeScript
|
||||
- @videojs-player/vue : [npm](https://www.npmjs.com/package/@videojs-player/vue), [GitHub](https://github.com/videojs/theater) - Composant Vue pour Video.js
|
||||
- @vitejs/plugin-vue : [npm](https://www.npmjs.com/package/@vitejs/plugin-vue), [GitHub](https://github.com/vitejs/vite)
|
||||
- @vitejs/plugin-vue-jsx : [npm](https://www.npmjs.com/package/@vitejs/plugin-vue-jsx), [GitHub](https://github.com/vitejs/vite)
|
||||
- date-fns : [npm](https://www.npmjs.com/package/date-fns), [GitHub](https://github.com/date-fns/date-fns) - Bibliothèque JavaScript moderne de manipulation de dates
|
||||
- eslint : [npm](https://www.npmjs.com/package/eslint), [GitHub](https://github.com/eslint/eslint) - Linter JavaScript/TypeScript
|
||||
- eslint-config-airbnb-base : [npm](https://www.npmjs.com/package/eslint-config-airbnb-base), [GitHub](https://github.com/airbnb/javascript) - Configuration ESLint pour les règles Airbnb (base)
|
||||
- eslint-import-resolver-typescript : [npm](https://www.npmjs.com/package/eslint-import-resolver-typescript), [GitHub](https://github.com/alexgorbatchev/eslint-import-resolver-typescript) - Résolveur d'importation ESLint pour TypeScript
|
||||
- eslint-plugin-case-police : [npm](https://www.npmjs.com/package/eslint-plugin-case-police), [GitHub](https://github.com/antfu/eslint-plugin-case-police) - Plugin ESLint pour l'ajustement de casse dans le code
|
||||
- eslint-plugin-import : [npm](https://www.npmjs.com/package/eslint-plugin-import), [GitHub](https://github.com/benmosher/eslint-plugin-import) - Plugin ESLint pour les règles d'importation
|
||||
- eslint-plugin-promise : [npm](https://www.npmjs.com/package/eslint-plugin-promise), [GitHub](https://github.com/xjamundx/eslint-plugin-promise) - Plugin ESLint pour les règles liées aux promesses
|
||||
- eslint-plugin-regex : [npm](https://www.npmjs.com/package/eslint-plugin-regex), [GitHub](https://github.com/ota-meshi/eslint-plugin-regex) - Plugin ESLint pour les règles de regex
|
||||
- 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
|
||||
- sass : [npm](https://www.npmjs.com/package/sass), [GitHub](https://github.com/sass/sass) - Préprocesseur CSS Sass
|
||||
- stylelint : [npm](https://www.npmjs.com/package/stylelint), [GitHub](https://github.com/stylelint/stylelint) - Linter pour les feuilles de style CSS/SCSS
|
||||
- stylelint-codeguide : [npm](https://www.npmjs.com/package/stylelint-codeguide), [GitHub](https://github.com/kristerkari/stylelint-codeguide) - Guide de style et configuration Stylelint
|
||||
- stylelint-config-idiomatic-order : [npm](https://www.npmjs.com/package/stylelint-config-idiomatic-order), [GitHub](https://github.com/ream88/stylelint-config-idiomatic-order) - Configuration Stylelint avec un ordre idiomatique
|
||||
- stylelint-config-standard-scss : [npm](https://www.npmjs.com/package/stylelint-config-standard-scss), [GitHub](https://github.com/kristerkari/stylelint-config-standard-scss) - Configuration Stylelint pour SCSS basée sur les règles standard
|
||||
- stylelint-use-logical-spec : [npm](https://www.npmjs.com/package/stylelint-use-logical-spec), [GitHub](https://github.com/iKettles/stylelint-use-logical-spec) - Plugin Stylelint pour promouvoir l'utilisation de spécifications logiques
|
||||
- tsx : [npm](https://www.npmjs.com/package/tsx), [GitHub](https://github.com/windicss/tsx) - Plugin WindiCSS pour la prise en charge de JSX/TSX
|
||||
- type-fest : [npm](https://www.npmjs.com/package/type-fest), [GitHub](https://github.com/sindresorhus/type-fest) - Collection de types TypeScript utiles
|
||||
- typescript : [npm](https://www.npmjs.com/package/typescript), [GitHub](https://github.com/microsoft/TypeScript) - Langage de programmation TypeScript
|
||||
- unplugin-auto-import : [npm](https://www.npmjs.com/package/unplugin-auto-import), [GitHub](https://github.com/antfu/unplugin-auto-import) - Plugin Vite pour l'importation automatique
|
||||
- unplugin-vue-components : [npm](https://www.npmjs.com/package/unplugin-vue-components), [GitHub](https://github.com/antfu/unplugin) - Plugin Vite pour la gestion des composants Vue
|
||||
- unplugin-vue-router : [npm](https://www.npmjs.com/package/unplugin-vue-router), [GitHub](https://github.com/antfu/unplugin-vue-router) - Plugin Vite pour Vue Router
|
||||
- video.js : [npm](https://www.npmjs.com/package/video.js), [GitHub](https://github.com/videojs/video.js) - Bibliothèque de lecteur vidéo JavaScript
|
||||
- vite : [npm](https://www.npmjs.com/package/vite), [GitHub](https://github.com/vitejs/vite) - Constructeur d'outils rapide pour le développement web moderne
|
||||
- vite-plugin-vue-devtools : [npm](https://www.npmjs.com/package/vite-plugin-vue-devtools), [GitHub](https://github.com/antfu/vite-plugin-vue-devtools) - Plugin Vite pour intégrer les outils de développement Vue.js
|
||||
- vite-plugin-vue-layouts : [npm](https://www.npmjs.com/package/vite-plugin-vue-layouts), [GitHub](https://github.com/JohnCampionJr/vite-plugin-vue-layouts) - Plugin Vite pour la gestion des mises en page Vue.js
|
||||
- vite-plugin-vuetify : [npm](https://www.npmjs.com/package/vite-plugin-vuetify), [GitHub](https://github.com/antfu/vite-plugin-vuetify) - Plugin Vite pour l'intégration de Vuetify
|
||||
- vue-json-pretty : [npm](https://www.npmjs.com/package/vue-json-pretty), [GitHub](https://github.com/leezng/vue-json-pretty) - A pretty-print JSON Vue-component
|
||||
- vue-shepherd : [npm](https://www.npmjs.com/package/vue-shepherd), [GitHub](https://github.com/hipstersmoothie/vue-shepherd) - Tour de guide pour les applications Vue.js
|
||||
- vue-tsc : [npm](https://www.npmjs.com/package/vue-tsc), [GitHub](https://github.com/johnsoncodehk/vue-tsc) - Plugin TypeScript pour la compilation de fichiers `.vue`
|
||||
|
|
@ -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",
|
||||
|
|
@ -47,6 +48,7 @@
|
|||
"vue-chartjs": "^5.2.0",
|
||||
"vue-flatpickr-component": "11.0.3",
|
||||
"vue-i18n": "^9.5.0",
|
||||
"vue-json-pretty": "^2.3.0",
|
||||
"vue-prism-component": "^2.0.0",
|
||||
"vue-router": "^4.2.5",
|
||||
"vue3-apexcharts": "^1.4.4",
|
||||
|
|
|
|||
528
pnpm-lock.yaml
528
pnpm-lock.yaml
|
|
@ -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
|
||||
|
|
@ -115,6 +118,9 @@ dependencies:
|
|||
vue-i18n:
|
||||
specifier: ^9.5.0
|
||||
version: 9.6.5(vue@3.3.8)
|
||||
vue-json-pretty:
|
||||
specifier: ^2.3.0
|
||||
version: 2.3.0(vue@3.3.8)
|
||||
vue-prism-component:
|
||||
specifier: ^2.0.0
|
||||
version: 2.0.0
|
||||
|
|
@ -759,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}
|
||||
|
|
@ -1267,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
|
||||
|
|
@ -1814,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
|
||||
|
|
@ -2113,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:
|
||||
|
|
@ -2958,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:
|
||||
|
|
@ -3026,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'}
|
||||
|
|
@ -5154,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:
|
||||
|
|
@ -5228,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
|
||||
|
|
@ -5242,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:
|
||||
|
|
@ -5273,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}
|
||||
|
|
@ -6504,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==}
|
||||
|
|
@ -7000,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
|
||||
|
|
@ -7376,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
|
||||
|
|
@ -7978,6 +8495,15 @@ packages:
|
|||
'@vue/devtools-api': 6.5.1
|
||||
vue: 3.3.8(typescript@5.2.2)
|
||||
|
||||
/vue-json-pretty@2.3.0(vue@3.3.8):
|
||||
resolution: {integrity: sha512-iBul6Xg7vZfMV2MQC/gGtzbyg8FLk6cJ8KG91f37UEkQyXqHg91VQJ24bDBXNVuOSP04BUKxWagD3V2N/WEy0g==}
|
||||
engines: {node: '>= 10.0.0', npm: '>= 5.0.0'}
|
||||
peerDependencies:
|
||||
vue: '>=3.0.0'
|
||||
dependencies:
|
||||
vue: 3.3.8(typescript@5.2.2)
|
||||
dev: false
|
||||
|
||||
/vue-prism-component@2.0.0:
|
||||
resolution: {integrity: sha512-1ofrL+GCZOv4HqtX5W3EgkhSAgadSeuD8FDTXbwhLy8kS+28RCR8t2S5VTeM9U/peAaXLBpSgRt3J25ao8KTeg==}
|
||||
dev: false
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ const { copy, copied } = useClipboard({ source: computed(() => props.code[prefer
|
|||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
/* stylelint-disable-next-line scss/load-no-partial-leading-underscore */
|
||||
@use "@styles/variables/_vuetify.scss";
|
||||
|
||||
:not(pre) > code[class*="language-"],
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
import { useStorage } from '@vueuse/core'
|
||||
import { setDefaultOptions } from 'date-fns'
|
||||
import { enUS, fr } from 'date-fns/locale'
|
||||
import flatpickr from 'flatpickr'
|
||||
import { French } from 'flatpickr/dist/l10n/fr'
|
||||
import { useTheme } from 'vuetify'
|
||||
|
|
@ -19,10 +21,14 @@ const _syncAppRtl = () => {
|
|||
if (locale.value === 'fr') {
|
||||
if (flatpickr.l10ns.fr)
|
||||
flatpickr.localize(French)
|
||||
|
||||
setDefaultOptions({ locale: fr })
|
||||
}
|
||||
else {
|
||||
if (flatpickr.l10ns.en)
|
||||
flatpickr.localize(flatpickr.l10ns.en)
|
||||
|
||||
setDefaultOptions({ locale: enUS })
|
||||
}
|
||||
|
||||
// watch and change lang attribute of html on language change
|
||||
|
|
@ -39,10 +45,14 @@ const _syncAppRtl = () => {
|
|||
if (storedLang.value === 'fr') {
|
||||
if (flatpickr.l10ns.fr)
|
||||
flatpickr.localize(flatpickr.l10ns.fr)
|
||||
|
||||
setDefaultOptions({ locale: fr })
|
||||
}
|
||||
else {
|
||||
if (flatpickr.l10ns.en)
|
||||
flatpickr.localize(flatpickr.l10ns.en)
|
||||
|
||||
setDefaultOptions({ locale: enUS })
|
||||
}
|
||||
|
||||
// set isAppRtl value based on selected language
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 7.2 KiB |
|
|
@ -38,5 +38,13 @@ export const useApi = createFetch({
|
|||
|
||||
return { data: parsedData, response }
|
||||
},
|
||||
onFetchError(ctx) {
|
||||
const errorData = ctx.data ? JSON.parse(ctx.data) : { title: 'Hunter x Hunter' }
|
||||
const status = ctx.response ? ctx.response.status : 'unknown'
|
||||
|
||||
ctx.error = { status, error: errorData.error || errorData.title }
|
||||
|
||||
return ctx
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,176 @@
|
|||
export interface OrderListStatistics {
|
||||
title: string
|
||||
value: number
|
||||
icon: string
|
||||
|
||||
}
|
||||
export interface OrderList {
|
||||
total: number
|
||||
statistics: OrderListStatistics[]
|
||||
orders: Order[]
|
||||
}
|
||||
|
||||
interface meta {
|
||||
id: number
|
||||
model: string
|
||||
}
|
||||
|
||||
interface statusData {
|
||||
code: string
|
||||
title: string
|
||||
}
|
||||
|
||||
interface transaction {
|
||||
transactionTypeId: number
|
||||
transactionDate: Date
|
||||
transactionNo: string
|
||||
transactionTypeDescription: string
|
||||
}
|
||||
|
||||
interface Common {
|
||||
orderId: string
|
||||
requestingLocationCd: string
|
||||
requestingSystemCd: string
|
||||
customerId: string
|
||||
status: string
|
||||
submitOrdMsg: string
|
||||
fdateCreation: Date
|
||||
consumed: boolean
|
||||
shipforpickupLocationCd: string
|
||||
shipforpickupSystemCd: string
|
||||
statusData: statusData
|
||||
transaction: transaction
|
||||
}
|
||||
|
||||
interface Lines {
|
||||
lineOrderId: number
|
||||
lineItemNo: number
|
||||
orderId: string
|
||||
requestId: number
|
||||
lineItemOms: string
|
||||
itemId: string
|
||||
orderedLineQty: number
|
||||
status: string
|
||||
transactionDate: Date
|
||||
shippingAgent: string
|
||||
trackingNumber: string
|
||||
fulfillmentId: string
|
||||
cartonNumber: string
|
||||
fdateCreation: Date
|
||||
consumed: boolean
|
||||
}
|
||||
|
||||
interface History {
|
||||
statusId: number
|
||||
Id: number
|
||||
status: string
|
||||
transactionDate: Date
|
||||
fdateCreation: Date
|
||||
}
|
||||
|
||||
export interface PreparationLines {
|
||||
lineFulfillId: number
|
||||
lineOrderId: number
|
||||
prepIntId: number
|
||||
orderId: string
|
||||
requestId: number
|
||||
transactionDate: Date
|
||||
lineItemNo: number
|
||||
itemId: string
|
||||
lineItemOms: string
|
||||
fulfillQty: number
|
||||
validatedFulfillQty: number
|
||||
fulfillmentSystemCd: string
|
||||
fulfillmentLocationCd: string
|
||||
status: string
|
||||
numeroExpedition: string
|
||||
seasonCode: string
|
||||
finitionSpeciale: string
|
||||
carrier: string
|
||||
trackingCode: string
|
||||
trackingUrl: string
|
||||
fdateCreation: Date
|
||||
fdateModification: Date
|
||||
toOrlixConsumed: boolean
|
||||
restockingCode: string
|
||||
}
|
||||
|
||||
export interface Preparation {
|
||||
prepIntId: number
|
||||
prepId: number
|
||||
orderId: string
|
||||
requestId: number
|
||||
transactionDate: Date
|
||||
fulfillmentSystemCd: string
|
||||
fulfillmentLocationCd: string
|
||||
status: string
|
||||
datePreparation: Date
|
||||
fdateCreation: Date
|
||||
lines: PreparationLines[]
|
||||
}
|
||||
|
||||
export interface ReceptionLines {
|
||||
lineIntransitId: number
|
||||
intransitIntId: number
|
||||
lineFulfillId: number
|
||||
transactionDate: Date
|
||||
lineItemNo: number
|
||||
itemId: string
|
||||
intransitQty: number
|
||||
validatedIntransitQty: number
|
||||
intransitSystemCd: string
|
||||
intransitLocationCd: string
|
||||
status: string
|
||||
colisId: string
|
||||
fdateCreation: Date
|
||||
fdateReceipt: Date
|
||||
orderLineShipWeight: number
|
||||
trackingNumber: string
|
||||
}
|
||||
|
||||
export interface Reception {
|
||||
intransitIntId: number
|
||||
intransitId: string
|
||||
prepIntId: number
|
||||
orderId: string
|
||||
requestId: number
|
||||
status: string
|
||||
transactionDate: Date
|
||||
intransitSystemCd: string
|
||||
intransitLocationCd: string
|
||||
fdateReceipt: Date
|
||||
fdateCreation: Date
|
||||
lines: ReceptionLines[]
|
||||
}
|
||||
|
||||
export interface Order {
|
||||
meta: meta
|
||||
common: Common
|
||||
lines: Lines[]
|
||||
history: History[]
|
||||
preparations: Preparation[]
|
||||
receptions: Reception[]
|
||||
}
|
||||
|
||||
export interface OrderOms {
|
||||
common: OrderOmsCommon
|
||||
oms: Proximis
|
||||
}
|
||||
|
||||
export interface OrderOmsCommon {
|
||||
urlApp: string
|
||||
}
|
||||
|
||||
export interface Proximis {
|
||||
item: ProximisItem
|
||||
}
|
||||
|
||||
export interface ProximisItem {
|
||||
id: number
|
||||
modificationDate: Date
|
||||
code: string
|
||||
fulfillSystem: string
|
||||
creationDate: Date
|
||||
fulfillStoreCode: string
|
||||
status: string
|
||||
}
|
||||
|
|
@ -23,10 +23,24 @@ export default [
|
|||
{
|
||||
title: 'OBI',
|
||||
icon: { icon: 'tabler-shopping-bag-check' },
|
||||
children: [
|
||||
{
|
||||
title: 'Orders list',
|
||||
to: { name: 'obi-order-list' },
|
||||
icon: { icon: 'tabler-bug' },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Dotsoft',
|
||||
icon: { icon: 'tabler-database-star' },
|
||||
children: [
|
||||
{
|
||||
title: 'Chat RCT',
|
||||
to: { name: 'chat-rct' },
|
||||
icon: { icon: 'tabler-message-chatbot' },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'XADMIN',
|
||||
|
|
|
|||
|
|
@ -23,10 +23,24 @@ export default [
|
|||
{
|
||||
title: 'OBI',
|
||||
icon: { icon: 'tabler-shopping-bag-check' },
|
||||
children: [
|
||||
{
|
||||
title: 'Orders',
|
||||
to: { name: 'obi-order-list' },
|
||||
icon: { icon: 'tabler-bug' },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Dotsoft',
|
||||
icon: { icon: 'tabler-database-star' },
|
||||
children: [
|
||||
{
|
||||
title: 'Chat RCT',
|
||||
to: { name: 'chat-rct' },
|
||||
icon: { icon: 'tabler-message-chatbot' },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'XADMIN',
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -302,6 +302,7 @@ const exportEXCEL = () => {
|
|||
:items-per-page="options.itemsPerPage"
|
||||
:page="options.page"
|
||||
:options="options"
|
||||
density="compact"
|
||||
/>
|
||||
</VCol>
|
||||
</Vcard>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,133 @@
|
|||
<script setup lang="ts">
|
||||
import type { Order } from '@/models/Order'
|
||||
import OrderPanel from '@/views/pages/order/view/OrderPanel.vue'
|
||||
import OrderTabGeneral from '@/views/pages/order/view/OrderTabGeneralH.vue'
|
||||
import OrderTabPreparation from '@/views/pages/order/view/OrderTabPreparationH.vue'
|
||||
import OrderTabReception from '@/views/pages/order/view/OrderTabReceptionH.vue'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const route = useRoute('obi-order-details-id')
|
||||
const orderData = ref<Order>()
|
||||
const orderTab = ref(null)
|
||||
|
||||
const tabs = [
|
||||
{ title: t('General') },
|
||||
{ title: t('Preparation') },
|
||||
{ title: t('Receipt') },
|
||||
{ title: t('Flow') },
|
||||
]
|
||||
|
||||
const { data, error, execute: fetchOrder } = await useApi<Order>(`/obi/order/${route.params.id}`)
|
||||
|
||||
const handleData = () => {
|
||||
if (error.value)
|
||||
console.log(error.value)
|
||||
else if (data.value)
|
||||
orderData.value = data.value
|
||||
}
|
||||
|
||||
const refreshData = async () => {
|
||||
await fetchOrder()
|
||||
handleData()
|
||||
}
|
||||
|
||||
handleData()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VBreadcrumbs
|
||||
class="px-0 py-2"
|
||||
:items="[
|
||||
{ title: t('Home'), to: { name: 'root' } },
|
||||
{ title: t('Order list'), to: { name: 'obi-order-list' } },
|
||||
{ title: `#${route.params.id}` },
|
||||
]"
|
||||
/>
|
||||
<div>
|
||||
<!-- 👉 Header -->
|
||||
<div class="d-flex justify-space-between align-center flex-wrap gap-y-4 mb-6">
|
||||
<div
|
||||
v-if="orderData"
|
||||
class="d-flex gap-2 align-center mb-0 flex-wrap"
|
||||
>
|
||||
<h4 class="text-h3 font-weight-medium">
|
||||
#{{ orderData.common.orderId }}
|
||||
</h4>
|
||||
<div class="d-flex gap-2">
|
||||
<VChip
|
||||
label
|
||||
size="x-large"
|
||||
v-bind="resolveOrderStatus(orderData.common.statusData.code)"
|
||||
/>
|
||||
<VChip
|
||||
label
|
||||
size="x-large"
|
||||
:color="orderData.common.consumed ? 'success' : 'error'"
|
||||
>
|
||||
{{ orderData.common.consumed ? 'Consumed' : 'Not consumed' }}
|
||||
</VChip>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
Order not found ...
|
||||
</div>
|
||||
|
||||
<!-- 👉 Reload button -->
|
||||
<div class="d-flex gap-4">
|
||||
<VBtn
|
||||
variant="tonal"
|
||||
color="primary"
|
||||
@click="refreshData"
|
||||
>
|
||||
{{ t("Reload") }}
|
||||
</VBtn>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 👉 Order -->
|
||||
<VRow v-if="orderData">
|
||||
<VCol
|
||||
cols="12"
|
||||
md="5"
|
||||
lg="4"
|
||||
>
|
||||
<OrderPanel :order-data="orderData" />
|
||||
</VCol>
|
||||
<VCol
|
||||
cols="12"
|
||||
md="7"
|
||||
lg="8"
|
||||
>
|
||||
<VTabs
|
||||
v-model="orderTab"
|
||||
class="v-tabs-pill mb-3 disable-tab-transition"
|
||||
>
|
||||
<VTab
|
||||
v-for="tab in tabs"
|
||||
:key="tab.title"
|
||||
>
|
||||
<span>{{ tab.title }}</span>
|
||||
</VTab>
|
||||
</VTabs>
|
||||
<VWindow
|
||||
v-model="orderTab"
|
||||
class="disable-tab-transition"
|
||||
:touch="false"
|
||||
>
|
||||
<!-- 👉 General -->
|
||||
<VWindowItem>
|
||||
<OrderTabGeneral :order-data="orderData" />
|
||||
</VWindowItem>
|
||||
<!-- 👉 Preparation -->
|
||||
<VWindowItem>
|
||||
<OrderTabPreparation :order-data="orderData" />
|
||||
</VWindowItem>
|
||||
<!-- 👉 Reception -->
|
||||
<VWindowItem>
|
||||
<OrderTabReception :order-data="orderData" />
|
||||
</VWindowItem>
|
||||
</VWindow>
|
||||
</VCol>
|
||||
</VRow>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -0,0 +1,412 @@
|
|||
<script setup lang="ts">
|
||||
import { endOfMonth, format, startOfDay, startOfMonth, subDays, subMonths } from 'date-fns'
|
||||
import { VDataTableServer } from 'vuetify/labs/VDataTable'
|
||||
import { paginationMeta } from '@api-utils/paginationMeta'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
// Data table Headers
|
||||
const headers = [
|
||||
{ title: 'Id', key: 'meta.id' },
|
||||
{ title: t('Order'), key: 'common.orderId' },
|
||||
{ title: t('Date'), key: 'common.transaction.transactionDate' },
|
||||
{ title: t('Status'), key: 'common.statusData.code' },
|
||||
{ title: t('Type'), key: 'common.transaction.transactionTypeDescription' },
|
||||
]
|
||||
|
||||
const selectedStatus = ref()
|
||||
|
||||
const status = [
|
||||
'canceled',
|
||||
'complete',
|
||||
'fulfilled',
|
||||
'intransit',
|
||||
'intransit polled',
|
||||
'new_order',
|
||||
'open',
|
||||
'polled',
|
||||
'received',
|
||||
'unfulfillable',
|
||||
]
|
||||
|
||||
const selectedType = ref()
|
||||
|
||||
const type = [
|
||||
{ id: 'PICKUP', title: 'Pickup Order' },
|
||||
{ id: 'DELIVERY', title: 'Delivery Order' },
|
||||
{ id: 'SHIPTOSTORE', title: 'Ship-to-Store Order' },
|
||||
{ id: 'RETAILPICKUP', title: 'Retail Pickup Order' },
|
||||
{ id: 'SHIPFORPICKUP', title: 'Ship-for-Pickup Order' },
|
||||
{ id: 'UNKNOWN', title: 'unknown transaction type' },
|
||||
]
|
||||
|
||||
const searchQuery = ref('')
|
||||
|
||||
// Data table options
|
||||
const itemsPerPage = ref(10)
|
||||
const page = ref(1)
|
||||
const sortBy = ref('request_id')
|
||||
const orderBy = ref('desc')
|
||||
|
||||
const beginDate = ref<string | null>(null)
|
||||
const endDate = ref<string | null>(null)
|
||||
|
||||
const sortByMapping = (sortby: string) => {
|
||||
const headerMapping: { [key: string]: string } = {
|
||||
'meta.id': 'request_id',
|
||||
'common.orderId': 'order_id',
|
||||
'common.transaction.transactionDate': 'transaction_date',
|
||||
'common.statusData.code': 'status',
|
||||
'common.transaction.transactionTypeDescription': 'transaction_type_description',
|
||||
}
|
||||
|
||||
return headerMapping[sortby] || sortby
|
||||
}
|
||||
|
||||
const updateOptions = (options: any) => {
|
||||
page.value = options.page
|
||||
|
||||
// updateOptions was called systematically by VDataTableServer with an empty object
|
||||
if (options.sortBy[0]?.key) {
|
||||
sortBy.value = sortByMapping(options.sortBy[0].key)
|
||||
orderBy.value = options.sortBy[0].order
|
||||
}
|
||||
}
|
||||
|
||||
const { data: ordersData } = await useApi<any>(createUrl('/obi/order',
|
||||
{
|
||||
query: {
|
||||
q: searchQuery,
|
||||
page,
|
||||
itemsPerPage,
|
||||
sortBy,
|
||||
orderBy,
|
||||
status: selectedStatus,
|
||||
type: selectedType,
|
||||
minDate: beginDate,
|
||||
maxDate: endDate,
|
||||
},
|
||||
},
|
||||
))
|
||||
|
||||
const widgetData = computed(() => ordersData.value.statistics)
|
||||
const orders = computed(() => ordersData.value.orders)
|
||||
const totalOrder = computed(() => ordersData.value.total)
|
||||
|
||||
watch(beginDate, newBeginDate => {
|
||||
if (endDate.value && newBeginDate !== null && newBeginDate > endDate.value)
|
||||
endDate.value = newBeginDate
|
||||
})
|
||||
|
||||
watch(endDate, newEndDate => {
|
||||
if (beginDate.value && newEndDate !== null && newEndDate < beginDate.value)
|
||||
beginDate.value = newEndDate
|
||||
})
|
||||
|
||||
const selectLastMonth = () => {
|
||||
beginDate.value = format(startOfMonth(subMonths(new Date(), 1)), 'yyyyMMdd')
|
||||
endDate.value = format(endOfMonth(subMonths(new Date(), 1)), 'yyyyMMdd')
|
||||
}
|
||||
|
||||
const selectThisMonth = () => {
|
||||
const today = new Date()
|
||||
const firstDayOfMonth = startOfMonth(today)
|
||||
const lastDayOfMonth = endOfMonth(today)
|
||||
|
||||
beginDate.value = format(firstDayOfMonth, 'yyyyMMdd')
|
||||
endDate.value = format(today < lastDayOfMonth ? today : lastDayOfMonth, 'yyyyMMdd')
|
||||
}
|
||||
|
||||
const selectLast7Days = () => {
|
||||
beginDate.value = format(startOfDay(subDays(new Date(), 6)), 'yyyyMMdd')
|
||||
endDate.value = format(startOfDay(new Date()), 'yyyyMMdd')
|
||||
}
|
||||
|
||||
const selectToday = () => {
|
||||
const today = new Date()
|
||||
|
||||
beginDate.value = endDate.value = format(today, 'yyyyMMdd')
|
||||
}
|
||||
|
||||
const clearDates = () => {
|
||||
beginDate.value = null
|
||||
endDate.value = null
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VBreadcrumbs
|
||||
class="px-0 py-2"
|
||||
:items="[
|
||||
{ title: t('Home'), to: { name: 'root' } },
|
||||
{ title: t('Order list') },
|
||||
]"
|
||||
/>
|
||||
<div>
|
||||
<VCard class="mb-6">
|
||||
<!-- 👉 Widgets -->
|
||||
<VCardText>
|
||||
<VRow>
|
||||
<template
|
||||
v-for="(data, id) in widgetData"
|
||||
:key="id"
|
||||
>
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="6"
|
||||
md="2"
|
||||
class="px-6"
|
||||
>
|
||||
<div
|
||||
class="d-flex justify-space-between"
|
||||
:class="$vuetify.display.xs
|
||||
? 'product-widget'
|
||||
: $vuetify.display.sm
|
||||
? id < 2 ? 'product-widget' : ''
|
||||
: ''"
|
||||
>
|
||||
<div class="d-flex flex-column gap-y-1">
|
||||
<h4 class="text-h4">
|
||||
{{ data.value }}
|
||||
</h4>
|
||||
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(data.title)"
|
||||
variant="tonal"
|
||||
label
|
||||
size="default"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<VAvatar
|
||||
variant="tonal"
|
||||
rounded
|
||||
size="38"
|
||||
>
|
||||
<VIcon
|
||||
:icon="data.icon"
|
||||
size="28"
|
||||
/>
|
||||
</VAvatar>
|
||||
</div>
|
||||
</VCol>
|
||||
<VDivider
|
||||
v-if="$vuetify.display.mdAndUp ? id !== widgetData.length - 1
|
||||
: $vuetify.display.smAndUp ? id % 2 === 0
|
||||
: false"
|
||||
vertical
|
||||
inset
|
||||
length="55"
|
||||
/>
|
||||
</template>
|
||||
</VRow>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
|
||||
<VCard
|
||||
:title="$t('Filters')"
|
||||
class="mb-6"
|
||||
>
|
||||
<VCardText>
|
||||
<VRow>
|
||||
<!-- 👉 Select Status -->
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="4"
|
||||
>
|
||||
<AppSelect
|
||||
v-model="selectedStatus"
|
||||
:placeholder="$t('Status')"
|
||||
:items="status"
|
||||
clearable
|
||||
clear-icon="tabler-x"
|
||||
/>
|
||||
</VCol>
|
||||
|
||||
<!-- 👉 Select Type -->
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="4"
|
||||
>
|
||||
<AppSelect
|
||||
v-model="selectedType"
|
||||
:placeholder="$t('Type')"
|
||||
:items="type"
|
||||
clearable
|
||||
clear-icon="tabler-x"
|
||||
item-text="title"
|
||||
item-value="id"
|
||||
/>
|
||||
</VCol>
|
||||
</VRow>
|
||||
|
||||
<VRow>
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="4"
|
||||
>
|
||||
<!-- 👉 Begin Date -->
|
||||
<AppDateTimePicker
|
||||
v-model="beginDate"
|
||||
:placeholder="$t('Date begin')"
|
||||
:config="{ altFormat: 'J M Y', altInput: true, dateFormat: 'Ymd' }"
|
||||
/>
|
||||
</VCol>
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="4"
|
||||
>
|
||||
<!-- 👉 End Date -->
|
||||
<AppDateTimePicker
|
||||
v-model="endDate"
|
||||
:placeholder="$t('Date end')"
|
||||
:config="{ altFormat: 'J M Y', altInput: true, dateFormat: 'Ymd' }"
|
||||
/>
|
||||
</VCol>
|
||||
<VCol
|
||||
cols="12"
|
||||
sm="4"
|
||||
>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="selectLastMonth"
|
||||
>
|
||||
{{ $t('Last month') }}
|
||||
</VBtn>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="selectThisMonth"
|
||||
>
|
||||
{{ $t('This month') }}
|
||||
</VBtn>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="selectLast7Days"
|
||||
>
|
||||
{{ $t('Last 7 days') }}
|
||||
</VBtn>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="selectToday"
|
||||
>
|
||||
{{ $t('Today') }}
|
||||
</VBtn>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="clearDates"
|
||||
>
|
||||
{{ $t('All') }}
|
||||
</VBtn>
|
||||
</VCol>
|
||||
</VRow>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
<!-- 👉 Order Table -->
|
||||
<VCard>
|
||||
<!-- 👉 Filters -->
|
||||
<VCardText>
|
||||
<div class="d-flex justify-sm-space-between justify-start flex-wrap gap-4">
|
||||
<VTextField
|
||||
v-model="searchQuery"
|
||||
density="compact"
|
||||
:placeholder="$t('Search')"
|
||||
style=" max-inline-size: 200px; min-inline-size: 200px;"
|
||||
/>
|
||||
|
||||
<div class="d-flex gap-x-4 align-center">
|
||||
<AppSelect
|
||||
v-model="itemsPerPage"
|
||||
style="min-inline-size: 6.25rem;"
|
||||
:items="[5, 10, 20, 50, 100]"
|
||||
/>
|
||||
<VBtn
|
||||
variant="tonal"
|
||||
color="secondary"
|
||||
prepend-icon="tabler-screen-share"
|
||||
text="Export"
|
||||
append-icon="tabler-chevron-down"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</VCardText>
|
||||
|
||||
<VDivider />
|
||||
|
||||
<!-- 👉 Order Table -->
|
||||
<VDataTableServer
|
||||
v-model:items-per-page="itemsPerPage"
|
||||
v-model:page="page"
|
||||
v-model:sort-desc="orderBy"
|
||||
v-model:sort-by:="sortBy"
|
||||
:headers="headers"
|
||||
:items="orders"
|
||||
:items-length="totalOrder"
|
||||
class="text-no-wrap"
|
||||
density="compact"
|
||||
@update:options="updateOptions"
|
||||
>
|
||||
<!-- Order ID -->
|
||||
<template #item.common.orderId="{ item }">
|
||||
<RouterLink
|
||||
:to="{ name: 'obi-order-details-id', params: { id: item.meta.id } }"
|
||||
class="font-weight-medium"
|
||||
>
|
||||
#{{ item.common.orderId }}
|
||||
</RouterLink>
|
||||
</template>
|
||||
|
||||
<!-- Date -->
|
||||
<template #item.common.transaction.transactionDate="{ item }">
|
||||
{{ format(item.common.transaction.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</template>
|
||||
|
||||
<!-- Status -->
|
||||
<template #item.common.statusData.code="{ item }">
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(item.common.statusData.code)"
|
||||
label
|
||||
/>
|
||||
</template>
|
||||
|
||||
<!-- pagination -->
|
||||
<template #bottom>
|
||||
<VDivider />
|
||||
|
||||
<div class="d-flex align-center justify-sm-space-between justify-center flex-wrap gap-3 pa-5 pt-3">
|
||||
<p class="text-sm text-disabled mb-0">
|
||||
{{ paginationMeta({ page, itemsPerPage }, totalOrder) }}
|
||||
</p>
|
||||
|
||||
<VPagination
|
||||
v-model="page"
|
||||
:length="Math.ceil(totalOrder / itemsPerPage)"
|
||||
:total-visible="$vuetify.display.xs ? 1 : Math.min(Math.ceil(totalOrder / itemsPerPage), 5)"
|
||||
>
|
||||
<template #prev="slotProps">
|
||||
<VBtn
|
||||
variant="tonal"
|
||||
color="default"
|
||||
v-bind="slotProps"
|
||||
:icon="false"
|
||||
>
|
||||
{{ $t('$vuetify.pagination.ariaLabel.previous') }}
|
||||
</VBtn>
|
||||
</template>
|
||||
|
||||
<template #next="slotProps">
|
||||
<VBtn
|
||||
variant="tonal"
|
||||
color="default"
|
||||
v-bind="slotProps"
|
||||
:icon="false"
|
||||
>
|
||||
{{ $t('$vuetify.pagination.ariaLabel.next') }}
|
||||
</VBtn>
|
||||
</template>
|
||||
</VPagination>
|
||||
</div>
|
||||
</template>
|
||||
</VDataTableServer>
|
||||
</VCard>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -14,7 +14,7 @@ const headers = computed(() => [
|
|||
{ title: 'Pos', key: 'nbcaisses' },
|
||||
{ title: 'IP', key: 'ip_master', sortable: false },
|
||||
{ title: t('Phone'), key: 'telephone', sortable: false },
|
||||
{ title: t('Brand'), key: 'enseigne' },
|
||||
{ title: t('Sign'), key: 'enseigne' },
|
||||
{ title: t('Country'), key: 'pays' },
|
||||
{ title: '', key: 'actions', sortable: false },
|
||||
])
|
||||
|
|
@ -206,7 +206,7 @@ watch(route, (to, from) => {
|
|||
>
|
||||
<AppSelect
|
||||
v-model="selectedBrand"
|
||||
:placeholder="$t('Brand')"
|
||||
:placeholder="$t('Sign')"
|
||||
:items="brand"
|
||||
clearable
|
||||
clear-icon="tabler-x"
|
||||
|
|
@ -275,6 +275,7 @@ watch(route, (to, from) => {
|
|||
:items-per-page="stStoreList.itemsPerPage"
|
||||
:page="stStoreList.currentPage"
|
||||
:sort-by="stStoreList.getSortBy()"
|
||||
density="compact"
|
||||
@update:sort-by="sortBy => { stStoreList.setSortBy(sortBy[0]?.key) ; stStoreList.setSortOrder(sortBy[0]?.order) }"
|
||||
@update:items-per-page="itemsPerPage => { stStoreList.setItemsPerPage(itemsPerPage) }"
|
||||
@update:page="page => { stStoreList.setCurrentPage(page) }"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
export const paginationMeta = <T extends { page: number; itemsPerPage: number }>(options: T, total: number) => {
|
||||
const start = (options.page - 1) * options.itemsPerPage + 1
|
||||
const end = Math.min(options.page * options.itemsPerPage, total)
|
||||
const { t } = useI18n()
|
||||
|
||||
return `Showing ${total === 0 ? 0 : start} to ${end} of ${total} entries`
|
||||
return `${t('Showing')} ${total === 0 ? 0 : start} ${t('to')} ${end} ${t('of')} ${total} ${t('entries')}`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,11 +70,77 @@
|
|||
"Dates range error": "With a date range, a text of at least 5 characters must be specified",
|
||||
"Close": "Close",
|
||||
"Connect to invidual POS": "Connect to invidual POS",
|
||||
"Sign": "Sign",
|
||||
"Order list": "قائمة الطلبات",
|
||||
"Status": "الحالة",
|
||||
"Type": "النوع",
|
||||
"Last month": "الشهر الماضي",
|
||||
"This month": "هذا الشهر",
|
||||
"Last 7 days": "آخر 7 أيام",
|
||||
"Today": "اليوم",
|
||||
"All": "الكل",
|
||||
"Date begin": "Date begin",
|
||||
"Date end": "Date end",
|
||||
"Order": "الطلب",
|
||||
"showing": "Showing",
|
||||
"to": "to",
|
||||
"of": "of",
|
||||
"entries": "entries",
|
||||
"Consumed": "Consumed",
|
||||
"Created": "Created",
|
||||
"Qty": "Qty",
|
||||
"General": "General",
|
||||
"Preparation": "Preparation",
|
||||
"Receipt": "Receipt",
|
||||
"Order lines": "Order lines",
|
||||
"Transaction date history": "Transaction date history",
|
||||
"Creation date history": "Creation date history",
|
||||
"Status order history": "Status order history",
|
||||
"Order was": "Order was",
|
||||
"Your order has been": "Your order has been",
|
||||
"Order line was": "Order line was",
|
||||
"successfully": "successfully",
|
||||
"OMS": "OMS",
|
||||
"OMS Partner": "OMS Partner",
|
||||
"Transaction details": "Transaction details",
|
||||
"Last status": "Last status",
|
||||
"Added": "Added",
|
||||
"Modified": "Modified",
|
||||
"Transaction": "Transaction",
|
||||
"Open order": "Open order",
|
||||
"Origin request": "Origin request",
|
||||
"Cust Id": "Cust Id",
|
||||
"Ship for Pickup": "Ship for Pickup",
|
||||
"Order transaction": "Order transaction",
|
||||
"Order Details": "Order Details",
|
||||
"Package": "Package",
|
||||
"Tracking": "Tracking",
|
||||
"Cd": "Cd",
|
||||
"Weight": "Weight",
|
||||
"N°Exp": "N°Exp",
|
||||
"Carrier": "Carrier",
|
||||
"URL": "URL",
|
||||
"Restocking": "Restocking",
|
||||
"REMOTE CONTROL": "REMOTE CONTROL",
|
||||
"EXTERNAL LINK": "EXTERNAL LINK",
|
||||
"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": "النماذج والجداول",
|
||||
|
|
@ -215,7 +281,6 @@
|
|||
"Ecommerce": "التجارة الإلكترونية",
|
||||
"Product": "المنتج",
|
||||
"Category": "الفئة",
|
||||
"Order": "طلب",
|
||||
"Details": "تفاصيل",
|
||||
"Customer": "الزبون",
|
||||
"Manage Review": "إدارة المراجعة",
|
||||
|
|
|
|||
|
|
@ -70,11 +70,77 @@
|
|||
"Dates range error": "With a date range, a text of at least 5 characters must be specified",
|
||||
"Close": "Close",
|
||||
"Connect to invidual POS": "Connect to invidual POS",
|
||||
"Orders list": "Orders list",
|
||||
"Sign": "Sign",
|
||||
"Status": "Status",
|
||||
"Type": "Type",
|
||||
"Last month": "Last month",
|
||||
"This month": "This month",
|
||||
"Last 7 days": "Last 7 days",
|
||||
"Today": "Today",
|
||||
"All": "All",
|
||||
"Date begin": "Date begin",
|
||||
"Date end": "Date end",
|
||||
"Order": "Order",
|
||||
"Showing": "Showing",
|
||||
"to": "to",
|
||||
"of": "of",
|
||||
"entries": "entries",
|
||||
"Consumed": "Consumed",
|
||||
"Created": "Created",
|
||||
"Qty": "Qty",
|
||||
"Preparation": "Preparation",
|
||||
"Receipt": "Réception",
|
||||
"Order lines": "Order lines",
|
||||
"Status history": "Status history",
|
||||
"Transaction date history": "Transaction date history",
|
||||
"Creation date history": "Creation date history",
|
||||
"Status order history": "Status order history",
|
||||
"Order was": "Order was",
|
||||
"Order has been": "Order has been",
|
||||
"Order line was": "Order line was",
|
||||
"successfully": "successfully",
|
||||
"OMS": "OMS",
|
||||
"OMS Partner": "OMS Partner",
|
||||
"Transaction details": "Transaction details",
|
||||
"Last status": "Last status",
|
||||
"Added": "Added",
|
||||
"Modified": "Modified",
|
||||
"Transaction": "Transaction",
|
||||
"Open order": "Open order",
|
||||
"Origin request": "Origin request",
|
||||
"Cust Id": "Cust Id",
|
||||
"Ship for Pickup": "Ship for Pickup",
|
||||
"Order transaction": "Order transaction",
|
||||
"Order Details": "Order Details",
|
||||
"Package": "Package",
|
||||
"Tracking": "Tracking",
|
||||
"Cd": "Cd",
|
||||
"Weight": "Weight",
|
||||
"N°Exp": "N°Exp",
|
||||
"Carrier": "Carrier",
|
||||
"URL": "URL",
|
||||
"Restocking": "Restocking",
|
||||
"REMOTE CONTROL": "REMOTE CONTROL",
|
||||
"EXTERNAL LINK": "EXTERNAL LINK",
|
||||
"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",
|
||||
|
|
@ -221,7 +287,6 @@
|
|||
"Swiper": "Swiper",
|
||||
"Product": "Product",
|
||||
"Category": "Category",
|
||||
"Order": "Order",
|
||||
"Details": "Details",
|
||||
"Customer": "Customer",
|
||||
"Manage Review": "Manage Review",
|
||||
|
|
|
|||
|
|
@ -70,11 +70,78 @@
|
|||
"Dates range error": "Dans le cas d'une plage de dates, un texte d'au moins 5 caractères doit être spécifié.",
|
||||
"Close": "Fermer",
|
||||
"Connect to invidual POS": "Connexion à une caisse individuelle",
|
||||
"Orders list": "Liste des commandes",
|
||||
"Sign": "Enseigne",
|
||||
"Order list": "Liste des commandes",
|
||||
"Status": "Statut",
|
||||
"Type": "Type",
|
||||
"Last month": "Mois dernier",
|
||||
"This month": "Ce mois",
|
||||
"Last 7 days": "7 derniers jours",
|
||||
"Today": "Aujourd'hui",
|
||||
"All": "Tous",
|
||||
"Date begin": "Date début",
|
||||
"Date end": "Date fin",
|
||||
"Order": "Commande",
|
||||
"Showing": "Affichage",
|
||||
"to": "à",
|
||||
"of": "parmi",
|
||||
"entries": "entrées",
|
||||
"Consumed": "Consumed",
|
||||
"Created": "Créé",
|
||||
"Qty": "Qté",
|
||||
"Preparation": "Preparation",
|
||||
"Receipt": "Réception",
|
||||
"Order lines": "Lignes de commande",
|
||||
"Status history": "Histo. statuts",
|
||||
"Transaction date history": "Histo. dates transaction",
|
||||
"Creation date history": "Histo. dates création",
|
||||
"Status order history": "Historique statuts commande",
|
||||
"Order was": "Commande a été",
|
||||
"Order has been": "Commande a été",
|
||||
"Order line was": "Ligne a été",
|
||||
"successfully": "avec succès",
|
||||
"OMS": "OMS",
|
||||
"OMS Partner": "Partenaire OMS",
|
||||
"Transaction details": "Détails transaction",
|
||||
"Last status": "Dernier statut",
|
||||
"Added": "Ajouté",
|
||||
"Modified": "Modifié",
|
||||
"Transaction": "Transaction",
|
||||
"Open order": "Commande",
|
||||
"Origin request": "Origine",
|
||||
"Cust Id": "Id client",
|
||||
"Ship for Pickup": "Ship for Pickup",
|
||||
"Order transaction": "Transaction commande",
|
||||
"Order Details": "Details commande",
|
||||
"Package": "Colis",
|
||||
"Tracking": "Tracking",
|
||||
"Cd": "Cd",
|
||||
"Weight": "Poids",
|
||||
"N°Exp": "N°Exp",
|
||||
"Carrier": "Transport",
|
||||
"URL": "URL",
|
||||
"Restocking": "Restocking",
|
||||
"REMOTE CONTROL": "CONTROLE A DISTANCE",
|
||||
"EXTERNAL LINK": "LIEN EXTERNE",
|
||||
"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",
|
||||
|
|
@ -217,7 +284,6 @@
|
|||
"Ecommerce": "Commerce électronique",
|
||||
"Product": "Produit",
|
||||
"Category": "Catégorie",
|
||||
"Order": "Ordre",
|
||||
"Details": "Détails",
|
||||
"Customer": "Client",
|
||||
"Manage Review": "Gérer la revue",
|
||||
|
|
@ -255,7 +321,7 @@
|
|||
"dataFooter": {
|
||||
"itemsPerPageText": "Objets par page:",
|
||||
"itemsPerPageAll": "Tout",
|
||||
"pageText": "{0}-{1} of {2}",
|
||||
"pageText": "{0}-{1} de {2}",
|
||||
"firstPage": "Première page",
|
||||
"prevPage": "Page précédente",
|
||||
"nextPage": "Page suivante",
|
||||
|
|
|
|||
|
|
@ -6,10 +6,13 @@
|
|||
/**
|
||||
* you need to import the some interfaces
|
||||
*/
|
||||
import ar from '@/plugins/i18n/locales/ar.json';
|
||||
import en from '@/plugins/i18n/locales/en.json';
|
||||
import fr from '@/plugins/i18n/locales/fr.json';
|
||||
import 'vue-i18n';
|
||||
|
||||
type LocaleMessage = typeof en
|
||||
type LocaleMessage = typeof en & typeof fr & typeof ar;
|
||||
|
||||
|
||||
declare module 'vue-i18n' {
|
||||
export interface DefineLocaleMessage extends LocaleMessage {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,13 @@
|
|||
import { deepMerge } from '@antfu/utils'
|
||||
import type { App } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { createVuetify } from 'vuetify'
|
||||
import { VBtn } from 'vuetify/components/VBtn'
|
||||
import { createVueI18nAdapter } from 'vuetify/locale/adapters/vue-i18n'
|
||||
import defaults from './defaults'
|
||||
import { icons } from './icons'
|
||||
import { staticPrimaryColor, themes } from './theme'
|
||||
import { getI18n } from '@/plugins/i18n/index'
|
||||
|
||||
// Styles
|
||||
import { cookieRef } from '@/@layouts/stores/config'
|
||||
|
|
@ -37,7 +40,9 @@ export default function (app: App) {
|
|||
defaults,
|
||||
icons,
|
||||
theme: optionTheme,
|
||||
|
||||
locale: {
|
||||
adapter: createVueI18nAdapter({ i18n: getI18n(), useI18n }),
|
||||
},
|
||||
})
|
||||
|
||||
app.use(vuetify)
|
||||
|
|
|
|||
|
|
@ -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 = ''
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
export const resolveOrderStatus = (status: string) => {
|
||||
if (status === 'received' || status === 'fulfilled')
|
||||
return { text: status, color: 'success' }
|
||||
else if (status === 'polled')
|
||||
return { text: status, color: 'info' }
|
||||
else if (status === 'intransit polled')
|
||||
return { text: status, color: 'warning' }
|
||||
else if (status === 'canceled' || status === 'unfulfillable')
|
||||
return { text: status, color: 'error' }
|
||||
else
|
||||
return { text: status, color: 'primary' }
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,241 @@
|
|||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import VueJsonPretty from 'vue-json-pretty'
|
||||
import type { Order, OrderOms } from '@/models/Order'
|
||||
import logoProximis from '@images/misc/logo-proximis.png'
|
||||
import 'vue-json-pretty/lib/styles.css'
|
||||
|
||||
const props = defineProps<Props>()
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
interface Props {
|
||||
orderData: Order
|
||||
}
|
||||
|
||||
const omsData = ref<OrderOms>()
|
||||
const omsError = ref()
|
||||
|
||||
const OrderMessageDialogVisible = ref(false)
|
||||
const OrderMessageData = ref()
|
||||
|
||||
const { data: apiDataOms, error: apiErrorOms } = await useApi<any>(`/proximis/project/fulfillment/${props.orderData.common.orderId}`)
|
||||
if (apiErrorOms.value)
|
||||
omsError.value = `${apiErrorOms.value.status} - ${apiErrorOms.value.error}`
|
||||
else
|
||||
omsData.value = apiDataOms.value
|
||||
|
||||
const openOrderMessageDialog = async (): Promise<void> => {
|
||||
const { data: apiDataMessage, error: apiErrorMessage } = await useApi<any>(`/obi/order/${props.orderData.meta.id}/orderMessage`)
|
||||
if (apiErrorMessage.value) {
|
||||
OrderMessageData.value = `${apiErrorMessage.value.status} - ${apiErrorMessage.value.error}`
|
||||
OrderMessageDialogVisible.value = true
|
||||
}
|
||||
else {
|
||||
OrderMessageData.value = apiDataMessage.value
|
||||
OrderMessageDialogVisible.value = true
|
||||
}
|
||||
}
|
||||
|
||||
const openOmsOrderPage = (): void => {
|
||||
// Check if omsData is defined before accessing its value property
|
||||
if (omsData.value) {
|
||||
const url = `${omsData.value.common.urlApp}/ua.php/orderManager/Order/${omsData.value.oms.item.id}`
|
||||
|
||||
window.open(url, '_blank')
|
||||
}
|
||||
else {
|
||||
// Handle the case when omsData is not defined
|
||||
console.error('omsData is not defined')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 👉 Proximis -->
|
||||
<VCard>
|
||||
<VRow no-gutters>
|
||||
<VCol cols="6">
|
||||
<VCardText class="pa-4">
|
||||
<h6 class="text-lg text-no-wrap font-weight-medium">
|
||||
{{ $t('OMS') }}
|
||||
</h6>
|
||||
<p class="mb-2">
|
||||
{{ $t('OMS Partner') }}
|
||||
</p>
|
||||
</VCardText>
|
||||
</VCol>
|
||||
|
||||
<VCol
|
||||
cols="6"
|
||||
class="text-right"
|
||||
>
|
||||
<VCardText class="pa-3">
|
||||
<VImg
|
||||
:src="logoProximis"
|
||||
height="50"
|
||||
/>
|
||||
</VCardText>
|
||||
</VCol>
|
||||
|
||||
<VCol cols="12">
|
||||
<VCardText>
|
||||
<div v-if="omsData">
|
||||
<VList class="card-list mt-0">
|
||||
<div class="text-disabled text-uppercase text-sm">
|
||||
{{ $t('Transaction details') }}
|
||||
</div>
|
||||
<VListItem>
|
||||
<div class="text-body-1 mt-2">
|
||||
<span class="font-weight-bold me-2">Id:</span>
|
||||
<span>
|
||||
{{ omsData.oms.item.id }} / {{ omsData.oms.item.code }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Last status') }}:</span>
|
||||
<span>
|
||||
{{ omsData.oms.item.status }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Added') }}:</span>
|
||||
<span>
|
||||
{{ format(omsData.oms.item.modificationDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">fulfillSystem:</span>
|
||||
<span>
|
||||
{{ omsData.oms.item.fulfillSystem }} / {{ omsData.oms.item.fulfillStoreCode }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Modified') }}:</span>
|
||||
<span>
|
||||
{{ format(omsData.oms.item.creationDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
</div>
|
||||
<div v-else>
|
||||
Error: {{ omsError }}
|
||||
</div>
|
||||
</VCardText>
|
||||
</VCol>
|
||||
|
||||
<VDivider />
|
||||
|
||||
<VCol cols="6">
|
||||
<VCardText class="pa-4">
|
||||
<VBtn
|
||||
class="mt-0"
|
||||
@click="openOrderMessageDialog"
|
||||
>
|
||||
{{ $t('Transaction') }}
|
||||
</VBtn>
|
||||
</VCardText>
|
||||
</VCol>
|
||||
|
||||
<VCol
|
||||
v-if="omsData"
|
||||
cols="6"
|
||||
class="text-right"
|
||||
>
|
||||
<VCardText class="pa-4">
|
||||
<VBtn
|
||||
class="mt-0"
|
||||
@click="openOmsOrderPage"
|
||||
>
|
||||
{{ $t('Open order') }}
|
||||
</VBtn>
|
||||
</VCardText>
|
||||
</VCol>
|
||||
</VRow>
|
||||
</VCard>
|
||||
|
||||
<VDialog
|
||||
v-model="OrderMessageDialogVisible"
|
||||
fullscreen
|
||||
:scrim="false"
|
||||
transition="dialog-bottom-transition"
|
||||
>
|
||||
<!-- Dialog Content -->
|
||||
<VCard>
|
||||
<!-- Toolbar -->
|
||||
<div>
|
||||
<VToolbar color="primary">
|
||||
<VBtn
|
||||
icon
|
||||
variant="plain"
|
||||
@click="OrderMessageDialogVisible = false"
|
||||
>
|
||||
<VIcon
|
||||
color="white"
|
||||
icon="tabler-x"
|
||||
/>
|
||||
</VBtn>
|
||||
|
||||
<VToolbarTitle>{{ t("Order transaction") }}</VToolbarTitle>
|
||||
|
||||
<VSpacer />
|
||||
|
||||
<VToolbarItems>
|
||||
<VBtn
|
||||
variant="text"
|
||||
@click="OrderMessageDialogVisible = false"
|
||||
>
|
||||
{{ t("Close") }}
|
||||
</VBtn>
|
||||
</VToolbarItems>
|
||||
</VToolbar>
|
||||
</div>
|
||||
|
||||
<!-- pretty json viewer -->
|
||||
<VCardText>
|
||||
<VueJsonPretty
|
||||
:show-length="false"
|
||||
show-line-number
|
||||
show-icon
|
||||
:show-line="false"
|
||||
:data="OrderMessageData"
|
||||
/>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
</VDialog>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.dialog-bottom-transition-enter-active,
|
||||
.dialog-bottom-transition-leave-active {
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.full-screen-dialog-list{
|
||||
.v-list-item[tabindex="-2"].v-list-item--active{
|
||||
.v-list-item-action{
|
||||
.v-icon{
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import type { Order } from '@/models/Order'
|
||||
import OrderOms from '@/views/pages/order/view/OrderOms.vue'
|
||||
|
||||
const props = defineProps<Props>()
|
||||
|
||||
interface Props {
|
||||
orderData: Order
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VRow>
|
||||
<VCol cols="12">
|
||||
<VCard
|
||||
v-if="props.orderData"
|
||||
class="mb-4"
|
||||
>
|
||||
<!-- 👉 Order Details -->
|
||||
<VCardText>
|
||||
<div class="text-disabled text-uppercase text-sm">
|
||||
{{ $t('Order Details') }}
|
||||
</div>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Origin request') }}:</span>
|
||||
<span>
|
||||
{{ props.orderData.common.requestingLocationCd }} / {{ props.orderData.common.requestingSystemCd }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Cust Id') }}:</span>
|
||||
<span>
|
||||
{{ props.orderData.common.customerId }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Created') }}:</span>
|
||||
<span>
|
||||
{{ format(props.orderData.common.fdateCreation, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Ship for Pickup') }}:</span>
|
||||
<span>
|
||||
{{ props.orderData.common.shipforpickupLocationCd }} / {{ props.orderData.common.shipforpickupSystemCd }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
<div class="text-disabled text-uppercase mt-4 text-sm">
|
||||
{{ $t('Transaction') }}
|
||||
</div>
|
||||
<VList class="card-list mt-2">
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">No:</span>
|
||||
<span>
|
||||
{{ props.orderData.common.transaction.transactionNo }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">Date:</span>
|
||||
<span>
|
||||
{{ format(props.orderData.common.transaction.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">Type:</span>
|
||||
<span>
|
||||
{{ props.orderData.common.transaction.transactionTypeDescription }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
</VList>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
|
||||
<!-- 👉 OMS Proximis -->
|
||||
<OrderOms :order-data="orderData" />
|
||||
</VCol>
|
||||
</VRow>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.card-list {
|
||||
--v-card-list-gap: 0.75rem;
|
||||
}
|
||||
|
||||
.text-capitalize {
|
||||
text-transform: capitalize !important;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import { VDataTable } from 'vuetify/labs/VDataTable'
|
||||
import type { Order } from '@/models/Order'
|
||||
|
||||
const props = defineProps<Props>()
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
interface Props {
|
||||
orderData: Order
|
||||
}
|
||||
|
||||
const headers = computed(() => [
|
||||
{ title: '', key: 'data-table-expand' },
|
||||
{ title: '#', key: 'lineItemNo' },
|
||||
{ title: t('Item'), key: 'itemId' },
|
||||
{ title: t('Qty'), key: 'orderedLineQty' },
|
||||
{ title: t('Date'), key: 'transactionDate' },
|
||||
{ title: t('Status'), key: 'status' },
|
||||
{ title: t('Consumed'), key: 'consumed' },
|
||||
])
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 👉 Order Details -->
|
||||
<VCard class="mb-6">
|
||||
<VCardItem>
|
||||
<template #title>
|
||||
<h5 class="text-h5">
|
||||
{{ $t('Order lines') }}
|
||||
</h5>
|
||||
</template>
|
||||
</VCardItem>
|
||||
|
||||
<VDivider />
|
||||
|
||||
<VDataTable
|
||||
:headers="headers"
|
||||
:items="props.orderData.lines"
|
||||
density="compact"
|
||||
class="text-no-wrap"
|
||||
expand-on-click
|
||||
>
|
||||
<template #item.lineItemNo="{ item }">
|
||||
<VChip
|
||||
variant="tonal"
|
||||
label
|
||||
>
|
||||
{{ item.lineItemNo }}
|
||||
</VChip>
|
||||
</template>
|
||||
|
||||
<template #item.status="{ item }">
|
||||
<VChip
|
||||
variant="outlined"
|
||||
label
|
||||
>
|
||||
{{ item.status }}
|
||||
</VChip>
|
||||
</template>
|
||||
|
||||
<!-- Expanded Row Data -->
|
||||
<template #expanded-row="slotProps">
|
||||
<td :colspan="headers.length">
|
||||
<VCardText>
|
||||
<VTimeline
|
||||
truncate-line="both"
|
||||
align="start"
|
||||
side="end"
|
||||
line-color="primary"
|
||||
density="compact"
|
||||
class="v-timeline-density-compact"
|
||||
>
|
||||
<template
|
||||
v-for="(historyItem, index) in slotProps.item.history"
|
||||
:key="index"
|
||||
>
|
||||
<VTimelineItem
|
||||
dot-color="primary"
|
||||
size="x-small"
|
||||
>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<div class="app-timeline-title">
|
||||
<VChip
|
||||
variant="outlined"
|
||||
label
|
||||
>
|
||||
{{ historyItem.status }}
|
||||
</VChip>
|
||||
(Id#{{ historyItem.statusId }})
|
||||
</div>
|
||||
<div class="app-timeline-meta">
|
||||
{{ format(historyItem.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</div>
|
||||
</div>
|
||||
</VTimelineItem>
|
||||
</template>
|
||||
</VTimeline>
|
||||
</VCardText>
|
||||
</td>
|
||||
</template>
|
||||
|
||||
<template #item.transactionDate="{ item }">
|
||||
{{ format(new Date(item.transactionDate), 'dd/MM/yyyy HH:mm:ss') }}
|
||||
</template>
|
||||
|
||||
<template #item.consumed="{ item }">
|
||||
<VChip
|
||||
label
|
||||
size="x-small"
|
||||
:color="item.consumed ? 'success' : 'error'"
|
||||
>
|
||||
{{ item.consumed ? 'Consumed' : 'Not consumed' }}
|
||||
</VChip>
|
||||
</template>
|
||||
|
||||
<template #item.fdateCreation="{ item }">
|
||||
{{ format(new Date(item.fdateCreation), 'dd/MM/yyyy HH:mm:ss') }}
|
||||
</template>
|
||||
|
||||
<template #bottom />
|
||||
</VDataTable>
|
||||
</VCard>
|
||||
|
||||
<!-- 👉 Order History -->
|
||||
<VCard :title="$t('Status order history')">
|
||||
<VCardText>
|
||||
<VTimeline
|
||||
truncate-line="both"
|
||||
align="start"
|
||||
side="end"
|
||||
line-color="primary"
|
||||
density="compact"
|
||||
class="v-timeline-density-compact"
|
||||
>
|
||||
<template
|
||||
v-for="(historyItem, index) in props.orderData.history"
|
||||
:key="index"
|
||||
>
|
||||
<VTimelineItem
|
||||
dot-color="primary"
|
||||
size="x-small"
|
||||
>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<div class="app-timeline-title">
|
||||
<VChip
|
||||
variant="outlined"
|
||||
label
|
||||
>
|
||||
{{ historyItem.status }}
|
||||
</VChip>
|
||||
(Id#{{ historyItem.statusId }})
|
||||
</div>
|
||||
<div class="app-timeline-meta">
|
||||
{{ format(historyItem.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}
|
||||
</div>
|
||||
</div>
|
||||
</VTimelineItem>
|
||||
</template>
|
||||
</VTimeline>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
</template>
|
||||
|
|
@ -0,0 +1,184 @@
|
|||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import type { Order } from '@/models/Order'
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
const props = defineProps<Props>()
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
const { t } = useI18n()
|
||||
|
||||
interface Props {
|
||||
orderData: Order
|
||||
}
|
||||
|
||||
const panelStatus = ref(0)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 👉 Preparations -->
|
||||
<VExpansionPanels
|
||||
v-model="panelStatus"
|
||||
variant="accordion"
|
||||
>
|
||||
<template v-if="orderData.preparations && orderData.preparations.length > 0">
|
||||
<VExpansionPanel
|
||||
v-for="(section, index) in orderData.preparations"
|
||||
:key="index"
|
||||
elevation="0"
|
||||
>
|
||||
<template #title>
|
||||
<VCardText class="pa-sm-2">
|
||||
<div class="d-flex justify-space-between align-center mb-4">
|
||||
<div>
|
||||
Prep #{{ index + 1 }} /
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(section.status)"
|
||||
variant="tonal"
|
||||
label
|
||||
size="default"
|
||||
/>
|
||||
{{ section.fulfillmentSystemCd }} / {{ section.fulfillmentLocationCd }}
|
||||
</div>
|
||||
<div class="d-flex">
|
||||
<span class="text-body-1 text-disabled font-weight-medium"> {{ format(section.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</vcardtext>
|
||||
</template>
|
||||
|
||||
<VExpansionPanelText>
|
||||
<!-- 👉 Preparation line -->
|
||||
<div class="mb-6">
|
||||
<VRow>
|
||||
<template
|
||||
v-for="preparationLine in orderData.preparations[index].lines"
|
||||
:key="preparationLine.lineFulfillId"
|
||||
>
|
||||
<VCol
|
||||
cols="12"
|
||||
md="4"
|
||||
sm="6"
|
||||
>
|
||||
<VCard
|
||||
flat
|
||||
border
|
||||
>
|
||||
<VCardText>
|
||||
<div class="d-flex justify-space-between align-center mb-4">
|
||||
<VChip
|
||||
variant="tonal"
|
||||
label
|
||||
>
|
||||
{{ preparationLine.lineItemOms }}
|
||||
</VChip>
|
||||
|
||||
<div class="d-flex">
|
||||
<span class="text-body-1 font-weight-medium align-center">
|
||||
{{ preparationLine.itemId }} / {{ preparationLine.seasonCode }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<VList class="card-list mt-1">
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('N°Exp') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.numeroExpedition }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Cd') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.fulfillmentSystemCd }} / {{ preparationLine.fulfillmentLocationCd }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Qty') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.validatedFulfillQty }} / {{ preparationLine.fulfillQty }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Carrier') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.carrier }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Tracking') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.trackingCode }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('URL') }}:</span>
|
||||
<span>
|
||||
<a
|
||||
v-if="preparationLine.trackingUrl"
|
||||
:href="preparationLine.trackingUrl"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style="text-decoration: underline;"
|
||||
>Link</a>
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Restocking') }}:</span>
|
||||
<span>
|
||||
{{ preparationLine.restockingCode }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(preparationLine.status)"
|
||||
variant="tonal"
|
||||
label
|
||||
size="x-small"
|
||||
/>
|
||||
{{ format(section.transactionDate, "dd/MM/yyyy HH:mm:ss") }}
|
||||
</VListItem>
|
||||
</VList>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
</VCol>
|
||||
</template>
|
||||
</VRow>
|
||||
</div>
|
||||
</VExpansionPanelText>
|
||||
</VExpansionPanel>
|
||||
</template>
|
||||
<div
|
||||
v-else
|
||||
class="text-h4"
|
||||
>
|
||||
No preparation available
|
||||
</div>
|
||||
</VExpansionPanels>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.v-expansion-panel-text__wrapper{
|
||||
padding-block: 0.75rem !important;
|
||||
padding-inline: 0.5rem !important;
|
||||
}
|
||||
|
||||
.v-expansion-panel--active{
|
||||
.v-expansion-panel-title{
|
||||
border-block-end: 1px solid rgba(var(--v-theme-on-surface), 0.12) !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
<script setup lang="ts">
|
||||
import { format } from 'date-fns'
|
||||
import type { Order } from '@/models/Order'
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
const props = defineProps<Props>()
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
const { t } = useI18n()
|
||||
|
||||
interface Props {
|
||||
orderData: Order
|
||||
}
|
||||
|
||||
const panelStatus = ref(0)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 👉 Receptions -->
|
||||
<VExpansionPanels
|
||||
v-model="panelStatus"
|
||||
variant="accordion"
|
||||
>
|
||||
<template v-if="orderData.receptions && orderData.receptions.length > 0">
|
||||
<VExpansionPanel
|
||||
v-for="(section, index) in orderData.receptions"
|
||||
:key="index"
|
||||
elevation="0"
|
||||
>
|
||||
<template #title>
|
||||
<VCardText class="pa-sm-2">
|
||||
<div class="d-flex justify-space-between align-center mb-4">
|
||||
<div>
|
||||
Recep #{{ index + 1 }} /
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(section.status)"
|
||||
variant="tonal"
|
||||
label
|
||||
size="default"
|
||||
/>
|
||||
{{ section.intransitSystemCd }} / {{ section.intransitLocationCd }}
|
||||
</div>
|
||||
<div class="d-flex">
|
||||
<span class="text-body-1 text-disabled font-weight-medium"> {{ format(section.transactionDate, "EEEE d MMMM yyyy HH:mm:ss") }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</vcardtext>
|
||||
</template>
|
||||
|
||||
<VExpansionPanelText>
|
||||
<!-- 👉 Reception lines -->
|
||||
<div class="mb-6">
|
||||
<VRow>
|
||||
<template
|
||||
v-for="receptionLine in orderData.receptions[index].lines"
|
||||
:key="receptionLine.lineFulfillId"
|
||||
>
|
||||
<VCol
|
||||
cols="12"
|
||||
md="4"
|
||||
sm="6"
|
||||
>
|
||||
<VCard
|
||||
flat
|
||||
border
|
||||
>
|
||||
<VCardText>
|
||||
<div class="d-flex justify-space-between align-center mb-4">
|
||||
<VChip
|
||||
variant="tonal"
|
||||
label
|
||||
>
|
||||
{{ receptionLine.lineItemNo }}
|
||||
</VChip>
|
||||
|
||||
<div class="d-flex">
|
||||
<span class="text-body-1 font-weight-medium align-center">
|
||||
{{ receptionLine.itemId }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<VList class="card-list mt-1">
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Package') }}:</span>
|
||||
<span>
|
||||
{{ receptionLine.colisId }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Cd') }}:</span>
|
||||
<span>
|
||||
{{ receptionLine.intransitSystemCd }} / {{ receptionLine.intransitLocationCd }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem cla>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Qty') }}:</span>
|
||||
<span>
|
||||
{{ receptionLine.validatedIntransitQty }} / {{ receptionLine.intransitQty }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Tracking') }}:</span>
|
||||
<span>
|
||||
{{ receptionLine.trackingNumber }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<div class="text-body-1">
|
||||
<span class="font-weight-bold me-2">{{ $t('Weight') }}:</span>
|
||||
<span>
|
||||
{{ receptionLine.orderLineShipWeight }}
|
||||
</span>
|
||||
</div>
|
||||
</VListItem>
|
||||
<VListItem>
|
||||
<VChip
|
||||
v-bind="resolveOrderStatus(receptionLine.status)"
|
||||
variant="tonal"
|
||||
label
|
||||
size="x-small"
|
||||
/>
|
||||
{{ format(section.transactionDate, "dd/MM/yyyy HH:mm:ss") }}
|
||||
</VListItem>
|
||||
</VList>
|
||||
</VCardText>
|
||||
</VCard>
|
||||
</VCol>
|
||||
</template>
|
||||
</VRow>
|
||||
</div>
|
||||
</VExpansionPanelText>
|
||||
</VExpansionPanel>
|
||||
</template>
|
||||
<div
|
||||
v-else
|
||||
class="text-h4"
|
||||
>
|
||||
No reception available
|
||||
</div>
|
||||
</VExpansionPanels>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.v-expansion-panel-text__wrapper{
|
||||
padding-block: 0.75rem !important;
|
||||
padding-inline: 0.5rem !important;
|
||||
}
|
||||
|
||||
.v-expansion-panel--active{
|
||||
.v-expansion-panel-title{
|
||||
border-block-end: 1px solid rgba(var(--v-theme-on-surface), 0.12) !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -26,15 +26,10 @@ const fetchData = async () => {
|
|||
}
|
||||
|
||||
watchEffect(() => {
|
||||
// eslint-disable-next-line sonarjs/no-collapsible-if
|
||||
if (props.item)
|
||||
// eslint-disable-next-line curly
|
||||
if (!(props.item.trim() === ''))
|
||||
if (route.query.dbHost && props.item && !(props.item.trim() === ''))
|
||||
fetchData()
|
||||
})
|
||||
|
||||
// const { t } = useI18n()
|
||||
|
||||
const headers = computed(() => [
|
||||
{ title: t('ITEM_ID'), key: 'itemId' },
|
||||
{ title: t('LEVEL'), key: 'itemLevelCode' },
|
||||
|
|
|
|||
|
|
@ -30,15 +30,10 @@ const fetchData = async () => {
|
|||
}
|
||||
|
||||
watchEffect(() => {
|
||||
// eslint-disable-next-line sonarjs/no-collapsible-if
|
||||
if (props.item)
|
||||
// eslint-disable-next-line curly
|
||||
if (!(props.item.trim() === ''))
|
||||
if (route.query.dbHost && props.item && !(props.item.trim() === ''))
|
||||
fetchData()
|
||||
})
|
||||
|
||||
// const { t } = useI18n()
|
||||
|
||||
const headers = computed(() => [
|
||||
{ title: t('ITEM_ID'), key: 'itemId' },
|
||||
{ title: 'LEVEL', key: 'level' },
|
||||
|
|
|
|||
|
|
@ -30,15 +30,10 @@ const fetchData = async () => {
|
|||
}
|
||||
|
||||
watchEffect(() => {
|
||||
// eslint-disable-next-line sonarjs/no-collapsible-if
|
||||
if (props.item)
|
||||
// eslint-disable-next-line curly
|
||||
if (!(props.item.trim() === ''))
|
||||
if (route.query.dbHost && props.item && !(props.item.trim() === ''))
|
||||
fetchData()
|
||||
})
|
||||
|
||||
// const { t } = useI18n()
|
||||
|
||||
const headers = computed(() => [
|
||||
{ title: t('ITEM_ID'), key: 'itemId' },
|
||||
{ title: t('LEVEL'), key: 'level' },
|
||||
|
|
|
|||
|
|
@ -26,15 +26,10 @@ const fetchData = async () => {
|
|||
}
|
||||
|
||||
watchEffect(() => {
|
||||
// eslint-disable-next-line sonarjs/no-collapsible-if
|
||||
if (props.item)
|
||||
// eslint-disable-next-line curly
|
||||
if (!(props.item.trim() === ''))
|
||||
if (route.query.dbHost && props.item && !(props.item.trim() === ''))
|
||||
fetchData()
|
||||
})
|
||||
|
||||
// const { t } = useI18n()
|
||||
|
||||
const headers = computed(() => [
|
||||
{ title: t('ITEM_ID'), key: 'itemId' },
|
||||
{ title: 'LOCATION', key: 'invLocationId' },
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export const { themeConfig, layoutConfig } = defineThemeConfig({
|
|||
app: {
|
||||
title: 'hdpos',
|
||||
logo: h('div', { innerHTML: logo, style: 'line-height:0; color: rgb(var(--v-global-theme-primary))' }),
|
||||
contentWidth: ContentWidth.Boxed,
|
||||
contentWidth: ContentWidth.Fluid,
|
||||
contentLayoutNav: AppContentLayoutNav.Horizontal,
|
||||
overlayNavFromBreakpoint: breakpointsVuetify.md + 16, // 16 for scrollbar. Docs: https://next.vuetifyjs.com/en/features/display-and-platform/
|
||||
i18n: {
|
||||
|
|
|
|||
|
|
@ -41,8 +41,11 @@ 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> }>,
|
||||
'obi-order-list': RouteRecordInfo<'obi-order-list', '/obi/order/list', Record<never, never>, Record<never, never>>,
|
||||
'store-details': RouteRecordInfo<'store-details', '/store/details', Record<never, never>, Record<never, never>>,
|
||||
'store-list': RouteRecordInfo<'store-list', '/store/list', Record<never, never>, Record<never, never>>,
|
||||
'xadmin-log': RouteRecordInfo<'xadmin-log', '/xadmin/log', Record<never, never>, Record<never, never>>,
|
||||
|
|
|
|||
Loading…
Reference in New Issue