diff --git a/www/webapp/.eslintignore b/www/webapp/.eslintignore new file mode 100644 index 000000000..1d085cacc --- /dev/null +++ b/www/webapp/.eslintignore @@ -0,0 +1 @@ +** diff --git a/www/webapp/.eslintrc.js b/www/webapp/.eslintrc.js index 171b20c3d..d8a4b758f 100644 --- a/www/webapp/.eslintrc.js +++ b/www/webapp/.eslintrc.js @@ -5,9 +5,8 @@ module.exports = { node: true }, extends: [ - 'plugin:vue/essential', - // 'plugin:vue/strongly-recommended', - // 'plugin:vue/recommended', + 'plugin:vue/base', + 'plugin:vuetify/base', 'eslint:recommended' ], rules: { diff --git a/www/webapp/package.json b/www/webapp/package.json index 48a0f5447..f1662d964 100644 --- a/www/webapp/package.json +++ b/www/webapp/package.json @@ -11,16 +11,16 @@ "dependencies": { "@fontsource/roboto": "^4.5.8", "@mdi/font": "^6.9.96", + "@vue/compiler-sfc": "^3.2.47", "axios": "^0.27.2", "core-js": "^3.27.1", - "javascript-time-ago": "^2.5.9", "pinia": "^2.0.30", - "vue": "~2.7.14", - "vue-clipboard2": "^0.3.3", - "vue-router": "~3.6.5", - "vue-timeago": "^5.1.3", + "vue": "^3.2.47", + "vue-router": "^4.1.6", + "vue-timeago3": "^2.3.0", "vuelidate": "^0.7.7", - "vuetify": "^2.6.13" + "vuetify": "^3.1.8", + "webpack-plugin-vuetify": "^2.0.1" }, "devDependencies": { "@babel/eslint-parser": "^7.19.1", @@ -30,10 +30,9 @@ "@vue/cli-service": "^5.0.8", "eslint": "^8.31.0", "eslint-plugin-vue": "^9.8.0", + "eslint-plugin-vuetify": "^2.0.0-beta.2", "sass": "~1.32.13", "sass-loader": "^13.2.0", - "vue-cli-plugin-vuetify": "^2.5.8", - "vue-template-compiler": "^2.7.14", - "vuetify-loader": "~1.9.1" + "vue-demi": "^0.13.11" } } diff --git a/www/webapp/src/App.vue b/www/webapp/src/App.vue index 719eeea01..1dfa5ec3f 100644 --- a/www/webapp/src/App.vue +++ b/www/webapp/src/App.vue @@ -3,7 +3,7 @@ @@ -19,14 +19,14 @@ {{item.text}} - {{item.post_icon}} + {{item.post_icon}} - + {{item.text}} - {{item.post_icon}} + {{item.post_icon}} - Create Account - Log In - Log Out + Create Account + Log In + Log Out diff --git a/www/webapp/src/components/Field/GenericText.vue b/www/webapp/src/components/Field/GenericText.vue index 926d7d0c5..5dc9d8b35 100644 --- a/www/webapp/src/components/Field/GenericText.vue +++ b/www/webapp/src/components/Field/GenericText.vue @@ -3,15 +3,15 @@ :label="label" :disabled="disabled || readonly" :error-messages="errorMessages" - :value="value" + :model-value="value" :type="type || ''" :placeholder="placeholder || (required ? '' : '(optional)')" :hint="hint" persistent-hint :required="required" :rules="[v => !required || !!v || 'Required.'].concat(rules)" - @input="changed('input', $event)" - @input.native="$emit('dirty', $event)" + @update:model-value="changed('input', $event)" + @update:model-value.native="$emit('dirty', $event)" @keyup="changed('keyup', $event)" /> diff --git a/www/webapp/src/components/Field/GenericTextarea.vue b/www/webapp/src/components/Field/GenericTextarea.vue index 56818c060..ca5464f71 100644 --- a/www/webapp/src/components/Field/GenericTextarea.vue +++ b/www/webapp/src/components/Field/GenericTextarea.vue @@ -3,15 +3,15 @@ :label="label" :disabled="disabled || readonly" :error-messages="errorMessages" - :value="value" + :model-value="value" :type="type || ''" :placeholder="required ? '' : '(optional)'" :hint="hint" persistent-hint :required="required" :rules="[v => !required || !!v || 'Required.'].concat(rules)" - @input="changed('input', $event)" - @input.native="$emit('dirty', $event)" + @update:model-value="changed('input', $event)" + @update:model-value.native="$emit('dirty', $event)" @keyup="changed('keyup', $event)" dense rows="8" diff --git a/www/webapp/src/components/Field/RRSetType.vue b/www/webapp/src/components/Field/RRSetType.vue index 8c0773ef9..28a8bf3c4 100644 --- a/www/webapp/src/components/Field/RRSetType.vue +++ b/www/webapp/src/components/Field/RRSetType.vue @@ -5,11 +5,11 @@ :error-messages="errorMessages" hint="You can also enter other types. For a full list, check the documentation." :persistent-hint="!readonly" - :value="value" + :model-value="value" :items="types" :required="required" :rules="[v => !required || !!v || 'Required.']" - @input="input($event)" + @update:model-value="input($event)" /> diff --git a/www/webapp/src/components/Field/Record.vue b/www/webapp/src/components/Field/Record.vue index d496bd14f..6bba58c80 100644 --- a/www/webapp/src/components/Field/Record.vue +++ b/www/webapp/src/components/Field/Record.vue @@ -19,7 +19,7 @@ :style="{ width: fieldWidth(index) }" :append-icon="index == fields.length-1 && !readonly && !disabled ? appendIcon : ''" @click:append="$emit('remove', $event)" - @input="inputHandler()" + @update:model-value="inputHandler()" @paste.prevent="pasteHandler($event)" @keydown.8="backspaceHandler(index, $event)" @keydown.32="spaceHandler(index, $event)" diff --git a/www/webapp/src/components/Field/RecordList.vue b/www/webapp/src/components/Field/RecordList.vue index 8bf2114b7..4c7323ea4 100644 --- a/www/webapp/src/components/Field/RecordList.vue +++ b/www/webapp/src/components/Field/RecordList.vue @@ -21,8 +21,8 @@ @click="addHandler" class="px-0 text-none" color="grey" - small - text + size="small" + variant="text" v-if="!readonly && !disabled" >mdi-plus add another value diff --git a/www/webapp/src/components/Field/Switchbox.vue b/www/webapp/src/components/Field/Switchbox.vue index bcb8b9bce..746cb94cc 100644 --- a/www/webapp/src/components/Field/Switchbox.vue +++ b/www/webapp/src/components/Field/Switchbox.vue @@ -6,7 +6,7 @@ :input-value="value" :required="required" :rules="[v => !required || !!v || 'Required.']" - @change="change" + @update:model-value="change" /> diff --git a/www/webapp/src/components/Field/TTL.vue b/www/webapp/src/components/Field/TTL.vue index c91d38c31..daa0f0791 100644 --- a/www/webapp/src/components/Field/TTL.vue +++ b/www/webapp/src/components/Field/TTL.vue @@ -3,15 +3,15 @@ :label="label" :disabled="disabled || readonly" :error-messages="errorMessages" - :value="value" + :model-value="value" type="number" max="86400" :min="min" :placeholder="required ? '' : '(optional)'" :required="required" :rules="rules" - @input="changed('input', $event)" - @input.native="$emit('dirty', $event)" + @update:model-value="changed('input', $event)" + @update:model-value.native="$emit('dirty', $event)" @keyup="changed('keyup', $event)" /> diff --git a/www/webapp/src/components/ResetPasswordActionHandler.vue b/www/webapp/src/components/ResetPasswordActionHandler.vue index d0ea9f122..f5ec5e0cf 100644 --- a/www/webapp/src/components/ResetPasswordActionHandler.vue +++ b/www/webapp/src/components/ResetPasswordActionHandler.vue @@ -15,7 +15,7 @@ tabindex="1" > h(App) -}).$mount('#app') +createApp(App) +.use(vuetify) +.use(timeago) +.use(pinia) +.use(router) +.mount('#app') diff --git a/www/webapp/src/router/index.js b/www/webapp/src/router/index.js index 316c25458..02e360143 100644 --- a/www/webapp/src/router/index.js +++ b/www/webapp/src/router/index.js @@ -1,4 +1,4 @@ -import VueRouter from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' import Home from '@/views/Home.vue' import {HTTP} from '@/utils'; import {useUserStore} from "@/store/user"; @@ -35,12 +35,12 @@ const routes = [ component: () => import(/* webpackChunkName: "signup" */ '@/views/Welcome.vue') }, { - path: 'https://desec.readthedocs.io/', + path: '/desec.readthedocs.io/', // TODO name: 'docs', beforeEnter(to) { location.href = to.path }, }, { - path: 'https://talk.desec.io/', + path: '/talk.desec.io/', // TODO name: 'talk', beforeEnter(to) { location.href = to.path }, }, @@ -90,7 +90,7 @@ const routes = [ component: () => import(/* webpackChunkName: "extra" */ '@/views/Donate.vue') }, { - path: 'https://github.com/desec-io/desec-stack/projects?query=is%3Aopen+sort%3Aname-asc&type=classic', + path: '/github.com/desec-io/desec-stack/projects?query=is%3Aopen+sort%3Aname-asc&type=classic', name: 'roadmap', beforeEnter(to) { location.href = to.path }, }, @@ -139,8 +139,9 @@ const routes = [ }, ] -const router = new VueRouter({ +const router = createRouter({ mode: 'history', + history: createWebHistory(), base: process.env.BASE_URL, scrollBehavior (to, from) { // Skip if destination full path has query parameters and differs in no other way from previous diff --git a/www/webapp/src/views/About.vue b/www/webapp/src/views/About.vue index 9b608a60c..23a87bf08 100644 --- a/www/webapp/src/views/About.vue +++ b/www/webapp/src/views/About.vue @@ -1,6 +1,6 @@