Use Popper for proper dropdown placement

This commit is contained in:
Nassim Jahnke 2022-07-26 20:10:22 +02:00
parent 9e442802e1
commit 8f5f0d1137
No known key found for this signature in database
GPG Key ID: 6BE3B555EBC5982B
7 changed files with 191 additions and 84 deletions

View File

@ -23,6 +23,7 @@
"@nuxt/devalue": "2.0.0",
"@vuelidate/core": "2.0.0-alpha.43",
"@vuelidate/validators": "2.0.0-alpha.31",
"@vueuse/components": "^9.0.0",
"@vueuse/core": "8.9.4",
"@vueuse/head": "0.7.7",
"@vueuse/integrations": "8.9.4",

View File

@ -26,6 +26,7 @@ specifiers:
'@vue/server-renderer': 3.2.37
'@vuelidate/core': 2.0.0-alpha.43
'@vuelidate/validators': 2.0.0-alpha.31
'@vueuse/components': ^9.0.0
'@vueuse/core': 8.9.4
'@vueuse/head': 0.7.7
'@vueuse/integrations': 8.9.4
@ -82,6 +83,7 @@ dependencies:
'@nuxt/devalue': 2.0.0
'@vuelidate/core': 2.0.0-alpha.43_vue@3.2.37
'@vuelidate/validators': 2.0.0-alpha.31_vue@3.2.37
'@vueuse/components': 9.0.0_vue@3.2.37
'@vueuse/core': 8.9.4_vue@3.2.37
'@vueuse/head': 0.7.7_vue@3.2.37
'@vueuse/integrations': 8.9.4_uazzj6p5k6n3yf2qshrw6iyibq
@ -1436,12 +1438,14 @@ packages:
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/vue-devtools': 9.1.10
dev: false
/@intlify/devtools-if/9.1.10:
resolution: {integrity: sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/shared': 9.1.10
dev: false
/@intlify/message-compiler/9.1.10:
resolution: {integrity: sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==}
@ -1450,6 +1454,7 @@ packages:
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
source-map: 0.6.1
dev: false
/@intlify/message-compiler/9.2.0-beta.40:
resolution: {integrity: sha512-6QWTSYewmkew4nsRqgkwTVuGFKzxVCOK8EXsPt15N+tN1g+OYjC3PfGA2dPB6cVkNxqA9mV/hNK02uHPWU9t0A==}
@ -1462,6 +1467,7 @@ packages:
/@intlify/message-resolver/9.1.10:
resolution: {integrity: sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==}
engines: {node: '>= 10'}
dev: false
/@intlify/runtime/9.1.10:
resolution: {integrity: sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==}
@ -1470,10 +1476,12 @@ packages:
'@intlify/message-compiler': 9.1.10
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
dev: false
/@intlify/shared/9.1.10:
resolution: {integrity: sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==}
engines: {node: '>= 10'}
dev: false
/@intlify/shared/9.2.0-beta.40:
resolution: {integrity: sha512-xWz+SFjgt/LfaSbbHVn+V7gmvX4ZNP3cIFta790GWZ/tEgwJeC3tkV7i45iUbZ4ZimOerFgKH05b7qvJlKb6RQ==}
@ -1514,6 +1522,7 @@ packages:
'@intlify/message-resolver': 9.1.10
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
dev: false
/@jridgewell/resolve-uri/3.0.5:
resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==}
@ -1759,6 +1768,11 @@ packages:
/@types/web-bluetooth/0.0.14:
resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==}
dev: false
/@types/web-bluetooth/0.0.15:
resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==}
dev: false
/@typescript-eslint/eslint-plugin/5.16.0_5pzjkl4saaffga3ffx5zj3qjzy:
resolution: {integrity: sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw==}
@ -1895,6 +1909,7 @@ packages:
dependencies:
vite: 2.9.14_sass@1.54.0
vue: 3.2.37
dev: true
/@vue/compiler-core/3.2.37:
resolution: {integrity: sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==}
@ -1932,6 +1947,7 @@ packages:
/@vue/devtools-api/6.1.4:
resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==}
dev: false
/@vue/devtools-api/6.2.1:
resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==}
@ -1971,12 +1987,14 @@ packages:
resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==}
dependencies:
'@vue/shared': 3.2.37
dev: false
/@vue/runtime-core/3.2.37:
resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==}
dependencies:
'@vue/reactivity': 3.2.37
'@vue/shared': 3.2.37
dev: false
/@vue/runtime-dom/3.2.37:
resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
@ -1984,6 +2002,7 @@ packages:
'@vue/runtime-core': 3.2.37
'@vue/shared': 3.2.37
csstype: 2.6.20
dev: false
/@vue/server-renderer/3.2.37_vue@3.2.37:
resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
@ -2015,6 +2034,17 @@ packages:
- vue
dev: false
/@vueuse/components/9.0.0_vue@3.2.37:
resolution: {integrity: sha512-InXmxY31t45LjwleSXzE++ZQIJLgqpnbvc5kcWdtFEsU/XVe7RLZOqfb4Li69BaJIqXWQgX71IAqIyYPSoe8WA==}
dependencies:
'@vueuse/core': 9.0.0_vue@3.2.37
'@vueuse/shared': 9.0.0_vue@3.2.37
vue-demi: 0.13.5_vue@3.2.37
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/core/8.9.4_vue@3.2.37:
resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==}
peerDependencies:
@ -2031,6 +2061,19 @@ packages:
'@vueuse/shared': 8.9.4_vue@3.2.37
vue: 3.2.37
vue-demi: 0.12.4_vue@3.2.37
dev: false
/@vueuse/core/9.0.0_vue@3.2.37:
resolution: {integrity: sha512-hMMc2ajuVknkL7Z39JdP9gFFND2OgnDTSS5mmuinWGAE1Vxy1AwDvTHm3+juyk+GzJjYRAktnBIPy7Fq53iOnw==}
dependencies:
'@types/web-bluetooth': 0.0.15
'@vueuse/metadata': 9.0.0
'@vueuse/shared': 9.0.0_vue@3.2.37
vue-demi: 0.13.5_vue@3.2.37
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/head/0.7.7_vue@3.2.37:
resolution: {integrity: sha512-umsupiMPYxSMvREskQhcwhQ8zpnv8u1oKSB3Q1gclhsV53XAMTurkX+vPE4aBmGulHI1XEZp3N5ctEABEj3xqQ==}
@ -2089,6 +2132,11 @@ packages:
/@vueuse/metadata/8.9.4:
resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==}
dev: false
/@vueuse/metadata/9.0.0:
resolution: {integrity: sha512-79YVIsAP1bbWm5GdQuG7jDVF/9uuExzhkO0Sd4/TLuSfzH2uZOrHvGwy+ZNJHjbyRn3uf56rKINWLJdBuTLSqQ==}
dev: false
/@vueuse/shared/8.9.4_vue@3.2.37:
resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==}
@ -2103,6 +2151,16 @@ packages:
dependencies:
vue: 3.2.37
vue-demi: 0.13.5_vue@3.2.37
dev: false
/@vueuse/shared/9.0.0_vue@3.2.37:
resolution: {integrity: sha512-WRCyr/wIz5e/2gR/+qFucbCUcGMyJKkQZAzlECl3e71ebQQ9X/w3aBWT9FbnogJX+DNZ/t3Pj+TqPbC7TH1Yog==}
dependencies:
vue-demi: 0.13.5_vue@3.2.37
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@windicss/config/1.8.7:
resolution: {integrity: sha512-8n+/Y36j5L3rw2tgMdLjeGRuNV7VYfKoHoraLK6Bk9OJ1MTPd5vv7pekof/uOPWVV7WWjVeZ6CTO8SDbDDW3iw==}
@ -2232,6 +2290,7 @@ packages:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
dev: true
/argparse/1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@ -2349,6 +2408,7 @@ packages:
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
dev: true
/boolbase/1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@ -2372,6 +2432,7 @@ packages:
engines: {node: '>=8'}
dependencies:
fill-range: 7.0.1
dev: true
/browserslist/4.20.2:
resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==}
@ -2447,6 +2508,7 @@ packages:
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/ci-info/3.3.2:
resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==}
@ -2599,6 +2661,7 @@ packages:
/csstype/2.6.20:
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
dev: false
/data-uri-to-buffer/4.0.0:
resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
@ -2815,6 +2878,7 @@ packages:
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/esbuild-android-arm64/0.14.34:
@ -2823,6 +2887,7 @@ packages:
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/esbuild-darwin-64/0.14.34:
@ -2831,6 +2896,7 @@ packages:
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/esbuild-darwin-arm64/0.14.34:
@ -2839,6 +2905,7 @@ packages:
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/esbuild-freebsd-64/0.14.34:
@ -2847,6 +2914,7 @@ packages:
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/esbuild-freebsd-arm64/0.14.34:
@ -2855,6 +2923,7 @@ packages:
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-32/0.14.34:
@ -2863,6 +2932,7 @@ packages:
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-64/0.14.34:
@ -2871,6 +2941,7 @@ packages:
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-arm/0.14.34:
@ -2879,6 +2950,7 @@ packages:
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-arm64/0.14.34:
@ -2887,6 +2959,7 @@ packages:
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-mips64le/0.14.34:
@ -2895,6 +2968,7 @@ packages:
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-ppc64le/0.14.34:
@ -2903,6 +2977,7 @@ packages:
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-riscv64/0.14.34:
@ -2911,6 +2986,7 @@ packages:
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-linux-s390x/0.14.34:
@ -2919,6 +2995,7 @@ packages:
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/esbuild-netbsd-64/0.14.34:
@ -2927,6 +3004,7 @@ packages:
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/esbuild-openbsd-64/0.14.34:
@ -2935,6 +3013,7 @@ packages:
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/esbuild-sunos-64/0.14.34:
@ -2943,6 +3022,7 @@ packages:
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-32/0.14.34:
@ -2951,6 +3031,7 @@ packages:
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-64/0.14.34:
@ -2959,6 +3040,7 @@ packages:
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild-windows-arm64/0.14.34:
@ -2967,6 +3049,7 @@ packages:
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/esbuild/0.14.34:
@ -2995,6 +3078,7 @@ packages:
esbuild-windows-32: 0.14.34
esbuild-windows-64: 0.14.34
esbuild-windows-arm64: 0.14.34
dev: true
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
@ -3468,6 +3552,7 @@ packages:
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
dev: true
/finalhandler/1.1.2:
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
@ -3570,6 +3655,7 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
/function-bind/1.1.1:
@ -3613,6 +3699,7 @@ packages:
engines: {node: '>= 6'}
dependencies:
is-glob: 4.0.3
dev: true
/glob-parent/6.0.2:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
@ -3732,6 +3819,7 @@ packages:
/immutable/4.0.0:
resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==}
dev: true
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
@ -3794,6 +3882,7 @@ packages:
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
dev: true
/is-boolean-object/1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
@ -3819,6 +3908,7 @@ packages:
resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
dependencies:
has: 1.0.3
dev: true
/is-date-object/1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
@ -3830,6 +3920,7 @@ packages:
/is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
dev: true
/is-fullwidth-code-point/3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
@ -3846,6 +3937,7 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
is-extglob: 2.1.1
dev: true
/is-map/2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
@ -3870,6 +3962,7 @@ packages:
/is-number/7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
dev: true
/is-obj/1.0.1:
resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
@ -4317,6 +4410,7 @@ packages:
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
dev: true
/natural-compare/1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@ -4368,6 +4462,7 @@ packages:
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
dev: true
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
@ -4589,6 +4684,7 @@ packages:
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/path-type/4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
@ -4672,6 +4768,7 @@ packages:
nanoid: 3.3.4
picocolors: 1.0.0
source-map-js: 1.0.2
dev: true
/prelude-ls/1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@ -4773,6 +4870,7 @@ packages:
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.1
dev: true
/regenerate-unicode-properties/10.0.1:
resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==}
@ -4852,6 +4950,7 @@ packages:
is-core-module: 2.9.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/resolve/1.22.1:
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
@ -4904,6 +5003,7 @@ packages:
hasBin: true
optionalDependencies:
fsevents: 2.3.2
dev: true
/rollup/2.76.0:
resolution: {integrity: sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==}
@ -4947,6 +5047,7 @@ packages:
chokidar: 3.5.3
immutable: 4.0.0
source-map-js: 1.0.2
dev: true
/scule/0.2.1:
resolution: {integrity: sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==}
@ -5228,6 +5329,7 @@ packages:
/supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
dev: true
/swagger-ui-dist/4.13.0:
resolution: {integrity: sha512-5yqhkUU9uV5oT/MTMBeSgDGI0Vx6eCOU43AszQBs88poI8OB1v+FoXEFHv+NaBbEfTkXCMWlAJrH6iWyDzLETQ==}
@ -5287,6 +5389,7 @@ packages:
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
dev: true
/tr46/0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
@ -5361,6 +5464,7 @@ packages:
resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
/ufo/0.8.5:
resolution: {integrity: sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==}
@ -5770,6 +5874,7 @@ packages:
sass: 1.54.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/vue-advanced-cropper/2.8.3_vue@3.2.37:
resolution: {integrity: sha512-KyOm4sGMkaCMEfGCTWi3vuKZd4nhT+nWWUr9HfyA7Qvg3XYsfXWYeMeVT1mBBqlVGbYKMcPTGvdcBq1CXvFRWg==}
@ -5796,6 +5901,7 @@ packages:
optional: true
dependencies:
vue: 3.2.37
dev: false
/vue-demi/0.13.5_vue@3.2.37:
resolution: {integrity: sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==}
@ -5810,6 +5916,7 @@ packages:
optional: true
dependencies:
vue: 3.2.37
dev: false
/vue-eslint-parser/9.0.3_eslint@8.20.0:
resolution: {integrity: sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==}
@ -5840,6 +5947,7 @@ packages:
'@intlify/vue-devtools': 9.1.10
'@vue/devtools-api': 6.1.4
vue: 3.2.37
dev: false
/vue-router/4.1.2_vue@3.2.37:
resolution: {integrity: sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==}
@ -5848,6 +5956,7 @@ packages:
dependencies:
'@vue/devtools-api': 6.1.4
vue: 3.2.37
dev: false
/vue/3.2.37:
resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==}
@ -5857,6 +5966,7 @@ packages:
'@vue/runtime-dom': 3.2.37
'@vue/server-renderer': 3.2.37_vue@3.2.37
'@vue/shared': 3.2.37
dev: false
/vue3-popper/1.5.0_vue@3.2.37:
resolution: {integrity: sha512-xaEnx90YBnlSg5G2yWqm2DHWHg+DB99UVRp4VsyTF0QLXyHrqSuE1Xo5+sG0AQq/lBcrGMlk5NU5xE2MDLKViw==}

