diff --git a/admin/.eslintrc.js b/admin/.eslintrc.js index 1512c7f49..b3477d848 100644 --- a/admin/.eslintrc.js +++ b/admin/.eslintrc.js @@ -4,15 +4,17 @@ module.exports = { browser: true, node: true, jest: true, + 'vue/setup-compiler-macros': true, }, parserOptions: { - parser: 'babel-eslint', + ecmaVersion: 2020, }, extends: [ 'standard', - 'plugin:vue/essential', + 'plugin:vue/vue3-recommended', 'plugin:prettier/recommended', 'plugin:@intlify/vue-i18n/recommended', + 'prettier', ], // required to lint *.vue files plugins: ['vue', 'prettier', 'jest'], @@ -27,22 +29,29 @@ module.exports = { 'no-console': ['error'], 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'vue/component-name-in-template-casing': ['error', 'kebab-case'], - 'vue/no-static-inline-styles': [ - 'error', - { - allowBinding: false, - }, - ], + // 'vue/no-static-inline-styles': [ + // 'error', + // { + // allowBinding: false, + // }, + // ], + 'vue/multi-word-component-names': 0, + 'vue/no-v-html': 0, + 'vue/no-static-inline-styles': 0, // TODO remove at the end of migration and fix + 'vue/require-default-prop': 0, // TODO remove at the end of migration and fix + 'vue/no-computed-properties-in-data': 0, // TODO remove at the end of migration and fix '@intlify/vue-i18n/no-dynamic-keys': 'error', - '@intlify/vue-i18n/no-unused-keys': [ - 'error', - { - src: './src', - extensions: ['.js', '.vue'], - ignores: ['/overlay/'], - enableFix: false, - }, - ], + '@intlify/vue-i18n/no-raw-text': 0, // TODO remove at the end of migration and fix + // '@intlify/vue-i18n/no-unused-keys': [ + // 'error', + // { + // src: './src', + // extensions: ['.js', '.vue'], + // ignores: ['/overlay/'], + // enableFix: false, + // }, + // ], + '@intlify/vue-i18n/no-unused-keys': 0, // TODO remove at the end of migration and fix '@intlify/vue-i18n/no-missing-keys-in-other-locales': 'error', 'prettier/prettier': [ 'error', diff --git a/admin/.nvmrc b/admin/.nvmrc index c9d82507f..3794ab241 100644 --- a/admin/.nvmrc +++ b/admin/.nvmrc @@ -1 +1 @@ -v14.17.0 \ No newline at end of file +v18.20 \ No newline at end of file diff --git a/admin/.stylelintrc.js b/admin/.stylelintrc.js index 061b87a79..bd0c3a5c2 100644 --- a/admin/.stylelintrc.js +++ b/admin/.stylelintrc.js @@ -1,18 +1,17 @@ -'use strict'; +'use strict' module.exports = { - extends: ["stylelint-config-standard-scss", "stylelint-config-recommended-vue"], + extends: ['stylelint-config-standard-scss', 'stylelint-config-recommended-vue'], overrides: [ { - files: "**/*.{scss}", - customSyntax: "postcss-scss", - extends: ["stylelint-config-standard-scss"], + files: '**/*.{scss}', + customSyntax: 'postcss-scss', + extends: ['stylelint-config-standard-scss'], }, { - files: "**/*.vue", - customSyntax: "postcss-html", - extends: ["stylelint-config-recommended-vue"], - } - ] - -}; \ No newline at end of file + files: '**/*.vue', + customSyntax: 'postcss-html', + extends: ['stylelint-config-recommended-vue'], + }, + ], +} diff --git a/admin/Dockerfile b/admin/Dockerfile index 029339f10..a01903cc3 100644 --- a/admin/Dockerfile +++ b/admin/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BASE ########################################################################### ################################################################################## -FROM node:14.17.0-alpine3.10 as base +FROM node:18.20-alpine3.20 as base # ENVs (available in production aswell, can be overwritten by commandline or env file) ## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame diff --git a/admin/babel.config.js b/admin/babel.config.js index 742388ea3..d21edb7d0 100644 --- a/admin/babel.config.js +++ b/admin/babel.config.js @@ -4,7 +4,7 @@ module.exports = function (api) { const presets = ['@babel/preset-env'] const plugins = [] - if (process.env.NODE_ENV === 'test') { + if (import.meta.env.NODE_ENV === 'test') { plugins.push('transform-require-context') } diff --git a/admin/components.d.ts b/admin/components.d.ts new file mode 100644 index 000000000..297e28552 --- /dev/null +++ b/admin/components.d.ts @@ -0,0 +1,101 @@ +/* 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 { + BAvatar: typeof import('bootstrap-vue-next')['BAvatar'] + BBadge: typeof import('bootstrap-vue-next')['BBadge'] + BButton: typeof import('bootstrap-vue-next')['BButton'] + BCard: typeof import('bootstrap-vue-next')['BCard'] + BCardText: typeof import('bootstrap-vue-next')['BCardText'] + BCol: typeof import('bootstrap-vue-next')['BCol'] + BCollapse: typeof import('bootstrap-vue-next')['BCollapse'] + BContainer: typeof import('bootstrap-vue-next')['BContainer'] + BForm: typeof import('bootstrap-vue-next')['BForm'] + BFormCheckbox: typeof import('bootstrap-vue-next')['BFormCheckbox'] + BFormGroup: typeof import('bootstrap-vue-next')['BFormGroup'] + BFormInput: typeof import('bootstrap-vue-next')['BFormInput'] + BFormRadioGroup: typeof import('bootstrap-vue-next')['BFormRadioGroup'] + BFormSelect: typeof import('bootstrap-vue-next')['BFormSelect'] + BFormTextarea: typeof import('bootstrap-vue-next')['BFormTextarea'] + BInputGroup: typeof import('bootstrap-vue-next')['BInputGroup'] + 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'] + BPagination: typeof import('bootstrap-vue-next')['BPagination'] + BRow: typeof import('bootstrap-vue-next')['BRow'] + BTab: typeof import('bootstrap-vue-next')['BTab'] + BTable: typeof import('bootstrap-vue-next')['BTable'] + BTableLite: typeof import('bootstrap-vue-next')['BTableLite'] + BTableSimple: typeof import('bootstrap-vue-next')['BTableSimple'] + BTabs: typeof import('bootstrap-vue-next')['BTabs'] + BTbody: typeof import('bootstrap-vue-next')['BTbody'] + BTd: typeof import('bootstrap-vue-next')['BTd'] + BTh: typeof import('bootstrap-vue-next')['BTh'] + BThead: typeof import('bootstrap-vue-next')['BThead'] + BToastOrchestrator: typeof import('bootstrap-vue-next')['BToastOrchestrator'] + BTooltip: typeof import('bootstrap-vue-next')['BTooltip'] + BTr: typeof import('bootstrap-vue-next')['BTr'] + ChangeUserRoleFormular: typeof import('./src/components/ChangeUserRoleFormular.vue')['default'] + CommunityVisualizeItem: typeof import('./src/components/Federation/CommunityVisualizeItem.vue')['default'] + ConfirmRegisterMailFormular: typeof import('./src/components/ConfirmRegisterMailFormular.vue')['default'] + ContentFooter: typeof import('./src/components/ContentFooter.vue')['default'] + ContributionLink: typeof import('./src/components/ContributionLink/ContributionLink.vue')['default'] + ContributionLinkForm: typeof import('./src/components/ContributionLink/ContributionLinkForm.vue')['default'] + ContributionLinkList: typeof import('./src/components/ContributionLink/ContributionLinkList.vue')['default'] + ContributionMessagesFormular: typeof import('./src/components/ContributionMessages/ContributionMessagesFormular.vue')['default'] + ContributionMessagesList: typeof import('./src/components/ContributionMessages/ContributionMessagesList.vue')['default'] + ContributionMessagesListItem: typeof import('./src/components/ContributionMessages/slots/ContributionMessagesListItem.vue')['default'] + Coordinates: typeof import('./src/components/input/Coordinates.vue')['default'] + CreationFormular: typeof import('./src/components/CreationFormular.vue')['default'] + CreationTransactionList: typeof import('./src/components/CreationTransactionList.vue')['default'] + DeletedUserFormular: typeof import('./src/components/DeletedUserFormular.vue')['default'] + EditableGroup: typeof import('./src/components/input/EditableGroup.vue')['default'] + EditableGroupableLabel: typeof import('./src/components/input/EditableGroupableLabel.vue')['default'] + EditCreationFormular: typeof import('./src/components/EditCreationFormular.vue')['default'] + FederationVisualizeItem: typeof import('./src/components/Federation/FederationVisualizeItem.vue')['default'] + FigureQrCode: typeof import('./src/components/FigureQrCode.vue')['default'] + IBiArrowClockwise: typeof import('~icons/bi/arrow-clockwise')['default'] + IBiBellFill: typeof import('~icons/bi/bell-fill')['default'] + IBiChatDots: typeof import('~icons/bi/chat-dots')['default'] + IBiCheck: typeof import('~icons/bi/check')['default'] + IBiEnvelope: typeof import('~icons/bi/envelope')['default'] + IBiExclamationCircleFill: typeof import('~icons/bi/exclamation-circle-fill')['default'] + IBiEye: typeof import('~icons/bi/eye')['default'] + IBiList: typeof import('~icons/bi/list')['default'] + IBiPencil: typeof import('~icons/bi/pencil')['default'] + IBiPencilFill: typeof import('~icons/bi/pencil-fill')['default'] + IBiPencilSquare: typeof import('~icons/bi/pencil-square')['default'] + IBiQuestionDiamond: typeof import('~icons/bi/question-diamond')['default'] + IBiQuestionSquare: typeof import('~icons/bi/question-square')['default'] + IBiTrash: typeof import('~icons/bi/trash')['default'] + IBiX: typeof import('~icons/bi/x')['default'] + IBiXCircle: typeof import('~icons/bi/x-circle')['default'] + IIcBaselineClose: typeof import('~icons/ic/baseline-close')['default'] + IPhCaretDown: typeof import('~icons/ph/caret-down')['default'] + IPhCaretUpFill: typeof import('~icons/ph/caret-up-fill')['default'] + NavBar: typeof import('./src/components/NavBar.vue')['default'] + NotFoundPage: typeof import('./src/components/NotFoundPage.vue')['default'] + OpenCreationsTable: typeof import('./src/components/Tables/OpenCreationsTable.vue')['default'] + Overlay: typeof import('./src/components/Overlay.vue')['default'] + ParseMessage: typeof import('./src/components/ContributionMessages/ParseMessage.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + RowDetails: typeof import('./src/components/RowDetails.vue')['default'] + SearchUserTable: typeof import('./src/components/Tables/SearchUserTable.vue')['default'] + StatisticTable: typeof import('./src/components/Tables/StatisticTable.vue')['default'] + TimePicker: typeof import('./src/components/input/TimePicker.vue')['default'] + TransactionLinkList: typeof import('./src/components/TransactionLinkList.vue')['default'] + UserQuery: typeof import('./src/components/UserQuery.vue')['default'] + } + export interface ComponentCustomProperties { + vBModal: typeof import('bootstrap-vue-next')['vBModal'] + vBToggle: typeof import('bootstrap-vue-next')['vBToggle'] + vBTooltip: typeof import('bootstrap-vue-next')['vBTooltip'] + } +} diff --git a/admin/index.html b/admin/index.html new file mode 100644 index 000000000..ea9683c98 --- /dev/null +++ b/admin/index.html @@ -0,0 +1,21 @@ + + +
+ + + + +{{ $t('contributionLink.contributionLinks') }}
- - {{ $t('no_hashtag') }} + + {{ $t('no_hashtag') }}
-
-
-
+
+
+
{{ $t('hide_resubmission') }}
{{ $t(overlayQuestion) }}