diff --git a/app/.eslintrc.js b/app/.eslintrc.js index 728ddd1a..e703f821 100644 --- a/app/.eslintrc.js +++ b/app/.eslintrc.js @@ -5,14 +5,22 @@ module.exports = { node: true, }, extends: [ - 'plugin:vue/strongly-recommended', + 'plugin:vue/vue3-recommended', 'eslint:recommended', + '@vue/eslint-config-typescript', 'plugin:prettier/recommended', ], rules: { - 'no-unused-vars': [ + 'vue/no-v-html': 'off', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ 'warn', - { varsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }, + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + }, ], + 'no-console': ['error', { allow: ['warn', 'error'] }], }, } diff --git a/app/components.d.ts b/app/components.d.ts new file mode 100644 index 00000000..1d1de8ad --- /dev/null +++ b/app/components.d.ts @@ -0,0 +1,125 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AdressItem: typeof import('./src/components/globals/formItems/AdressItem.vue')['default'] + AppCatalogSkeleton: typeof import('./src/components/globals/skeletons/AppCatalogSkeleton.vue')['default'] + BAccordion: typeof import('bootstrap-vue-next')['BAccordion'] + BAccordionItem: typeof import('bootstrap-vue-next')['BAccordionItem'] + BBadge: typeof import('bootstrap-vue-next')['BBadge'] + BBreadcrumb: typeof import('bootstrap-vue-next')['BBreadcrumb'] + BBreadcrumbItem: typeof import('bootstrap-vue-next')['BBreadcrumbItem'] + BButton: typeof import('bootstrap-vue-next')['BButton'] + BButtonGroup: typeof import('bootstrap-vue-next')['BButtonGroup'] + BButtonToolbar: typeof import('bootstrap-vue-next')['BButtonToolbar'] + BCard: typeof import('bootstrap-vue-next')['BCard'] + BCardBody: typeof import('bootstrap-vue-next')['BCardBody'] + BCardGroup: typeof import('bootstrap-vue-next')['BCardGroup'] + BCardHeader: typeof import('bootstrap-vue-next')['BCardHeader'] + BCardText: typeof import('bootstrap-vue-next')['BCardText'] + BCardTitle: typeof import('bootstrap-vue-next')['BCardTitle'] + BCol: typeof import('bootstrap-vue-next')['BCol'] + BCollapse: typeof import('bootstrap-vue-next')['BCollapse'] + BDropdown: typeof import('bootstrap-vue-next')['BDropdown'] + BDropdownDivider: typeof import('bootstrap-vue-next')['BDropdownDivider'] + BDropdownForm: typeof import('bootstrap-vue-next')['BDropdownForm'] + BDropdownGroup: typeof import('bootstrap-vue-next')['BDropdownGroup'] + BDropdownItem: typeof import('bootstrap-vue-next')['BDropdownItem'] + BDropdownItemButton: typeof import('bootstrap-vue-next')['BDropdownItemButton'] + BDropdownText: typeof import('bootstrap-vue-next')['BDropdownText'] + BForm: typeof import('bootstrap-vue-next')['BForm'] + BFormCheckbox: typeof import('bootstrap-vue-next')['BFormCheckbox'] + BFormCheckboxGroup: typeof import('bootstrap-vue-next')['BFormCheckboxGroup'] + BFormFile: typeof import('bootstrap-vue-next')['BFormFile'] + BFormGroup: typeof import('bootstrap-vue-next')['BFormGroup'] + BFormInput: typeof import('bootstrap-vue-next')['BFormInput'] + BFormInvalidFeedback: typeof import('bootstrap-vue-next')['BFormInvalidFeedback'] + BFormRadio: typeof import('bootstrap-vue-next')['BFormRadio'] + BFormRadioGroup: typeof import('bootstrap-vue-next')['BFormRadioGroup'] + BFormSelect: typeof import('bootstrap-vue-next')['BFormSelect'] + BFormSelectOption: typeof import('bootstrap-vue-next')['BFormSelectOption'] + BFormTag: typeof import('bootstrap-vue-next')['BFormTag'] + BFormTags: typeof import('bootstrap-vue-next')['BFormTags'] + BFormTextarea: typeof import('bootstrap-vue-next')['BFormTextarea'] + BImg: typeof import('bootstrap-vue-next')['BImg'] + BInputGroup: typeof import('bootstrap-vue-next')['BInputGroup'] + BInputGroupText: typeof import('bootstrap-vue-next')['BInputGroupText'] + BLink: typeof import('bootstrap-vue-next')['BLink'] + BListGroup: typeof import('bootstrap-vue-next')['BListGroup'] + BListGroupItem: typeof import('bootstrap-vue-next')['BListGroupItem'] + BModal: typeof import('bootstrap-vue-next')['BModal'] + BModalOrchestrator: typeof import('bootstrap-vue-next')['BModalOrchestrator'] + BNav: typeof import('bootstrap-vue-next')['BNav'] + BNavbar: typeof import('bootstrap-vue-next')['BNavbar'] + BNavbarBrand: typeof import('bootstrap-vue-next')['BNavbarBrand'] + BNavbarNav: typeof import('bootstrap-vue-next')['BNavbarNav'] + BNavItem: typeof import('bootstrap-vue-next')['BNavItem'] + BNavText: typeof import('bootstrap-vue-next')['BNavText'] + BOverlay: typeof import('bootstrap-vue-next')['BOverlay'] + BPopover: typeof import('bootstrap-vue-next')['BPopover'] + BProgress: typeof import('bootstrap-vue-next')['BProgress'] + BProgressBar: typeof import('bootstrap-vue-next')['BProgressBar'] + BRow: typeof import('bootstrap-vue-next')['BRow'] + BSkeleton: typeof import('./src/components/globals/skeletons/BSkeleton.vue')['default'] + BSkeletonWrapper: typeof import('./src/components/globals/skeletons/BSkeletonWrapper.vue')['default'] + BTab: typeof import('bootstrap-vue-next')['BTab'] + BTable: typeof import('bootstrap-vue-next')['BTable'] + BTabs: typeof import('bootstrap-vue-next')['BTabs'] + ButtonItem: typeof import('./src/components/globals/formItems/ButtonItem.vue')['default'] + CardCollapse: typeof import('./src/components/CardCollapse.vue')['default'] + CardDeckFeed: typeof import('./src/components/CardDeckFeed.vue')['default'] + CardForm: typeof import('./src/components/globals/CardForm.vue')['default'] + CardFormSkeleton: typeof import('./src/components/globals/skeletons/CardFormSkeleton.vue')['default'] + CardInfoSkeleton: typeof import('./src/components/globals/skeletons/CardInfoSkeleton.vue')['default'] + CardListSkeleton: typeof import('./src/components/globals/skeletons/CardListSkeleton.vue')['default'] + CheckboxItem: typeof import('./src/components/globals/formItems/CheckboxItem.vue')['default'] + ConfigPanels: typeof import('./src/components/ConfigPanels.vue')['default'] + DescriptionRow: typeof import('./src/components/globals/DescriptionRow.vue')['default'] + DisplayTextItem: typeof import('./src/components/globals/formItems/DisplayTextItem.vue')['default'] + ExplainWhat: typeof import('./src/components/globals/ExplainWhat.vue')['default'] + FileItem: typeof import('./src/components/globals/formItems/FileItem.vue')['default'] + FormField: typeof import('./src/components/globals/FormField.vue')['default'] + FormFieldMultiple: typeof import('./src/components/globals/FormFieldMultiple.vue')['default'] + FormFieldReadonly: typeof import('./src/components/globals/FormFieldReadonly.vue')['default'] + InputItem: typeof import('./src/components/globals/formItems/InputItem.vue')['default'] + LazyRenderer: typeof import('./src/components/LazyRenderer.vue')['default'] + ListGroupSkeleton: typeof import('./src/components/globals/skeletons/ListGroupSkeleton.vue')['default'] + MainLayout: typeof import('./src/components/layouts/MainLayout.vue')['default'] + MarkdownItem: typeof import('./src/components/globals/formItems/MarkdownItem.vue')['default'] + MessageListGroup: typeof import('./src/components/MessageListGroup.vue')['default'] + ModalError: typeof import('./src/components/modals/ModalError.vue')['default'] + ModalOverlay: typeof import('./src/components/modals/ModalOverlay.vue')['default'] + ModalReconnecting: typeof import('./src/components/modals/ModalReconnecting.vue')['default'] + ModalWaiting: typeof import('./src/components/modals/ModalWaiting.vue')['default'] + ModalWarning: typeof import('./src/components/modals/ModalWarning.vue')['default'] + QueryHeader: typeof import('./src/components/QueryHeader.vue')['default'] + ReadOnlyAlertItem: typeof import('./src/components/globals/formItems/ReadOnlyAlertItem.vue')['default'] + RecursiveListGroup: typeof import('./src/components/RecursiveListGroup.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SelectItem: typeof import('./src/components/globals/formItems/SelectItem.vue')['default'] + TagsItem: typeof import('./src/components/globals/formItems/TagsItem.vue')['default'] + TagsSelectizeItem: typeof import('./src/components/globals/formItems/TagsSelectizeItem.vue')['default'] + TextAreaItem: typeof import('./src/components/globals/formItems/TextAreaItem.vue')['default'] + TopBar: typeof import('./src/components/globals/TopBar.vue')['default'] + ViewSearch: typeof import('./src/components/globals/ViewSearch.vue')['default'] + YAlert: typeof import('./src/components/globals/YAlert.vue')['default'] + YBreadcrumb: typeof import('./src/components/globals/YBreadcrumb.vue')['default'] + YCard: typeof import('./src/components/globals/YCard.vue')['default'] + YIcon: typeof import('./src/components/globals/YIcon.vue')['default'] + YListGroupItem: typeof import('./src/components/globals/YListGroupItem.vue')['default'] + YListItem: typeof import('./src/components/globals/YListItem.vue')['default'] + YSpinner: typeof import('./src/components/globals/YSpinner.vue')['default'] + } + export interface ComponentCustomProperties { + vBModal: typeof import('bootstrap-vue-next')['vBModal'] + vBPopover: typeof import('bootstrap-vue-next')['vBPopover'] + vBToggle: typeof import('bootstrap-vue-next')['vBToggle'] + vBTooltip: typeof import('bootstrap-vue-next')['vBTooltip'] + } +} diff --git a/app/env.d.ts b/app/env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/app/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/index.html b/app/index.html index b7974225..d8d163bc 100644 --- a/app/index.html +++ b/app/index.html @@ -22,6 +22,6 @@
- + diff --git a/app/overrides.d.ts b/app/overrides.d.ts new file mode 100644 index 00000000..fcc095a1 --- /dev/null +++ b/app/overrides.d.ts @@ -0,0 +1,22 @@ +import type { Skeleton } from '@/types/commons' +import 'vue-router' + +declare module 'vue-router' { + interface RouteMeta { + noAuth?: boolean + routerParams?: string[] + args: { trad?: string; param?: string } + breadcrumb?: string[] + skeleton?: (Skeleton | string)[] | Skeleton | string + } +} + +declare module 'bootstrap-vue-next' { + interface BaseColorVariant { + best: unknown + } + interface BaseSize { + // `xs` size is available only for BButton + xs: unknown + } +} diff --git a/app/package.json b/app/package.json index 3bbebb29..359734df 100644 --- a/app/package.json +++ b/app/package.json @@ -10,34 +10,41 @@ "lint:js": "eslint --ext \".ts,.vue,.cjs,.js\" --ignore-path ../.gitignore .", "lint:prettier": "prettier --check .", "lint": "yarn lint:js && yarn lint:prettier", - "lintfix": "prettier --write --list-different . && yarn lint:js --fix" + "lintfix": "prettier --write --list-different . && yarn lint:js --fix", + "type-check": "vue-tsc --noEmit -p tsconfig.json" }, "dependencies": { - "@fontsource/fira-code": "^4.5.13", - "@fontsource/firago": "^4.5.3", - "bootstrap-vue": "^2.22.0", - "date-fns": "^2.29.3", + "@fontsource/fira-code": "^5.0.18", + "@fontsource/firago": "^5.0.11", + "@vuelidate/core": "^2.0.3", + "@vuelidate/validators": "^2.0.4", + "@vueuse/core": "^11.0.1", + "bootstrap": "^5.3.3", + "bootstrap-vue-next": "^0.24.7", + "date-fns": "^3.6.0", "fork-awesome": "^1.2.0", "simple-evaluate": "^1.4.6", - "vue": "^2.7.14", - "vue-i18n": "^8.28.2", - "vue-router": "^3.6.5", - "vue-showdown": "^2.4.1", - "vuelidate": "^0.7.7", - "vuex": "^3.6.2" + "uuid": "^10.0.0", + "vue": "^3.4.37", + "vue-i18n": "^9.13.1", + "vue-router": "^4.4.3", + "vue-showdown": "^4.2.0" }, "devDependencies": { - "@vitejs/plugin-vue2": "^2.2.0", - "bootstrap": "^4.6.0", - "eslint": "^8.36.0", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-vue": "^5.1.2", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-vue": "^9.10.0", - "popper.js": "^1.16.0", - "portal-vue": "^2.1.7", - "prettier": "^3.2.5", - "sass": "^1.60.0", - "vite": "^4.5.3" + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-vue": "^9.27.0", + "prettier": "^3.3.3", + "sass": "^1.77.8", + "typescript": "^5.5.4", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.0", + "vue-tsc": "^2.0.29" }, "browserslist": [ "> 1%", diff --git a/app/src/App.vue b/app/src/App.vue index 80bd7361..be09de55 100644 --- a/app/src/App.vue +++ b/app/src/App.vue @@ -1,3 +1,72 @@ + + - - - - diff --git a/app/src/components/CardCollapse.vue b/app/src/components/CardCollapse.vue index ef647168..abbb372b 100644 --- a/app/src/components/CardCollapse.vue +++ b/app/src/components/CardCollapse.vue @@ -1,5 +1,36 @@ + +