View File

@ -5,7 +5,7 @@ import { useSettingsStore } from "~/store/settings";
import Announcement from "~/components/Announcement.vue";
import DropdownButton from "~/lib/components/design/DropdownButton.vue";
import DropdownItem from "~/lib/components/design/DropdownItem.vue";
import PopoverItem from "~/lib/components/design/PopoverItem.vue";
import Popper from "~/lib/components/design/Popper.vue";
import hangarLogo from "~/lib/assets/hangar-logo.svg";
@ -252,98 +252,94 @@ function isRecent(date: string): boolean {
<icon-mdi-white-balance-sunny v-else class="text-[1.2em]"></icon-mdi-white-balance-sunny>
</button>
<div v-if="authStore.user">
<Popover v-slot="{ close }" class="relative inline-block text-left">
<PopoverButton>
<div class="flex items-center gap-2 rounded-md p-2 hover:(text-primary-400 bg-primary-0)">
<IconMdiBellOutline v-if="unreadNotifications === 0" class="text-[1.2em]" />
<IconMdiBellBadge v-if="unreadNotifications !== 0" class="text-[1.2em]" />
</div>
</PopoverButton>
<PopoverPanel
class="absolute flex flex-col mt-1 z-10 rounded border-t-2 border-primary-400 background-default filter drop-shadow-md overflow-auto right-0 w-135 max-w-72vw"
>
<div v-if="notifications.length === 0">
<span class="flex shadow-0 p-2 mt-2 ml-3 mr-2">{{ i18n.t("notifications.empty.recent") }}</span>
</div>
<div
v-for="notification in notifications"
v-else
:key="notification.id"
:class="'text-sm flex shadow-0 p-3 pt-2 pr-4 inline-flex items-center ' + (!notification.read ? 'bg-blue-100 dark:bg-slate-700' : '')"
@click="close()"
>
<span class="text-lg mr-2">
<IconMdiInformationOutline v-if="notification.type === 'info'" class="text-sky-600" />
<IconMdiCheck v-else-if="notification.type === 'success'" class="text-lime-600" />
<IconMdiAlertOutline v-else-if="notification.type === 'warning'" class="text-red-600" />
<IconMdiMessageOutline v-else-if="notification.type === 'neutral'" />
</span>
<Popper>
<div class="flex items-center gap-2 rounded-md p-2 hover:(text-primary-400 bg-primary-0)">
<IconMdiBellOutline v-if="unreadNotifications === 0" class="text-[1.2em]" />
<IconMdiBellBadge v-if="unreadNotifications !== 0" class="text-[1.2em]" />
</div>
<template #content="{ close }">
<div class="flex flex-col rounded border-t-2 border-primary-400 background-default filter drop-shadow-md overflow-auto max-w-150">
<div v-if="notifications.length === 0">
<span class="flex shadow-0 p-2 mt-2 ml-3 mr-2">{{ i18n.t("notifications.empty.recent") }}</span>
</div>
<div
v-for="notification in notifications"
v-else
:key="notification.id"
:class="'text-sm flex shadow-0 p-3 pt-2 pr-4 inline-flex items-center ' + (!notification.read ? 'bg-blue-100 dark:bg-slate-700' : '')"
@click="close()"
>
<span class="text-lg mr-2">
<IconMdiInformationOutline v-if="notification.type === 'info'" class="text-sky-600" />
<IconMdiCheck v-else-if="notification.type === 'success'" class="text-lime-600" />
<IconMdiAlertOutline v-else-if="notification.type === 'warning'" class="text-red-600" />
<IconMdiMessageOutline v-else-if="notification.type === 'neutral'" />
</span>
<router-link v-if="notification.action" :to="'/' + notification.action" active-class="" @click="markNotificationRead(notification)">
{{ i18n.t(notification.message[0], notification.message.slice(1)) }}
<div class="text-xs mt-1">{{ lastUpdated(new Date(notification.createdAt)) }}</div>
</router-link>
<div v-else>
{{ i18n.t(notification.message[0], notification.message.slice(1)) }}
<div class="text-xs mt-1">{{ lastUpdated(new Date(notification.createdAt)) }}</div>
<router-link v-if="notification.action" :to="'/' + notification.action" active-class="" @click="markNotificationRead(notification)">
{{ i18n.t(notification.message[0], notification.message.slice(1)) }}
<div class="text-xs mt-1">{{ lastUpdated(new Date(notification.createdAt)) }}</div>
</router-link>
<div v-else>
{{ i18n.t(notification.message[0], notification.message.slice(1)) }}
<div class="text-xs mt-1">{{ lastUpdated(new Date(notification.createdAt)) }}</div>
</div>
</div>
<div class="p-2 mb-1 ml-2 space-x-3 text-sm">
<Link to="/notifications" @click="close()">
<span :class="loadedUnreadNotifications >= unreadNotifications ? 'font-normal' : ''">
{{
loadedUnreadNotifications >= unreadNotifications
? i18n.t("notifications.viewAll")
: i18n.t("notifications.viewMoreUnread", [unreadNotifications - loadedUnreadNotifications])
}}
</span>
</Link>
<span v-if="loadedUnreadNotifications !== 0" class="color-primary hover:(underline)" @click="markNotificationsRead">
{{ i18n.t("notifications.markAsRead") }}
</span>
</div>
</div>
<div class="p-2 mb-1 ml-2 space-x-3 text-sm">
<Link to="/notifications" @click="close()">
<span :class="loadedUnreadNotifications >= unreadNotifications ? 'font-normal' : ''">
{{
loadedUnreadNotifications >= unreadNotifications
? i18n.t("notifications.viewAll")
: i18n.t("notifications.viewMoreUnread", [unreadNotifications - loadedUnreadNotifications])
}}
</span>
</Link>
<span v-if="loadedUnreadNotifications !== 0" class="color-primary hover:(underline)" @click="markNotificationsRead">
{{ i18n.t("notifications.markAsRead") }}
</span>
</div>
</PopoverPanel>
</Popover>
</template>
</Popper>
</div>
<!-- Profile dropdown -->
<div v-if="authStore.user">
<Popover v-slot="{ close }" class="relative inline-block text-left">
<PopoverButton>
<div class="flex items-center gap-2 rounded-md p-2 hover:(text-primary-400 bg-primary-0)">
<UserAvatar :username="authStore.user.name" size="xs" :background="false" :disable-link="true" />
{{ authStore.user.name }}
</div>
</PopoverButton>
<PopoverPanel class="absolute mt-1 z-10 right-0 w-48">
<Popper>
<div class="flex items-center gap-2 rounded-md p-2 hover:(text-primary-400 bg-primary-0)">
<UserAvatar :username="authStore.user.name" size="xs" :background="false" :disable-link="true" />
{{ authStore.user.name }}
</div>
<template #content="{ close }">
<div class="py-1 rounded border-t-2 border-primary-400 background-default filter drop-shadow-md flex flex-col" @click="close()">
<PopoverItem :to="'/' + authStore.user.name">{{ t("nav.user.profile") }}</PopoverItem>
<PopoverItem to="/notifications">{{ t("nav.user.notifications") }}</PopoverItem>
<PopoverItem :to="'/' + authStore.user.name + '/settings/api-keys'">{{ t("nav.user.apiKeys") }}</PopoverItem>
<PopoverItem :href="authHost + '/account/settings'">{{ t("nav.user.settings") }}</PopoverItem>
<DropdownItem :to="'/' + authStore.user.name">{{ t("nav.user.profile") }}</DropdownItem>
<DropdownItem to="/notifications">{{ t("nav.user.notifications") }}</DropdownItem>
<DropdownItem :to="'/' + authStore.user.name + '/settings/api-keys'">{{ t("nav.user.apiKeys") }}</DropdownItem>
<DropdownItem :href="authHost + '/account/settings'">{{ t("nav.user.settings") }}</DropdownItem>
<hr />
<PopoverItem v-if="hasPerms(NamedPermission.MOD_NOTES_AND_FLAGS)" to="/admin/flags">
<DropdownItem v-if="hasPerms(NamedPermission.MOD_NOTES_AND_FLAGS)" to="/admin/flags">
{{ t("nav.user.flags") }}
<span v-if="reportQueue !== 0">{{ "(" + reportQueue + ")" }}</span>
</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.MOD_NOTES_AND_FLAGS)" to="/admin/approval/projects">
</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.MOD_NOTES_AND_FLAGS)" to="/admin/approval/projects">
{{ t("nav.user.projectApprovals") }}
<span v-if="projectApprovalQueue !== 0">{{ "(" + projectApprovalQueue + ")" }}</span>
</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.REVIEWER)" to="/admin/approval/versions">
</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.REVIEWER)" to="/admin/approval/versions">
{{ t("nav.user.versionApprovals") }}
<span v-if="versionApprovalQueue !== 0">{{ "(" + versionApprovalQueue + ")" }}</span>
</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.VIEW_STATS)" to="/admin/stats">{{ t("nav.user.stats") }}</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.VIEW_HEALTH)" to="/admin/health">{{ t("nav.user.health") }}</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.VIEW_LOGS)" to="/admin/log">{{ t("nav.user.log") }}</PopoverItem>
<PopoverItem v-if="hasPerms(NamedPermission.MANUAL_VALUE_CHANGES)" to="/admin/versions">
</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.VIEW_STATS)" to="/admin/stats">{{ t("nav.user.stats") }}</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.VIEW_HEALTH)" to="/admin/health">{{ t("nav.user.health") }}</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.VIEW_LOGS)" to="/admin/log">{{ t("nav.user.log") }}</DropdownItem>
<DropdownItem v-if="hasPerms(NamedPermission.MANUAL_VALUE_CHANGES)" to="/admin/versions">
{{ t("nav.user.platformVersions") }}
</PopoverItem>
</DropdownItem>
<hr />
<PopoverItem @click="auth.logout()">{{ t("nav.user.logout") }}</PopoverItem>
<DropdownItem @click="auth.logout()">{{ t("nav.user.logout") }}</DropdownItem>
</div>
</PopoverPanel>
</Popover>
</template>
</Popper>
</div>
<!-- Login/register buttons -->

View File

@ -8,7 +8,6 @@ import DropdownButton from "~/lib/components/design/DropdownButton.vue";
import { useBackendDataStore } from "~/store/backendData";
import DropdownItem from "~/lib/components/design/DropdownItem.vue";
import PlatformLogo from "~/components/logos/platforms/PlatformLogo.vue";
import Popper from "~/lib/components/design/Popper.vue";
const i18n = useI18n();
const backendData = useBackendDataStore();

@ -1 +1 @@
Subproject commit a1be645d309a529e9b8155c9d9659b0e411be14d
Subproject commit 48ffcdb12e6f45676e8d050b1c343a8aafe646b7

View File

@ -175,9 +175,11 @@ async function restoreVersion() {
<IconMdiAlertCircleOutline class="text-2xl" />
</Tooltip>
<DropdownButton v-if="versionPlatforms.size > 1" class="inline" :name="platform?.name" button-size="large">
<DropdownItem v-for="plat in versionPlatforms" :key="plat" :to="plat.toLowerCase()" @click="setPlatform(plat)">
{{ backendData.platforms?.get(plat)?.name }}
</DropdownItem>
<template #default="{ close }">
<DropdownItem v-for="plat in versionPlatforms" :key="plat" :to="plat.toLowerCase()" @click="setPlatform(plat) || close()">
{{ backendData.platforms?.get(plat)?.name }}
</DropdownItem>
</template>
</DropdownButton>
<DownloadButton :version="projectVersion" :project="project" :platform="p" />
</div>

View File

@ -136,10 +136,9 @@ public class HangarUserController extends HangarComponent {
userTable.setTheme(settings.getTheme());
// TODO user action logging
userService.updateUser(userTable);
try {
if (config.sso.isEnabled()) {
userService.updateSSO(userTable.getUuid(), new Traits(null, userTable.getEmail(), null, null, settings.getLanguage(), userTable.getName(), null, settings.getTheme()));
} catch (Exception ex) {
logger.warn("SSO Sync failed", ex);
}
}