mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-05-07 14:56:06 +02:00
replace @element-plus/icons-vue
This commit is contained in:
Generated
+23
-30
@@ -12,7 +12,6 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@electron/rebuild": "^4.0.2",
|
"@electron/rebuild": "^4.0.2",
|
||||||
"@element-plus/icons-vue": "^2.3.2",
|
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.2",
|
||||||
"@fontsource-variable/inter": "^5.2.8",
|
"@fontsource-variable/inter": "^5.2.8",
|
||||||
"@fontsource-variable/noto-sans-jp": "^5.2.9",
|
"@fontsource-variable/noto-sans-jp": "^5.2.9",
|
||||||
@@ -106,6 +105,7 @@
|
|||||||
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
|
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.5",
|
"@babel/generator": "^7.28.5",
|
||||||
@@ -1263,7 +1263,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cross-dirname": "^0.1.0",
|
"cross-dirname": "^0.1.0",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
@@ -1285,7 +1284,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.0",
|
"graceful-fs": "^4.2.0",
|
||||||
"jsonfile": "^6.0.1",
|
"jsonfile": "^6.0.1",
|
||||||
@@ -1302,7 +1300,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"universalify": "^2.0.0"
|
"universalify": "^2.0.0"
|
||||||
},
|
},
|
||||||
@@ -1317,7 +1314,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.0.0"
|
"node": ">= 10.0.0"
|
||||||
}
|
}
|
||||||
@@ -5303,6 +5299,7 @@
|
|||||||
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
|
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/lodash": "*"
|
"@types/lodash": "*"
|
||||||
}
|
}
|
||||||
@@ -6047,6 +6044,7 @@
|
|||||||
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"acorn": "bin/acorn"
|
"acorn": "bin/acorn"
|
||||||
},
|
},
|
||||||
@@ -6080,6 +6078,7 @@
|
|||||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-deep-equal": "^3.1.1",
|
"fast-deep-equal": "^3.1.1",
|
||||||
"fast-json-stable-stringify": "^2.0.0",
|
"fast-json-stable-stringify": "^2.0.0",
|
||||||
@@ -6844,6 +6843,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.9.0",
|
"baseline-browser-mapping": "^2.9.0",
|
||||||
"caniuse-lite": "^1.0.30001759",
|
"caniuse-lite": "^1.0.30001759",
|
||||||
@@ -7792,8 +7792,7 @@
|
|||||||
"integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
|
"integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/cross-env": {
|
"node_modules/cross-env": {
|
||||||
"version": "10.1.0",
|
"version": "10.1.0",
|
||||||
@@ -8094,6 +8093,7 @@
|
|||||||
"integrity": "sha512-ce4Ogns4VMeisIuCSK0C62umG0lFy012jd8LMZ6w/veHUeX4fqfDrGe+HTWALAEwK6JwKP+dhPvizhArSOsFbg==",
|
"integrity": "sha512-ce4Ogns4VMeisIuCSK0C62umG0lFy012jd8LMZ6w/veHUeX4fqfDrGe+HTWALAEwK6JwKP+dhPvizhArSOsFbg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"app-builder-lib": "26.4.0",
|
"app-builder-lib": "26.4.0",
|
||||||
"builder-util": "26.3.4",
|
"builder-util": "26.3.4",
|
||||||
@@ -8498,7 +8498,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/asar": "^3.2.1",
|
"@electron/asar": "^3.2.1",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
@@ -8519,7 +8518,6 @@
|
|||||||
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
|
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.1.2",
|
"graceful-fs": "^4.1.2",
|
||||||
"jsonfile": "^4.0.0",
|
"jsonfile": "^4.0.0",
|
||||||
@@ -8677,7 +8675,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
|
||||||
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
|
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/embla-carousel-reactive-utils": {
|
"node_modules/embla-carousel-reactive-utils": {
|
||||||
"version": "8.6.0",
|
"version": "8.6.0",
|
||||||
@@ -8723,17 +8722,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/encoding": {
|
|
||||||
"version": "0.1.13",
|
|
||||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
|
|
||||||
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"optional": true,
|
|
||||||
"dependencies": {
|
|
||||||
"iconv-lite": "^0.6.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/end-of-stream": {
|
"node_modules/end-of-stream": {
|
||||||
"version": "1.4.5",
|
"version": "1.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
||||||
@@ -8862,6 +8850,7 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"esbuild": "bin/esbuild"
|
"esbuild": "bin/esbuild"
|
||||||
},
|
},
|
||||||
@@ -8941,6 +8930,7 @@
|
|||||||
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
|
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.8.0",
|
"@eslint-community/eslint-utils": "^4.8.0",
|
||||||
"@eslint-community/regexpp": "^4.12.1",
|
"@eslint-community/regexpp": "^4.12.1",
|
||||||
@@ -9001,6 +8991,7 @@
|
|||||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"eslint-config-prettier": "bin/cli.js"
|
"eslint-config-prettier": "bin/cli.js"
|
||||||
},
|
},
|
||||||
@@ -13470,14 +13461,16 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash-es": {
|
"node_modules/lodash-es": {
|
||||||
"version": "4.17.21",
|
"version": "4.17.21",
|
||||||
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
|
||||||
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash-unified": {
|
"node_modules/lodash-unified": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
@@ -14703,6 +14696,7 @@
|
|||||||
"integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==",
|
"integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/devtools-api": "^7.7.7"
|
"@vue/devtools-api": "^7.7.7"
|
||||||
},
|
},
|
||||||
@@ -14873,7 +14867,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "^9.4.0"
|
"commander": "^9.4.0"
|
||||||
},
|
},
|
||||||
@@ -14891,7 +14884,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.20.0 || >=14"
|
"node": "^12.20.0 || >=14"
|
||||||
}
|
}
|
||||||
@@ -14912,6 +14904,7 @@
|
|||||||
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
|
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"prettier": "bin/prettier.cjs"
|
"prettier": "bin/prettier.cjs"
|
||||||
},
|
},
|
||||||
@@ -15355,7 +15348,6 @@
|
|||||||
"deprecated": "Rimraf versions prior to v4 are no longer supported",
|
"deprecated": "Rimraf versions prior to v4 are no longer supported",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob": "^7.1.3"
|
"glob": "^7.1.3"
|
||||||
},
|
},
|
||||||
@@ -15370,7 +15362,6 @@
|
|||||||
"deprecated": "Glob versions prior to v9 are no longer supported",
|
"deprecated": "Glob versions prior to v9 are no longer supported",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fs.realpath": "^1.0.0",
|
"fs.realpath": "^1.0.0",
|
||||||
"inflight": "^1.0.4",
|
"inflight": "^1.0.4",
|
||||||
@@ -15392,7 +15383,6 @@
|
|||||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^1.1.7"
|
||||||
},
|
},
|
||||||
@@ -17230,7 +17220,6 @@
|
|||||||
"integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
|
"integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"rimraf": "~2.6.2"
|
"rimraf": "~2.6.2"
|
||||||
@@ -17294,7 +17283,6 @@
|
|||||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"minimist": "^1.2.6"
|
"minimist": "^1.2.6"
|
||||||
},
|
},
|
||||||
@@ -17413,6 +17401,7 @@
|
|||||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
@@ -17971,6 +17960,7 @@
|
|||||||
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
|
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.27.0",
|
"esbuild": "^0.27.0",
|
||||||
"fdir": "^6.5.0",
|
"fdir": "^6.5.0",
|
||||||
@@ -18064,6 +18054,7 @@
|
|||||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
@@ -18077,6 +18068,7 @@
|
|||||||
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
|
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.5.26",
|
"@vue/compiler-dom": "3.5.26",
|
||||||
"@vue/compiler-sfc": "3.5.26",
|
"@vue/compiler-sfc": "3.5.26",
|
||||||
@@ -18697,6 +18689,7 @@
|
|||||||
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/colinhacks"
|
"url": "https://github.com/sponsors/colinhacks"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
"homepage": "https://github.com/vrcx-team/VRCX#readme",
|
"homepage": "https://github.com/vrcx-team/VRCX#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@electron/rebuild": "^4.0.2",
|
"@electron/rebuild": "^4.0.2",
|
||||||
"@element-plus/icons-vue": "^2.3.2",
|
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.2",
|
||||||
"@fontsource-variable/inter": "^5.2.8",
|
"@fontsource-variable/inter": "^5.2.8",
|
||||||
"@fontsource-variable/noto-sans-jp": "^5.2.9",
|
"@fontsource-variable/noto-sans-jp": "^5.2.9",
|
||||||
|
|||||||
+3
-3
@@ -843,7 +843,7 @@ html.dark .x-friend-item > .detail > .extra,
|
|||||||
background: var(--color-zinc-300);
|
background: var(--color-zinc-300);
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-icon.is-loading {
|
.lucide.is-loading {
|
||||||
animation: rotating 2s linear infinite;
|
animation: rotating 2s linear infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -980,11 +980,11 @@ hr.x-vertical-divider {
|
|||||||
overflow: hidden auto;
|
overflow: hidden auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.x-friend-group > .el-icon-arrow-right {
|
.x-friend-group > .rotation-transition {
|
||||||
transition: transform 0.3s;
|
transition: transform 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.x-friend-group > .el-icon-arrow-right.rotate {
|
.x-friend-group > .rotation-transition.is-rotated {
|
||||||
transform: rotate(90deg);
|
transform: rotate(90deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,25 +18,21 @@
|
|||||||
@load="handleImageLoad"
|
@load="handleImageLoad"
|
||||||
@close="closeDialog">
|
@close="closeDialog">
|
||||||
<template #toolbar="{ actions }">
|
<template #toolbar="{ actions }">
|
||||||
<el-icon @click="copyImageToClipboard(fullscreenImageDialog.imageUrl)" class="toolbar-icon">
|
<Copy @click="copyImageToClipboard(fullscreenImageDialog.imageUrl)" class="toolbar-icon" />
|
||||||
<CopyDocument />
|
<Download
|
||||||
</el-icon>
|
|
||||||
<el-icon
|
|
||||||
@click="downloadAndSaveImage(fullscreenImageDialog.imageUrl, fullscreenImageDialog.fileName)"
|
@click="downloadAndSaveImage(fullscreenImageDialog.imageUrl, fullscreenImageDialog.fileName)"
|
||||||
class="toolbar-icon">
|
class="toolbar-icon" />
|
||||||
<Download />
|
<ZoomOut @click="actions('zoomOut')" class="toolbar-icon" />
|
||||||
</el-icon>
|
<ZoomIn @click="actions('zoomIn')" class="toolbar-icon" />
|
||||||
<el-icon @click="actions('zoomOut')" class="toolbar-icon"><ZoomOut /></el-icon>
|
<RotateCw @click="actions('clockwise')" class="toolbar-icon" />
|
||||||
<el-icon @click="actions('zoomIn')" class="toolbar-icon"><ZoomIn /></el-icon>
|
<RotateCcw @click="actions('anticlockwise')" class="toolbar-icon" />
|
||||||
<el-icon @click="actions('clockwise')" class="toolbar-icon"><RefreshRight /></el-icon>
|
|
||||||
<el-icon @click="actions('anticlockwise')" class="toolbar-icon"><RefreshLeft /></el-icon>
|
|
||||||
</template>
|
</template>
|
||||||
</el-image>
|
</el-image>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { CopyDocument, Download, RefreshLeft, RefreshRight, ZoomIn, ZoomOut } from '@element-plus/icons-vue';
|
import { Copy, Download, RotateCcw, RotateCw, ZoomIn, ZoomOut } from 'lucide-vue-next';
|
||||||
import { nextTick, ref, watch } from 'vue';
|
import { nextTick, ref, watch } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-icon><CaretBottom /></el-icon>
|
<ChevronDown />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span v-if="props.location === locationStore.lastLocation.location" style="margin-left: 5px"
|
<span v-if="props.location === locationStore.lastLocation.location" style="margin-left: 5px"
|
||||||
>{{ locationStore.lastLocation.playerList.size }}/{{ props.instance.capacity }}</span
|
>{{ locationStore.lastLocation.playerList.size }}/{{ props.instance.capacity }}</span
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { reactive, watch } from 'vue';
|
import { reactive, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { CaretBottom } from '@element-plus/icons-vue';
|
import { ChevronDown } from 'lucide-vue-next';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
function closeInstance(location) {
|
function closeInstance(location) {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: 'Continue? Close Instance, nobody will be able to join',
|
description: 'Continue? X Instance, nobody will be able to join',
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(async ({ ok }) => {
|
.then(async ({ ok }) => {
|
||||||
|
|||||||
@@ -2,18 +2,19 @@
|
|||||||
<div v-if="isVisible" class="inline-block">
|
<div v-if="isVisible" class="inline-block">
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.launch_invite_tooltip')"
|
<TooltipWrapper side="top" :content="t('dialog.user.info.launch_invite_tooltip')"
|
||||||
><Button
|
><Button
|
||||||
class="rounded-full w-6 h-6 text-xs text-muted-foreground hover:text-foreground"
|
class="rounded-full w-6 h-6 text-muted-foreground hover:text-foreground"
|
||||||
size="icon"
|
size="icon-sm"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
@click="confirm"
|
@click="confirm"
|
||||||
><i class="ri-login-box-line"></i
|
><Star />
|
||||||
></Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
|
import { Star } from 'lucide-vue-next';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
:class="['x-location', { 'x-link': link && location !== 'private' && location !== 'offline' }]"
|
:class="['x-location', { 'x-link': link && location !== 'private' && location !== 'offline' }]"
|
||||||
class="inline-flex min-w-0 flex-nowrap items-center overflow-hidden"
|
class="inline-flex min-w-0 flex-nowrap items-center overflow-hidden"
|
||||||
@click="handleShowWorldDialog">
|
@click="handleShowWorldDialog">
|
||||||
<el-icon :class="['is-loading']" class="mr-1" v-if="isTraveling"><Loading /></el-icon>
|
<Loader2 :class="['is-loading']" class="mr-1" v-if="isTraveling" />
|
||||||
<span class="min-w-0 truncate">{{ text }}</span>
|
<span class="min-w-0 truncate">{{ text }}</span>
|
||||||
<span v-if="showInstanceIdInLocation && instanceName" class="ml-1 whitespace-nowrap">{{
|
<span v-if="showInstanceIdInLocation && instanceName" class="ml-1 whitespace-nowrap">{{
|
||||||
` · #${instanceName}`
|
` · #${instanceName}`
|
||||||
@@ -23,15 +23,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="isClosed" :content="t('dialog.user.info.instance_closed')">
|
<TooltipWrapper v-if="isClosed" :content="t('dialog.user.info.instance_closed')">
|
||||||
<el-icon :class="['inline-block', 'ml-5']" style="color: lightcoral"><WarnTriangleFilled /></el-icon>
|
<AlertTriangle :class="['inline-block', 'ml-5']" style="color: lightcoral" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<el-icon v-if="strict" :class="['inline-block', 'ml-5']"><Lock /></el-icon>
|
<Lock v-if="strict" :class="['inline-block', 'ml-5']" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Loading, Lock, WarnTriangleFilled } from '@element-plus/icons-vue';
|
import { Loader2, Lock, AlertTriangle } from 'lucide-vue-next';
|
||||||
import { onBeforeUnmount, ref, watch } from 'vue';
|
import { onBeforeUnmount, ref, watch } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -2,19 +2,19 @@
|
|||||||
<span class="x-location-world">
|
<span class="x-location-world">
|
||||||
<span v-if="region" :class="['flags', 'inline-block', 'mr-1.25', region]"></span>
|
<span v-if="region" :class="['flags', 'inline-block', 'mr-1.25', region]"></span>
|
||||||
<span @click="showLaunchDialog" class="x-link">
|
<span @click="showLaunchDialog" class="x-link">
|
||||||
<el-icon v-if="isUnlocked" :class="['inline-block', 'mr-1.25']"><Unlock /></el-icon>
|
<Unlock v-if="isUnlocked" :class="['inline-block', 'mr-1.25']" />
|
||||||
<span> {{ accessTypeName }} #{{ instanceName }}</span>
|
<span> {{ accessTypeName }} #{{ instanceName }}</span>
|
||||||
</span>
|
</span>
|
||||||
<span v-if="groupName" @click="showGroupDialog" class="x-link">({{ groupName }})</span>
|
<span v-if="groupName" @click="showGroupDialog" class="x-link">({{ groupName }})</span>
|
||||||
<TooltipWrapper v-if="isClosed" :content="t('dialog.user.info.instance_closed')">
|
<TooltipWrapper v-if="isClosed" :content="t('dialog.user.info.instance_closed')">
|
||||||
<el-icon :class="['inline-block', 'ml-5']" style="color: lightcoral"><WarnTriangleFilled /></el-icon>
|
<AlertTriangle :class="['inline-block', 'ml-5']" style="color: lightcoral" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<el-icon v-if="strict" style="display: inline-block; margin-left: 5px"><Lock /></el-icon>
|
<Lock v-if="strict" style="display: inline-block; margin-left: 5px" />
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Lock, Unlock, WarnTriangleFilled } from '@element-plus/icons-vue';
|
import { Lock, Unlock, AlertTriangle } from 'lucide-vue-next';
|
||||||
import { ref, watch } from 'vue';
|
import { ref, watch } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -219,7 +219,7 @@
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
:disabled="currentUser.currentAvatar === avatarDialog.id"
|
:disabled="currentUser.currentAvatar === avatarDialog.id"
|
||||||
@click="selectAvatarWithoutConfirmation(avatarDialog.id)">
|
@click="selectAvatarWithoutConfirmation(avatarDialog.id)">
|
||||||
<CircleCheck
|
<CheckCircle
|
||||||
/></Button>
|
/></Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
@@ -232,12 +232,12 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuContent>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Refresh')">
|
<DropdownMenuItem @click="avatarDialogCommand('RefreshCw')">
|
||||||
<Refresh class="size-4" />
|
<RefreshCw class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.refresh') }}
|
{{ t('dialog.avatar.actions.refresh') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Share')">
|
<DropdownMenuItem @click="avatarDialogCommand('Share2')">
|
||||||
<Share class="size-4" />
|
<Share2 class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.share') }}
|
{{ t('dialog.avatar.actions.share') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
@@ -245,11 +245,11 @@
|
|||||||
v-if="avatarDialog.isBlocked"
|
v-if="avatarDialog.isBlocked"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="avatarDialogCommand('Unblock Avatar')">
|
@click="avatarDialogCommand('Unblock Avatar')">
|
||||||
<CircleCheck class="size-4" />
|
<CheckCircle class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.unblock') }}
|
{{ t('dialog.avatar.actions.unblock') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="avatarDialogCommand('Block Avatar')">
|
<DropdownMenuItem v-else @click="avatarDialogCommand('Block Avatar')">
|
||||||
<CircleClose class="size-4" />
|
<XCircle class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.block') }}
|
{{ t('dialog.avatar.actions.block') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
@@ -271,23 +271,23 @@
|
|||||||
{{ t('dialog.avatar.actions.make_public') }}
|
{{ t('dialog.avatar.actions.make_public') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Rename')">
|
<DropdownMenuItem @click="avatarDialogCommand('Rename')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.rename') }}
|
{{ t('dialog.avatar.actions.rename') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Change Description')">
|
<DropdownMenuItem @click="avatarDialogCommand('Change Description')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.change_description') }}
|
{{ t('dialog.avatar.actions.change_description') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Change Content Tags')">
|
<DropdownMenuItem @click="avatarDialogCommand('Change Content Tags')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.change_content_tags') }}
|
{{ t('dialog.avatar.actions.change_content_tags') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Change Styles and Author Tags')">
|
<DropdownMenuItem @click="avatarDialogCommand('Change Styles and Author Tags')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.change_styles_author_tags') }}
|
{{ t('dialog.avatar.actions.change_styles_author_tags') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="avatarDialogCommand('Change Image')">
|
<DropdownMenuItem @click="avatarDialogCommand('Change Image')">
|
||||||
<Picture class="size-4" />
|
<Image class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.change_image') }}
|
{{ t('dialog.avatar.actions.change_image') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
@@ -301,22 +301,22 @@
|
|||||||
v-if="avatarDialog.hasImposter"
|
v-if="avatarDialog.hasImposter"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="avatarDialogCommand('Regenerate Imposter')">
|
@click="avatarDialogCommand('Regenerate Imposter')">
|
||||||
<Refresh class="size-4" />
|
<RefreshCw class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.regenerate_impostor') }}
|
{{ t('dialog.avatar.actions.regenerate_impostor') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-if="avatarDialog.hasImposter"
|
v-if="avatarDialog.hasImposter"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="avatarDialogCommand('Delete Imposter')">
|
@click="avatarDialogCommand('Trash2 Imposter')">
|
||||||
<Delete class="size-4" />
|
<Trash2 class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.delete_impostor') }}
|
{{ t('dialog.avatar.actions.delete_impostor') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="avatarDialogCommand('Create Imposter')">
|
<DropdownMenuItem v-else @click="avatarDialogCommand('Create Imposter')">
|
||||||
<User class="size-4" />
|
<User class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.create_impostor') }}
|
{{ t('dialog.avatar.actions.create_impostor') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem variant="destructive" @click="avatarDialogCommand('Delete')">
|
<DropdownMenuItem variant="destructive" @click="avatarDialogCommand('Trash2')">
|
||||||
<Delete class="size-4" />
|
<Trash2 class="size-4" />
|
||||||
{{ t('dialog.avatar.actions.delete') }}
|
{{ t('dialog.avatar.actions.delete') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -468,7 +468,7 @@
|
|||||||
<span class="name"
|
<span class="name"
|
||||||
>{{ t('dialog.avatar.info.time_spent')
|
>{{ t('dialog.avatar.info.time_spent')
|
||||||
}}<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')">
|
}}<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon> </TooltipWrapper
|
<AlertTriangle style="margin-left: 3px" /> </TooltipWrapper
|
||||||
></span>
|
></span>
|
||||||
|
|
||||||
<span v-if="timeSpent === 0" class="extra">-</span>
|
<span v-if="timeSpent === 0" class="extra">-</span>
|
||||||
@@ -522,18 +522,22 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
CircleClose,
|
AlertTriangle,
|
||||||
Delete,
|
Check,
|
||||||
|
CheckCircle,
|
||||||
Download,
|
Download,
|
||||||
Edit,
|
Ellipsis,
|
||||||
Picture,
|
Image,
|
||||||
Refresh,
|
Pencil,
|
||||||
Share,
|
RefreshCcw,
|
||||||
|
RefreshCw,
|
||||||
|
Share2,
|
||||||
|
Star,
|
||||||
|
Trash2,
|
||||||
Upload,
|
Upload,
|
||||||
User,
|
User,
|
||||||
Warning
|
XCircle
|
||||||
} from '@element-plus/icons-vue';
|
} from 'lucide-vue-next';
|
||||||
import { Check, CircleCheck, Ellipsis, RefreshCcw, Star, Trash2 } from 'lucide-vue-next';
|
|
||||||
import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from '@/components/ui/carousel';
|
import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from '@/components/ui/carousel';
|
||||||
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
@@ -734,10 +738,10 @@
|
|||||||
function avatarDialogCommand(command) {
|
function avatarDialogCommand(command) {
|
||||||
const D = avatarDialog.value;
|
const D = avatarDialog.value;
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Refresh':
|
case 'RefreshCw':
|
||||||
showAvatarDialog(D.id);
|
showAvatarDialog(D.id);
|
||||||
break;
|
break;
|
||||||
case 'Share':
|
case 'Share2':
|
||||||
copyAvatarUrl(D.id);
|
copyAvatarUrl(D.id);
|
||||||
break;
|
break;
|
||||||
case 'Rename':
|
case 'Rename':
|
||||||
@@ -770,7 +774,7 @@
|
|||||||
.then(({ ok }) => {
|
.then(({ ok }) => {
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Delete Favorite':
|
case 'Trash2 Favorite':
|
||||||
favoriteRequest.deleteFavorite({
|
favoriteRequest.deleteFavorite({
|
||||||
objectId: D.id
|
objectId: D.id
|
||||||
});
|
});
|
||||||
@@ -839,7 +843,7 @@
|
|||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'Delete':
|
case 'Trash2':
|
||||||
avatarRequest
|
avatarRequest
|
||||||
.deleteAvatar({
|
.deleteAvatar({
|
||||||
avatarId: D.id
|
avatarId: D.id
|
||||||
@@ -863,7 +867,7 @@
|
|||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'Delete Imposter':
|
case 'Trash2 Imposter':
|
||||||
avatarRequest
|
avatarRequest
|
||||||
.deleteImposter({
|
.deleteImposter({
|
||||||
avatarId: D.id
|
avatarId: D.id
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Upload } from '@element-plus/icons-vue';
|
import { Upload } from 'lucide-vue-next';
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
|
|||||||
@@ -53,9 +53,7 @@
|
|||||||
>{{ props.setAvatarTagsDialog.selectedAvatarIds.length }} /
|
>{{ props.setAvatarTagsDialog.selectedAvatarIds.length }} /
|
||||||
{{ setAvatarTagsDialog.ownAvatars.length }}</span
|
{{ setAvatarTagsDialog.ownAvatars.length }}</span
|
||||||
>
|
>
|
||||||
<el-icon v-if="setAvatarTagsDialog.loading" class="is-loading" style="margin-left: 5px"
|
<Loader2 v-if="setAvatarTagsDialog.loading" class="is-loading" style="margin-left: 5px" />
|
||||||
><Loading
|
|
||||||
/></el-icon>
|
|
||||||
<br />
|
<br />
|
||||||
<div class="x-friend-list" style="margin-top: 10px; min-height: 60px; max-height: 280px">
|
<div class="x-friend-list" style="margin-top: 10px; min-height: 60px; max-height: 280px">
|
||||||
<div
|
<div
|
||||||
@@ -102,7 +100,7 @@
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
import { Loader2 } from 'lucide-vue-next';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { watch } from 'vue';
|
import { watch } from 'vue';
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
@change="onFileChangeGallery" />
|
@change="onFileChangeGallery" />
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="selectImageGallerySelect('', '')">
|
<Button variant="outline" size="sm" @click="selectImageGallerySelect('', '')">
|
||||||
<Close />
|
<X />
|
||||||
{{ t('dialog.gallery_select.none') }}
|
{{ t('dialog.gallery_select.none') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="outline" size="sm" @click="refreshGalleryTable">
|
<Button variant="outline" size="sm" @click="refreshGalleryTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_select.refresh') }}
|
{{ t('dialog.gallery_select.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Close, Refresh, Upload } from '@element-plus/icons-vue';
|
import { X, RefreshCw, Upload } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ButtonGroup } from '@/components/ui/button-group';
|
import { ButtonGroup } from '@/components/ui/button-group';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -161,7 +161,7 @@
|
|||||||
size="icon-lg"
|
size="icon-lg"
|
||||||
:disabled="groupDialog.ref.privacy === 'private'"
|
:disabled="groupDialog.ref.privacy === 'private'"
|
||||||
@click="setGroupRepresentation(groupDialog.id)">
|
@click="setGroupRepresentation(groupDialog.id)">
|
||||||
<StarFilled />
|
<Star />
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
size="icon-lg"
|
size="icon-lg"
|
||||||
@click="cancelGroupRequest(groupDialog.id)">
|
@click="cancelGroupRequest(groupDialog.id)">
|
||||||
<Close />
|
<X />
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
size="icon-lg"
|
size="icon-lg"
|
||||||
@click="joinGroup(groupDialog.id)">
|
@click="joinGroup(groupDialog.id)">
|
||||||
<Message />
|
<MessageSquare />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
:content="t('dialog.group.actions.invite_required_tooltip')">
|
:content="t('dialog.group.actions.invite_required_tooltip')">
|
||||||
<span>
|
<span>
|
||||||
<Button class="rounded-full mr-2" variant="outline" size="icon-lg" disabled>
|
<Button class="rounded-full mr-2" variant="outline" size="icon-lg" disabled>
|
||||||
<Message />
|
<MessageSquare />
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
@@ -236,16 +236,16 @@
|
|||||||
groupDialog.ref.membershipStatus === 'userblocked' ? 'destructive' : 'outline'
|
groupDialog.ref.membershipStatus === 'userblocked' ? 'destructive' : 'outline'
|
||||||
"
|
"
|
||||||
size="icon-lg">
|
size="icon-lg">
|
||||||
<MoreFilled />
|
<MoreHorizontal />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuContent>
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Refresh')">
|
<DropdownMenuItem @click="groupDialogCommand('RefreshCw')">
|
||||||
<Refresh class="size-4" />
|
<RefreshCw class="size-4" />
|
||||||
{{ t('dialog.group.actions.refresh') }}
|
{{ t('dialog.group.actions.refresh') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Share')">
|
<DropdownMenuItem @click="groupDialogCommand('Share2')">
|
||||||
<Share class="size-4" />
|
<Share2 class="size-4" />
|
||||||
{{ t('dialog.group.actions.share') }}
|
{{ t('dialog.group.actions.share') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template v-if="groupDialog.inGroup">
|
<template v-if="groupDialog.inGroup">
|
||||||
@@ -254,7 +254,7 @@
|
|||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-if="groupDialog.ref.myMember.isSubscribedToAnnouncements"
|
v-if="groupDialog.ref.myMember.isSubscribedToAnnouncements"
|
||||||
@click="groupDialogCommand('Unsubscribe To Announcements')">
|
@click="groupDialogCommand('Unsubscribe To Announcements')">
|
||||||
<MuteNotification class="size-4" />
|
<BellOff class="size-4" />
|
||||||
{{ t('dialog.group.actions.unsubscribe') }}
|
{{ t('dialog.group.actions.unsubscribe') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
@@ -266,41 +266,41 @@
|
|||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-if="hasGroupPermission(groupDialog.ref, 'group-invites-manage')"
|
v-if="hasGroupPermission(groupDialog.ref, 'group-invites-manage')"
|
||||||
@click="groupDialogCommand('Invite To Group')">
|
@click="groupDialogCommand('Invite To Group')">
|
||||||
<Message class="size-4" />
|
<MessageSquare class="size-4" />
|
||||||
{{ t('dialog.group.actions.invite_to_group') }}
|
{{ t('dialog.group.actions.invite_to_group') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template
|
<template
|
||||||
v-if="hasGroupPermission(groupDialog.ref, 'group-announcement-manage')">
|
v-if="hasGroupPermission(groupDialog.ref, 'group-announcement-manage')">
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Create Post')">
|
<DropdownMenuItem @click="groupDialogCommand('Create Post')">
|
||||||
<Tickets class="size-4" />
|
<Ticket class="size-4" />
|
||||||
{{ t('dialog.group.actions.create_post') }}
|
{{ t('dialog.group.actions.create_post') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
:disabled="!hasGroupModerationPermission(groupDialog.ref)"
|
:disabled="!hasGroupModerationPermission(groupDialog.ref)"
|
||||||
@click="groupDialogCommand('Moderation Tools')">
|
@click="groupDialogCommand('Moderation Tools')">
|
||||||
<Operation class="size-4" />
|
<Settings class="size-4" />
|
||||||
{{ t('dialog.group.actions.moderation_tools') }}
|
{{ t('dialog.group.actions.moderation_tools') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template
|
<template
|
||||||
v-if="groupDialog.ref.myMember && groupDialog.ref.privacy === 'default'">
|
v-if="groupDialog.ref.myMember && groupDialog.ref.privacy === 'default'">
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Visibility Everyone')">
|
<DropdownMenuItem @click="groupDialogCommand('Visibility Everyone')">
|
||||||
<View class="size-4" />
|
<Eye class="size-4" />
|
||||||
<Check
|
<Check
|
||||||
v-if="groupDialog.ref.myMember.visibility === 'visible'"
|
v-if="groupDialog.ref.myMember.visibility === 'visible'"
|
||||||
class="size-4" />
|
class="size-4" />
|
||||||
{{ t('dialog.group.actions.visibility_everyone') }}
|
{{ t('dialog.group.actions.visibility_everyone') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Visibility Friends')">
|
<DropdownMenuItem @click="groupDialogCommand('Visibility Friends')">
|
||||||
<View class="size-4" />
|
<Eye class="size-4" />
|
||||||
<Check
|
<Check
|
||||||
v-if="groupDialog.ref.myMember.visibility === 'friends'"
|
v-if="groupDialog.ref.myMember.visibility === 'friends'"
|
||||||
class="size-4" />
|
class="size-4" />
|
||||||
{{ t('dialog.group.actions.visibility_friends') }}
|
{{ t('dialog.group.actions.visibility_friends') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="groupDialogCommand('Visibility Hidden')">
|
<DropdownMenuItem @click="groupDialogCommand('Visibility Hidden')">
|
||||||
<View class="size-4" />
|
<Eye class="size-4" />
|
||||||
<Check
|
<Check
|
||||||
v-if="groupDialog.ref.myMember.visibility === 'hidden'"
|
v-if="groupDialog.ref.myMember.visibility === 'hidden'"
|
||||||
class="size-4" />
|
class="size-4" />
|
||||||
@@ -311,7 +311,7 @@
|
|||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="groupDialogCommand('Leave Group')">
|
@click="groupDialogCommand('Leave Group')">
|
||||||
<Delete class="size-4" />
|
<Trash2 class="size-4" />
|
||||||
{{ t('dialog.group.actions.leave') }}
|
{{ t('dialog.group.actions.leave') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -322,11 +322,11 @@
|
|||||||
v-if="groupDialog.ref.membershipStatus === 'userblocked'"
|
v-if="groupDialog.ref.membershipStatus === 'userblocked'"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="groupDialogCommand('Unblock Group')">
|
@click="groupDialogCommand('Unblock Group')">
|
||||||
<CircleCheck class="size-4" />
|
<CheckCircle class="size-4" />
|
||||||
{{ t('dialog.group.actions.unblock') }}
|
{{ t('dialog.group.actions.unblock') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="groupDialogCommand('Block Group')">
|
<DropdownMenuItem v-else @click="groupDialogCommand('Block Group')">
|
||||||
<CircleClose class="size-4" />
|
<XCircle class="size-4" />
|
||||||
{{ t('dialog.group.actions.block') }}
|
{{ t('dialog.group.actions.block') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -359,7 +359,7 @@
|
|||||||
<div style="margin: 5px 0">
|
<div style="margin: 5px 0">
|
||||||
<Location :location="room.tag" style="display: inline-block" />
|
<Location :location="room.tag" style="display: inline-block" />
|
||||||
<InviteYourself :location="room.tag" style="margin-left: 5px" />
|
<InviteYourself :location="room.tag" style="margin-left: 5px" />
|
||||||
<TooltipWrapper side="top" content="Refresh player count">
|
<TooltipWrapper side="top" content="RefreshCw player count">
|
||||||
<Button
|
<Button
|
||||||
class="rounded-full ml-1 w-6 h-6 text-xs text-muted-foreground hover:text-foreground"
|
class="rounded-full ml-1 w-6 h-6 text-xs text-muted-foreground hover:text-foreground"
|
||||||
size="icon"
|
size="icon"
|
||||||
@@ -392,7 +392,7 @@
|
|||||||
:style="{ color: user.$userColour }"
|
:style="{ color: user.$userColour }"
|
||||||
v-text="user.displayName" />
|
v-text="user.displayName" />
|
||||||
<span v-if="user.location === 'traveling'" class="extra">
|
<span v-if="user.location === 'traveling'" class="extra">
|
||||||
<el-icon class="is-loading" style="margin-right: 3px"><Loading /></el-icon>
|
<Loader2 class="is-loading" style="margin-right: 3px" />
|
||||||
<Timer :epoch="user.$travelingToTime" />
|
<Timer :epoch="user.$travelingToTime" />
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="extra">
|
<span v-else class="extra">
|
||||||
@@ -456,7 +456,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<DisplayName
|
<DisplayName
|
||||||
:userid="groupDialog.announcement.authorId"
|
:userid="groupDialog.announcement.authorId"
|
||||||
@@ -581,7 +581,7 @@
|
|||||||
<span class="name">
|
<span class="name">
|
||||||
{{ t('dialog.group.info.last_visited') }}
|
{{ t('dialog.group.info.last_visited') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span class="extra">{{ formatDateFilter(groupDialog.lastVisit, 'long') }}</span>
|
<span class="extra">{{ formatDateFilter(groupDialog.lastVisit, 'long') }}</span>
|
||||||
@@ -775,7 +775,7 @@
|
|||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<DisplayName :userid="post.authorId" style="margin-right: 5px" />
|
<DisplayName :userid="post.authorId" style="margin-right: 5px" />
|
||||||
<span v-if="post.editorId" style="margin-right: 5px"
|
<span v-if="post.editorId" style="margin-right: 5px"
|
||||||
@@ -934,7 +934,7 @@
|
|||||||
v-if="user.isRepresenting"
|
v-if="user.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="user.visibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="user.visibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -943,13 +943,13 @@
|
|||||||
{{ user.visibility }}</span
|
{{ user.visibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
v-if="!user.isSubscribedToAnnouncements"
|
v-if="!user.isSubscribedToAnnouncements"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.unsubscribed_announcements')">
|
:content="t('dialog.group.members.unsubscribed_announcements')">
|
||||||
<el-icon style="margin-right: 5px"><ChatLineSquare /></el-icon>
|
<MessageSquare style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="user.managerNotes" side="top">
|
<TooltipWrapper v-if="user.managerNotes" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -957,7 +957,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<span>{{ user.managerNotes }}</span>
|
<span>{{ user.managerNotes }}</span>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><Edit /></el-icon>
|
<Pencil style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</template>
|
</template>
|
||||||
<template v-for="roleId in user.roleIds" :key="roleId">
|
<template v-for="roleId in user.roleIds" :key="roleId">
|
||||||
@@ -995,7 +995,7 @@
|
|||||||
v-if="user.isRepresenting"
|
v-if="user.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="user.visibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="user.visibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -1004,13 +1004,13 @@
|
|||||||
{{ user.visibility }}</span
|
{{ user.visibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
v-if="!user.isSubscribedToAnnouncements"
|
v-if="!user.isSubscribedToAnnouncements"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.unsubscribed_announcements')">
|
:content="t('dialog.group.members.unsubscribed_announcements')">
|
||||||
<el-icon style="margin-right: 5px"><ChatLineSquare /></el-icon>
|
<MessageSquare style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="user.managerNotes" side="top">
|
<TooltipWrapper v-if="user.managerNotes" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -1018,7 +1018,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<span>{{ user.managerNotes }}</span>
|
<span>{{ user.managerNotes }}</span>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><Edit /></el-icon>
|
<Pencil style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</template>
|
</template>
|
||||||
<template v-for="roleId in user.roleIds" :key="roleId">
|
<template v-for="roleId in user.roleIds" :key="roleId">
|
||||||
@@ -1052,7 +1052,7 @@
|
|||||||
:disabled="isGroupGalleryLoading"
|
:disabled="isGroupGalleryLoading"
|
||||||
@click="getGroupGalleries">
|
@click="getGroupGalleries">
|
||||||
<Spinner v-if="isGroupGalleryLoading" />
|
<Spinner v-if="isGroupGalleryLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<TabsUnderline
|
<TabsUnderline
|
||||||
v-model="groupDialogGalleryCurrentName"
|
v-model="groupDialogGalleryCurrentName"
|
||||||
@@ -1130,29 +1130,27 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
|
AlertTriangle,
|
||||||
Bell,
|
Bell,
|
||||||
ChatLineSquare,
|
BellOff,
|
||||||
Check,
|
Check,
|
||||||
CircleCheck,
|
CheckCircle,
|
||||||
CircleClose,
|
|
||||||
Close,
|
|
||||||
CollectionTag,
|
|
||||||
Delete,
|
|
||||||
Download,
|
Download,
|
||||||
Edit,
|
Eye,
|
||||||
Loading,
|
Loader2,
|
||||||
Message,
|
MessageSquare,
|
||||||
MoreFilled,
|
MoreHorizontal,
|
||||||
MuteNotification,
|
Pencil,
|
||||||
Operation,
|
RefreshCw,
|
||||||
Refresh,
|
Settings,
|
||||||
Share,
|
Share2,
|
||||||
Star,
|
Star,
|
||||||
StarFilled,
|
Tag,
|
||||||
Tickets,
|
Ticket,
|
||||||
View,
|
Trash2,
|
||||||
Warning
|
X,
|
||||||
} from '@element-plus/icons-vue';
|
XCircle
|
||||||
|
} from 'lucide-vue-next';
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
||||||
import { computed, nextTick, reactive, ref, watch } from 'vue';
|
import { computed, nextTick, reactive, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
@@ -1550,7 +1548,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Share':
|
case 'Share2':
|
||||||
copyToClipboard(groupDialog.value.ref.$url);
|
copyToClipboard(groupDialog.value.ref.$url);
|
||||||
break;
|
break;
|
||||||
case 'Create Post':
|
case 'Create Post':
|
||||||
@@ -1562,7 +1560,7 @@
|
|||||||
case 'Invite To Group':
|
case 'Invite To Group':
|
||||||
showInviteGroupDialog(D.id, '');
|
showInviteGroupDialog(D.id, '');
|
||||||
break;
|
break;
|
||||||
case 'Refresh':
|
case 'RefreshCw':
|
||||||
showGroupDialog(D.id);
|
showGroupDialog(D.id);
|
||||||
break;
|
break;
|
||||||
case 'Leave Group':
|
case 'Leave Group':
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
:disabled="isGroupMembersLoading"
|
:disabled="isGroupMembersLoading"
|
||||||
@click="loadAllGroupMembers">
|
@click="loadAllGroupMembers">
|
||||||
<Spinner v-if="isGroupMembersLoading" />
|
<Spinner v-if="isGroupMembersLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">
|
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">
|
||||||
{{ groupMemberModerationTable.data.length }}/{{
|
{{ groupMemberModerationTable.data.length }}/{{
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
@click.stop>
|
@click.stop>
|
||||||
<span>
|
<span>
|
||||||
{{ t(memberSortOrder.name) }}
|
{{ t(memberSortOrder.name) }}
|
||||||
<el-icon style="margin-left: 5px"><ArrowDown /></el-icon>
|
<ArrowDown style="margin-left: 5px" />
|
||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
@click.stop>
|
@click.stop>
|
||||||
<span>
|
<span>
|
||||||
{{ t(memberFilter.name) }}
|
{{ t(memberFilter.name) }}
|
||||||
<el-icon style="margin-left: 5px"><ArrowDown /></el-icon>
|
<ArrowDown style="margin-left: 5px" />
|
||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
:disabled="isGroupMembersLoading"
|
:disabled="isGroupMembersLoading"
|
||||||
@click="getAllGroupBans(groupMemberModeration.id)">
|
@click="getAllGroupBans(groupMemberModeration.id)">
|
||||||
<Spinner v-if="isGroupMembersLoading" />
|
<Spinner v-if="isGroupMembersLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
||||||
groupBansModerationTable.data.length
|
groupBansModerationTable.data.length
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
:disabled="isGroupMembersLoading"
|
:disabled="isGroupMembersLoading"
|
||||||
@click="getAllGroupInvitesAndJoinRequests(groupMemberModeration.id)">
|
@click="getAllGroupInvitesAndJoinRequests(groupMemberModeration.id)">
|
||||||
<Spinner v-if="isGroupMembersLoading" />
|
<Spinner v-if="isGroupMembersLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<br />
|
<br />
|
||||||
<TabsUnderline default-value="sent" :items="groupInvitesTabs" :unmount-on-hide="false">
|
<TabsUnderline default-value="sent" :items="groupInvitesTabs" :unmount-on-hide="false">
|
||||||
@@ -308,7 +308,7 @@
|
|||||||
:disabled="isGroupMembersLoading"
|
:disabled="isGroupMembersLoading"
|
||||||
@click="getAllGroupLogs(groupMemberModeration.id)">
|
@click="getAllGroupLogs(groupMemberModeration.id)">
|
||||||
<Spinner v-if="isGroupMembersLoading" />
|
<Spinner v-if="isGroupMembersLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
||||||
groupLogsModerationTable.data.length
|
groupLogsModerationTable.data.length
|
||||||
@@ -392,7 +392,7 @@
|
|||||||
<template #content>
|
<template #content>
|
||||||
<span>{{ t('dialog.group_member_moderation.user_isnt_in_group') }}</span>
|
<span>{{ t('dialog.group_member_moderation.user_isnt_in_group') }}</span>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-left: 3px; display: inline-block"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px; display: inline-block" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span v-text="user.user?.displayName || user.userId" style="font-weight: bold; margin-left: 5px"></span>
|
<span v-text="user.user?.displayName || user.userId" style="font-weight: bold; margin-left: 5px"></span>
|
||||||
<button
|
<button
|
||||||
@@ -507,7 +507,7 @@
|
|||||||
>{{ t('dialog.group_member_moderation.unban') }}</Button
|
>{{ t('dialog.group_member_moderation.unban') }}</Button
|
||||||
>
|
>
|
||||||
<span v-if="progressCurrent" style="margin-top: 10px">
|
<span v-if="progressCurrent" style="margin-top: 10px">
|
||||||
<el-icon class="is-loading" style="margin-left: 5px; margin-right: 5px"><Loading /></el-icon>
|
<Loader2 class="is-loading" style="margin-left: 5px; margin-right: 5px" />
|
||||||
{{ t('dialog.group_member_moderation.progress') }} {{ progressCurrent }}/{{ progressTotal }}
|
{{ t('dialog.group_member_moderation.progress') }} {{ progressCurrent }}/{{ progressTotal }}
|
||||||
</span>
|
</span>
|
||||||
<Button
|
<Button
|
||||||
@@ -526,13 +526,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ArrowDown, Loading, Refresh, Warning } from '@element-plus/icons-vue';
|
import { AlertTriangle, ArrowDown, Loader2, RefreshCw, Trash2 } from 'lucide-vue-next';
|
||||||
import { computed, reactive, ref, watch } from 'vue';
|
import { computed, reactive, ref, watch } from 'vue';
|
||||||
import { InputGroupField, InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupField, InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { TabsUnderline } from '@/components/ui/tabs';
|
import { TabsUnderline } from '@/components/ui/tabs';
|
||||||
import { Trash2 } from 'lucide-vue-next';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<span class="flex items-center gap-1">
|
<span class="flex items-center gap-1">
|
||||||
<span>{{ t('dialog.launch.short_url') }}</span>
|
<span>{{ t('dialog.launch.short_url') }}</span>
|
||||||
<TooltipWrapper side="top" :content="t('dialog.launch.short_url_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.launch.short_url_notice')">
|
||||||
<el-icon><Warning /></el-icon>
|
<AlertTriangle />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
</FieldLabel>
|
</FieldLabel>
|
||||||
@@ -132,12 +132,10 @@
|
|||||||
DropdownMenuTrigger
|
DropdownMenuTrigger
|
||||||
} from '@/components/ui/dropdown-menu';
|
} from '@/components/ui/dropdown-menu';
|
||||||
import { Field, FieldContent, FieldGroup, FieldLabel } from '@/components/ui/field';
|
import { Field, FieldContent, FieldGroup, FieldLabel } from '@/components/ui/field';
|
||||||
|
import { AlertTriangle, Copy, MoreHorizontal } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ButtonGroup } from '@/components/ui/button-group';
|
import { ButtonGroup } from '@/components/ui/button-group';
|
||||||
import { Copy } from 'lucide-vue-next';
|
|
||||||
import { InputGroupField } from '@/components/ui/input-group';
|
import { InputGroupField } from '@/components/ui/input-group';
|
||||||
import { MoreHorizontal } from 'lucide-vue-next';
|
|
||||||
import { Warning } from '@element-plus/icons-vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<DropdownMenuTrigger as-child>
|
<DropdownMenuTrigger as-child>
|
||||||
<div class="ml-2">
|
<div class="ml-2">
|
||||||
<Button variant="outline" size="icon-lg" class="rounded-full">
|
<Button variant="outline" size="icon-lg" class="rounded-full">
|
||||||
<Ellipsis />
|
<MoreHorizontal />
|
||||||
<span
|
<span
|
||||||
v-if="dotClass"
|
v-if="dotClass"
|
||||||
class="absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-background"
|
class="absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-background"
|
||||||
@@ -26,43 +26,43 @@
|
|||||||
</div>
|
</div>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuContent>
|
||||||
<DropdownMenuItem @click="onCommand('Refresh')">
|
<DropdownMenuItem @click="onCommand('RefreshCw')">
|
||||||
<Refresh class="size-4" />
|
<RefreshCw class="size-4" />
|
||||||
{{ t('dialog.user.actions.refresh') }}
|
{{ t('dialog.user.actions.refresh') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Share')">
|
<DropdownMenuItem @click="onCommand('Share2')">
|
||||||
<Share class="size-4" />
|
<Share2 class="size-4" />
|
||||||
{{ t('dialog.user.actions.share') }}
|
{{ t('dialog.user.actions.share') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template v-if="userDialog.ref.id === currentUser.id">
|
<template v-if="userDialog.ref.id === currentUser.id">
|
||||||
<DropdownMenuItem @click="onCommand('Show Avatar Author')">
|
<DropdownMenuItem @click="onCommand('Show Avatar Author')">
|
||||||
<UserFilled class="size-4" />
|
<User class="size-4" />
|
||||||
{{ t('dialog.user.actions.show_avatar_author') }}
|
{{ t('dialog.user.actions.show_avatar_author') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Show Fallback Avatar Details')">
|
<DropdownMenuItem @click="onCommand('Show Fallback Avatar Details')">
|
||||||
<UserFilled class="size-4" />
|
<User class="size-4" />
|
||||||
{{ t('dialog.user.actions.show_fallback_avatar') }}
|
{{ t('dialog.user.actions.show_fallback_avatar') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem @click="onCommand('Edit Social Status')">
|
<DropdownMenuItem @click="onCommand('Pencil Social Status')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.user.actions.edit_status') }}
|
{{ t('dialog.user.actions.edit_status') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Edit Language')">
|
<DropdownMenuItem @click="onCommand('Pencil Language')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.user.actions.edit_language') }}
|
{{ t('dialog.user.actions.edit_language') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Edit Bio')">
|
<DropdownMenuItem @click="onCommand('Pencil Bio')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.user.actions.edit_bio') }}
|
{{ t('dialog.user.actions.edit_bio') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Edit Pronouns')">
|
<DropdownMenuItem @click="onCommand('Pencil Pronouns')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.user.actions.edit_pronouns') }}
|
{{ t('dialog.user.actions.edit_pronouns') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem @click="onCommand('Logout')">
|
<DropdownMenuItem @click="onCommand('Logout')">
|
||||||
<SwitchButton class="size-4" />
|
<Power class="size-4" />
|
||||||
{{ t('dialog.user.actions.logout') }}
|
{{ t('dialog.user.actions.logout') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -70,29 +70,29 @@
|
|||||||
<template v-if="userDialog.isFriend">
|
<template v-if="userDialog.isFriend">
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem @click="onCommand('Request Invite')">
|
<DropdownMenuItem @click="onCommand('Request Invite')">
|
||||||
<Postcard class="size-4" />
|
<Mail class="size-4" />
|
||||||
{{ t('dialog.user.actions.request_invite') }}
|
{{ t('dialog.user.actions.request_invite') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Request Invite Message')">
|
<DropdownMenuItem @click="onCommand('Request Invite MessageSquare')">
|
||||||
<Postcard class="size-4" />
|
<Mail class="size-4" />
|
||||||
{{ t('dialog.user.actions.request_invite_with_message') }}
|
{{ t('dialog.user.actions.request_invite_with_message') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template v-if="isGameRunning">
|
<template v-if="isGameRunning">
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
:disabled="!checkCanInvite(lastLocation.location)"
|
:disabled="!checkCanInvite(lastLocation.location)"
|
||||||
@click="onCommand('Invite')">
|
@click="onCommand('Invite')">
|
||||||
<Message class="size-4" />
|
<MessageSquare class="size-4" />
|
||||||
{{ t('dialog.user.actions.invite') }}
|
{{ t('dialog.user.actions.invite') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
:disabled="!checkCanInvite(lastLocation.location)"
|
:disabled="!checkCanInvite(lastLocation.location)"
|
||||||
@click="onCommand('Invite Message')">
|
@click="onCommand('Invite MessageSquare')">
|
||||||
<Message class="size-4" />
|
<MessageSquare class="size-4" />
|
||||||
{{ t('dialog.user.actions.invite_with_message') }}
|
{{ t('dialog.user.actions.invite_with_message') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
<DropdownMenuItem :disabled="!currentUser.isBoopingEnabled" @click="onCommand('Send Boop')">
|
<DropdownMenuItem :disabled="!currentUser.isBoopingEnabled" @click="onCommand('Send Boop')">
|
||||||
<Pointer class="size-4" />
|
<MousePointer class="size-4" />
|
||||||
{{ t('dialog.user.actions.send_boop') }}
|
{{ t('dialog.user.actions.send_boop') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -102,14 +102,14 @@
|
|||||||
{{ t('dialog.user.actions.accept_friend_request') }}
|
{{ t('dialog.user.actions.accept_friend_request') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Decline Friend Request')">
|
<DropdownMenuItem @click="onCommand('Decline Friend Request')">
|
||||||
<Close class="size-4" />
|
<X class="size-4" />
|
||||||
{{ t('dialog.user.actions.decline_friend_request') }}
|
{{ t('dialog.user.actions.decline_friend_request') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-else-if="userDialog.outgoingRequest"
|
v-else-if="userDialog.outgoingRequest"
|
||||||
@click="onCommand('Cancel Friend Request')">
|
@click="onCommand('Cancel Friend Request')">
|
||||||
<Close class="size-4" />
|
<X class="size-4" />
|
||||||
{{ t('dialog.user.actions.cancel_friend_request') }}
|
{{ t('dialog.user.actions.cancel_friend_request') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="onCommand('Send Friend Request')">
|
<DropdownMenuItem v-else @click="onCommand('Send Friend Request')">
|
||||||
@@ -117,28 +117,28 @@
|
|||||||
{{ t('dialog.user.actions.send_friend_request') }}
|
{{ t('dialog.user.actions.send_friend_request') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Invite To Group')">
|
<DropdownMenuItem @click="onCommand('Invite To Group')">
|
||||||
<Message class="size-4" />
|
<MessageSquare class="size-4" />
|
||||||
{{ t('dialog.user.actions.invite_to_group') }}
|
{{ t('dialog.user.actions.invite_to_group') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Group Moderation')">
|
<DropdownMenuItem @click="onCommand('Group Moderation')">
|
||||||
<Operation class="size-4" />
|
<Settings class="size-4" />
|
||||||
{{ t('dialog.user.actions.group_moderation') }}
|
{{ t('dialog.user.actions.group_moderation') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Edit Note Memo')">
|
<DropdownMenuItem @click="onCommand('Pencil Note Memo')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
Edit Note and Memo
|
Pencil Note and Memo
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem @click="onCommand('Show Avatar Author')">
|
<DropdownMenuItem @click="onCommand('Show Avatar Author')">
|
||||||
<UserFilled class="size-4" />
|
<User class="size-4" />
|
||||||
{{ t('dialog.user.actions.show_avatar_author') }}
|
{{ t('dialog.user.actions.show_avatar_author') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Show Fallback Avatar Details')">
|
<DropdownMenuItem @click="onCommand('Show Fallback Avatar Details')">
|
||||||
<UserFilled class="size-4" />
|
<User class="size-4" />
|
||||||
{{ t('dialog.user.actions.show_fallback_avatar') }}
|
{{ t('dialog.user.actions.show_fallback_avatar') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Previous Instances')">
|
<DropdownMenuItem @click="onCommand('Previous Instances')">
|
||||||
<DataLine class="size-4" />
|
<LineChart class="size-4" />
|
||||||
{{ t('dialog.user.actions.show_previous_instances') }}
|
{{ t('dialog.user.actions.show_previous_instances') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
@@ -146,39 +146,39 @@
|
|||||||
v-if="userDialog.isBlock"
|
v-if="userDialog.isBlock"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="onCommand('Moderation Unblock')">
|
@click="onCommand('Moderation Unblock')">
|
||||||
<CircleCheck class="size-4" />
|
<CheckCircle class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_unblock') }}
|
{{ t('dialog.user.actions.moderation_unblock') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-else
|
v-else
|
||||||
:disabled="userDialog.ref.$isModerator"
|
:disabled="userDialog.ref.$isModerator"
|
||||||
@click="onCommand('Moderation Block')">
|
@click="onCommand('Moderation Block')">
|
||||||
<CircleClose class="size-4" />
|
<XCircle class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_block') }}
|
{{ t('dialog.user.actions.moderation_block') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-if="userDialog.isMute"
|
v-if="userDialog.isMute"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="onCommand('Moderation Unmute')">
|
@click="onCommand('Moderation Unmute')">
|
||||||
<Microphone class="size-4" />
|
<Mic class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_unmute') }}
|
{{ t('dialog.user.actions.moderation_unmute') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-else
|
v-else
|
||||||
:disabled="userDialog.ref.$isModerator"
|
:disabled="userDialog.ref.$isModerator"
|
||||||
@click="onCommand('Moderation Mute')">
|
@click="onCommand('Moderation VolumeX')">
|
||||||
<Mute class="size-4" />
|
<VolumeX class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_mute') }}
|
{{ t('dialog.user.actions.moderation_mute') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
v-if="userDialog.isMuteChat"
|
v-if="userDialog.isMuteChat"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="onCommand('Moderation Enable Chatbox')">
|
@click="onCommand('Moderation Enable Chatbox')">
|
||||||
<ChatLineRound class="size-4" />
|
<MessageCircle class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_enable_chatbox') }}
|
{{ t('dialog.user.actions.moderation_enable_chatbox') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="onCommand('Moderation Disable Chatbox')">
|
<DropdownMenuItem v-else @click="onCommand('Moderation Disable Chatbox')">
|
||||||
<ChatDotRound class="size-4" />
|
<MessageCircle class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_disable_chatbox') }}
|
{{ t('dialog.user.actions.moderation_disable_chatbox') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="onCommand('Show Avatar')">
|
<DropdownMenuItem @click="onCommand('Show Avatar')">
|
||||||
@@ -195,11 +195,11 @@
|
|||||||
v-if="userDialog.isInteractOff"
|
v-if="userDialog.isInteractOff"
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
@click="onCommand('Moderation Enable Avatar Interaction')">
|
@click="onCommand('Moderation Enable Avatar Interaction')">
|
||||||
<Pointer class="size-4" />
|
<MousePointer class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_enable_avatar_interaction') }}
|
{{ t('dialog.user.actions.moderation_enable_avatar_interaction') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="onCommand('Moderation Disable Avatar Interaction')">
|
<DropdownMenuItem v-else @click="onCommand('Moderation Disable Avatar Interaction')">
|
||||||
<CircleClose class="size-4" />
|
<XCircle class="size-4" />
|
||||||
{{ t('dialog.user.actions.moderation_disable_avatar_interaction') }}
|
{{ t('dialog.user.actions.moderation_disable_avatar_interaction') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem :disabled="userDialog.ref.$isModerator" @click="onCommand('Report Hacking')">
|
<DropdownMenuItem :disabled="userDialog.ref.$isModerator" @click="onCommand('Report Hacking')">
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
<template v-if="userDialog.isFriend">
|
<template v-if="userDialog.isFriend">
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem variant="destructive" @click="onCommand('Unfriend')">
|
<DropdownMenuItem variant="destructive" @click="onCommand('Unfriend')">
|
||||||
<Delete class="size-4" />
|
<Trash2 class="size-4" />
|
||||||
{{ t('dialog.user.actions.unfriend') }}
|
{{ t('dialog.user.actions.unfriend') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -221,30 +221,29 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
ChatDotRound,
|
|
||||||
ChatLineRound,
|
|
||||||
Check,
|
Check,
|
||||||
CircleCheck,
|
CheckCircle,
|
||||||
CircleClose,
|
|
||||||
Close,
|
|
||||||
DataLine,
|
|
||||||
Delete,
|
|
||||||
Edit,
|
|
||||||
Flag,
|
Flag,
|
||||||
Message,
|
LineChart,
|
||||||
Microphone,
|
Mail,
|
||||||
Mute,
|
MessageCircle,
|
||||||
Operation,
|
MessageSquare,
|
||||||
|
Mic,
|
||||||
|
MoreHorizontal,
|
||||||
|
MousePointer,
|
||||||
|
Pencil,
|
||||||
Plus,
|
Plus,
|
||||||
Pointer,
|
Power,
|
||||||
Postcard,
|
RefreshCw,
|
||||||
Refresh,
|
Settings,
|
||||||
Share,
|
Share2,
|
||||||
SwitchButton,
|
Star,
|
||||||
|
Trash2,
|
||||||
User,
|
User,
|
||||||
UserFilled
|
VolumeX,
|
||||||
} from '@element-plus/icons-vue';
|
X,
|
||||||
import { MoreHorizontal as Ellipsis, Star } from 'lucide-vue-next';
|
XCircle
|
||||||
|
} from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
:style="{ color: user.$userColour }"
|
:style="{ color: user.$userColour }"
|
||||||
v-text="user.displayName"></span>
|
v-text="user.displayName"></span>
|
||||||
<span v-if="user.location === 'traveling'" class="extra">
|
<span v-if="user.location === 'traveling'" class="extra">
|
||||||
<el-icon class="is-loading" style="margin-right: 3px"><Loading /></el-icon>
|
<Loader2 class="is-loading" style="margin-right: 3px" />
|
||||||
<Timer :epoch="user.$travelingToTime" />
|
<Timer :epoch="user.$travelingToTime" />
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="extra">
|
<span v-else class="extra">
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
"
|
"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.user.info.vrcplus_hides_avatar')">
|
:content="t('dialog.user.info.vrcplus_hides_avatar')">
|
||||||
<el-icon><Warning /></el-icon>
|
<AlertTriangle />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -289,7 +289,7 @@
|
|||||||
<span class="name">
|
<span class="name">
|
||||||
{{ t('dialog.user.info.last_seen') }}
|
{{ t('dialog.user.info.last_seen') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span class="extra">{{ formatDateFilter(userDialog.lastSeen, 'long') }}</span>
|
<span class="extra">{{ formatDateFilter(userDialog.lastSeen, 'long') }}</span>
|
||||||
@@ -304,14 +304,14 @@
|
|||||||
<div>
|
<div>
|
||||||
{{ t('dialog.user.info.join_count') }}
|
{{ t('dialog.user.info.join_count') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.user.info.open_previous_instance')">
|
:content="t('dialog.user.info.open_previous_instance')">
|
||||||
<el-icon style="margin-right: 16px"><MoreFilled /></el-icon>
|
<MoreHorizontal style="margin-right: 16px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="userDialog.joinCount === 0" class="extra">-</span>
|
<span v-if="userDialog.joinCount === 0" class="extra">-</span>
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
<span class="name">
|
<span class="name">
|
||||||
{{ t('dialog.user.info.time_together') }}
|
{{ t('dialog.user.info.time_together') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span v-if="userDialog.timeSpent === 0" class="extra">-</span>
|
<span v-if="userDialog.timeSpent === 0" class="extra">-</span>
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
<span class="name">
|
<span class="name">
|
||||||
{{ t('dialog.user.info.play_time') }}
|
{{ t('dialog.user.info.play_time') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span v-if="userDialog.timeSpent === 0" class="extra">-</span>
|
<span v-if="userDialog.timeSpent === 0" class="extra">-</span>
|
||||||
@@ -362,13 +362,13 @@
|
|||||||
class="name">
|
class="name">
|
||||||
{{ t('dialog.user.info.online_for') }}
|
{{ t('dialog.user.info.online_for') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="name">
|
<span v-else class="name">
|
||||||
{{ t('dialog.user.info.offline_for') }}
|
{{ t('dialog.user.info.offline_for') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span class="extra">{{ userOnlineFor(userDialog.ref) }}</span>
|
<span class="extra">{{ userOnlineFor(userDialog.ref) }}</span>
|
||||||
@@ -415,13 +415,13 @@
|
|||||||
<span v-if="userDialog.unFriended" class="name">
|
<span v-if="userDialog.unFriended" class="name">
|
||||||
{{ t('dialog.user.info.unfriended') }}
|
{{ t('dialog.user.info.unfriended') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="name">
|
<span v-else class="name">
|
||||||
{{ t('dialog.user.info.friended') }}
|
{{ t('dialog.user.info.friended') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
<TooltipWrapper side="top" :content="t('dialog.user.info.accuracy_notice')">
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
<AlertTriangle style="margin-left: 3px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span class="extra">{{ formatDateFilter(userDialog.dateFriended, 'long') }}</span>
|
<span class="extra">{{ formatDateFilter(userDialog.dateFriended, 'long') }}</span>
|
||||||
@@ -562,7 +562,7 @@
|
|||||||
:disabled="userDialog.isMutualFriendsLoading"
|
:disabled="userDialog.isMutualFriendsLoading"
|
||||||
@click="getUserMutualFriends(userDialog.id)">
|
@click="getUserMutualFriends(userDialog.id)">
|
||||||
<Spinner v-if="userDialog.isMutualFriendsLoading" />
|
<Spinner v-if="userDialog.isMutualFriendsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="margin-left: 5px">{{
|
<span style="margin-left: 5px">{{
|
||||||
t('dialog.user.groups.total_count', { count: userDialog.mutualFriends.length })
|
t('dialog.user.groups.total_count', { count: userDialog.mutualFriends.length })
|
||||||
@@ -599,7 +599,7 @@
|
|||||||
color: #f56c6c;
|
color: #f56c6c;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
">
|
">
|
||||||
<el-icon style="margin-right: 5px"><Warning /></el-icon>
|
<AlertTriangle style="margin-right: 5px" />
|
||||||
<span>Mutual Friends unavailable due to VRChat staged rollout, click for more info</span>
|
<span>Mutual Friends unavailable due to VRChat staged rollout, click for more info</span>
|
||||||
</div>
|
</div>
|
||||||
<ul
|
<ul
|
||||||
@@ -633,7 +633,7 @@
|
|||||||
:disabled="userDialog.isGroupsLoading"
|
:disabled="userDialog.isGroupsLoading"
|
||||||
@click="getUserGroups(userDialog.id)">
|
@click="getUserGroups(userDialog.id)">
|
||||||
<Spinner v-if="userDialog.isGroupsLoading" />
|
<Spinner v-if="userDialog.isGroupsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="margin-left: 5px">{{
|
<span style="margin-left: 5px">{{
|
||||||
t('dialog.user.groups.total_count', { count: userGroups.groups.length })
|
t('dialog.user.groups.total_count', { count: userGroups.groups.length })
|
||||||
@@ -771,14 +771,14 @@
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
style="display: block; padding: 7px; font-size: 9px; margin-left: 0"
|
style="display: block; padding: 7px; font-size: 9px; margin-left: 0"
|
||||||
@click="moveGroupUp(group.id)">
|
@click="moveGroupUp(group.id)">
|
||||||
<Top />
|
<ArrowUp />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
size="icon-sm"
|
size="icon-sm"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
style="display: block; padding: 7px; font-size: 9px; margin-left: 0"
|
style="display: block; padding: 7px; font-size: 9px; margin-left: 0"
|
||||||
@click="moveGroupDown(group.id)">
|
@click="moveGroupDown(group.id)">
|
||||||
<Bottom />
|
<ArrowDown />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
@@ -791,7 +791,7 @@
|
|||||||
v-if="group.isRepresenting"
|
v-if="group.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="group.myMember?.visibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="group.myMember?.visibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -800,7 +800,7 @@
|
|||||||
{{ group.myMember.visibility }}</span
|
{{ group.myMember.visibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span>({{ group.memberCount }})</span>
|
<span>({{ group.memberCount }})</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -840,11 +840,11 @@
|
|||||||
setGroupSubscription(group.id, !group.myMember.isSubscribedToAnnouncements)
|
setGroupSubscription(group.id, !group.myMember.isSubscribedToAnnouncements)
|
||||||
">
|
">
|
||||||
<span v-if="group.myMember.isSubscribedToAnnouncements"
|
<span v-if="group.myMember.isSubscribedToAnnouncements"
|
||||||
><el-icon style="margin-left: 5px"><MuteNotification /></el-icon>
|
><BellOff style="margin-left: 5px" />
|
||||||
{{ t('dialog.group.tags.subscribed') }}</span
|
{{ t('dialog.group.tags.subscribed') }}</span
|
||||||
>
|
>
|
||||||
<span v-else
|
<span v-else
|
||||||
><el-icon style="margin-left: 5px"><Bell /></el-icon>
|
><Bell style="margin-left: 5px" />
|
||||||
{{ t('dialog.group.tags.unsubscribed') }}</span
|
{{ t('dialog.group.tags.unsubscribed') }}</span
|
||||||
>
|
>
|
||||||
</Button> -->
|
</Button> -->
|
||||||
@@ -899,7 +899,7 @@
|
|||||||
v-if="group.isRepresenting"
|
v-if="group.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -908,7 +908,7 @@
|
|||||||
{{ group.memberVisibility }}</span
|
{{ group.memberVisibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span>({{ group.memberCount }})</span>
|
<span>({{ group.memberCount }})</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -942,7 +942,7 @@
|
|||||||
v-if="group.isRepresenting"
|
v-if="group.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -951,7 +951,7 @@
|
|||||||
{{ group.memberVisibility }}</span
|
{{ group.memberVisibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span>({{ group.memberCount }})</span>
|
<span>({{ group.memberCount }})</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -993,7 +993,7 @@
|
|||||||
v-if="group.isRepresenting"
|
v-if="group.isRepresenting"
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('dialog.group.members.representing')">
|
:content="t('dialog.group.members.representing')">
|
||||||
<el-icon style="margin-right: 5px"><CollectionTag /></el-icon>
|
<Tag style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
<TooltipWrapper v-if="group.memberVisibility !== 'visible'" side="top">
|
||||||
<template #content>
|
<template #content>
|
||||||
@@ -1002,7 +1002,7 @@
|
|||||||
{{ group.memberVisibility }}</span
|
{{ group.memberVisibility }}</span
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
<el-icon style="margin-right: 5px"><View /></el-icon>
|
<Eye style="margin-right: 5px" />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span>({{ group.memberCount }})</span>
|
<span>({{ group.memberCount }})</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -1024,7 +1024,7 @@
|
|||||||
:disabled="userDialog.isWorldsLoading"
|
:disabled="userDialog.isWorldsLoading"
|
||||||
@click="refreshUserDialogWorlds()">
|
@click="refreshUserDialogWorlds()">
|
||||||
<Spinner v-if="userDialog.isWorldsLoading" />
|
<Spinner v-if="userDialog.isWorldsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="margin-left: 5px">{{
|
<span style="margin-left: 5px">{{
|
||||||
t('dialog.user.worlds.total_count', { count: userDialog.worlds.length })
|
t('dialog.user.worlds.total_count', { count: userDialog.worlds.length })
|
||||||
@@ -1094,7 +1094,7 @@
|
|||||||
type="default"
|
type="default"
|
||||||
:loading="userDialog.isFavoriteWorldsLoading"
|
:loading="userDialog.isFavoriteWorldsLoading"
|
||||||
size="small"
|
size="small"
|
||||||
:icon="Refresh"
|
:icon="RefreshCw"
|
||||||
circle
|
circle
|
||||||
style="position: absolute; right: 15px; bottom: 15px; z-index: 99"
|
style="position: absolute; right: 15px; bottom: 15px; z-index: 99"
|
||||||
@click="getUserFavoriteWorlds(userDialog.id)">
|
@click="getUserFavoriteWorlds(userDialog.id)">
|
||||||
@@ -1166,7 +1166,7 @@
|
|||||||
:disabled="userDialog.isAvatarsLoading"
|
:disabled="userDialog.isAvatarsLoading"
|
||||||
@click="refreshUserDialogAvatars()">
|
@click="refreshUserDialogAvatars()">
|
||||||
<Spinner v-if="userDialog.isAvatarsLoading" />
|
<Spinner v-if="userDialog.isAvatarsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
v-else
|
v-else
|
||||||
@@ -1176,7 +1176,7 @@
|
|||||||
:disabled="userDialog.isAvatarsLoading"
|
:disabled="userDialog.isAvatarsLoading"
|
||||||
@click="setUserDialogAvatarsRemote(userDialog.id)">
|
@click="setUserDialogAvatarsRemote(userDialog.id)">
|
||||||
<Spinner v-if="userDialog.isAvatarsLoading" />
|
<Spinner v-if="userDialog.isAvatarsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
<span style="margin-left: 5px">{{
|
<span style="margin-left: 5px">{{
|
||||||
t('dialog.user.avatars.total_count', { count: userDialogAvatars.length })
|
t('dialog.user.avatars.total_count', { count: userDialogAvatars.length })
|
||||||
@@ -1299,16 +1299,18 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
Bottom,
|
AlertTriangle,
|
||||||
CollectionTag,
|
ArrowDown,
|
||||||
Download as DownloadIcon,
|
ArrowUp,
|
||||||
Loading,
|
Download,
|
||||||
MoreFilled,
|
Eye,
|
||||||
Refresh,
|
Loader2,
|
||||||
Top,
|
LogOut,
|
||||||
View,
|
MoreHorizontal,
|
||||||
Warning
|
RefreshCcw,
|
||||||
} from '@element-plus/icons-vue';
|
RefreshCw,
|
||||||
|
Tag
|
||||||
|
} from 'lucide-vue-next';
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
||||||
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
||||||
import {
|
import {
|
||||||
@@ -1317,7 +1319,6 @@
|
|||||||
DropdownMenuItem,
|
DropdownMenuItem,
|
||||||
DropdownMenuTrigger
|
DropdownMenuTrigger
|
||||||
} from '@/components/ui/dropdown-menu';
|
} from '@/components/ui/dropdown-menu';
|
||||||
import { Download, LogOut, RefreshCcw } from 'lucide-vue-next';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
@@ -1800,19 +1801,19 @@
|
|||||||
if (D.visible === false) {
|
if (D.visible === false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (command === 'Refresh') {
|
if (command === 'RefreshCw') {
|
||||||
showUserDialog(D.id);
|
showUserDialog(D.id);
|
||||||
} else if (command === 'Share') {
|
} else if (command === 'Share2') {
|
||||||
copyUserURL(D.id);
|
copyUserURL(D.id);
|
||||||
} else if (command === 'Add Favorite') {
|
} else if (command === 'Add Favorite') {
|
||||||
showFavoriteDialog('friend', D.id);
|
showFavoriteDialog('friend', D.id);
|
||||||
} else if (command === 'Edit Social Status') {
|
} else if (command === 'Pencil Social Status') {
|
||||||
showSocialStatusDialog();
|
showSocialStatusDialog();
|
||||||
} else if (command === 'Edit Language') {
|
} else if (command === 'Pencil Language') {
|
||||||
showLanguageDialog();
|
showLanguageDialog();
|
||||||
} else if (command === 'Edit Bio') {
|
} else if (command === 'Pencil Bio') {
|
||||||
showBioDialog();
|
showBioDialog();
|
||||||
} else if (command === 'Edit Pronouns') {
|
} else if (command === 'Pencil Pronouns') {
|
||||||
showPronounsDialog();
|
showPronounsDialog();
|
||||||
} else if (command === 'Logout') {
|
} else if (command === 'Logout') {
|
||||||
logout();
|
logout();
|
||||||
@@ -1828,7 +1829,7 @@
|
|||||||
toast('Request invite sent');
|
toast('Request invite sent');
|
||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
} else if (command === 'Invite Message') {
|
} else if (command === 'Invite MessageSquare') {
|
||||||
L = parseLocation(lastLocation.value.location);
|
L = parseLocation(lastLocation.value.location);
|
||||||
worldRequest
|
worldRequest
|
||||||
.getCachedWorld({
|
.getCachedWorld({
|
||||||
@@ -1844,7 +1845,7 @@
|
|||||||
D.id
|
D.id
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
} else if (command === 'Request Invite Message') {
|
} else if (command === 'Request Invite MessageSquare') {
|
||||||
showSendInviteRequestDialog(
|
showSendInviteRequestDialog(
|
||||||
{
|
{
|
||||||
platform: 'standalonewindows'
|
platform: 'standalonewindows'
|
||||||
@@ -1909,7 +1910,7 @@
|
|||||||
} else {
|
} else {
|
||||||
setPlayerModeration(D.id, 5);
|
setPlayerModeration(D.id, 5);
|
||||||
}
|
}
|
||||||
} else if (command === 'Edit Note Memo') {
|
} else if (command === 'Pencil Note Memo') {
|
||||||
isEditNoteAndMemoDialogVisible.value = true;
|
isEditNoteAndMemoDialogVisible.value = true;
|
||||||
} else {
|
} else {
|
||||||
const i18nPreFix = 'dialog.user.actions.';
|
const i18nPreFix = 'dialog.user.actions.';
|
||||||
@@ -2003,7 +2004,7 @@
|
|||||||
let args;
|
let args;
|
||||||
let key;
|
let key;
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Delete Favorite':
|
case 'Trash2 Favorite':
|
||||||
favoriteRequest.deleteFavorite({
|
favoriteRequest.deleteFavorite({
|
||||||
objectId: userId
|
objectId: userId
|
||||||
});
|
});
|
||||||
@@ -2070,7 +2071,7 @@
|
|||||||
});
|
});
|
||||||
handlePlayerModerationDelete(args);
|
handlePlayerModerationDelete(args);
|
||||||
break;
|
break;
|
||||||
case 'Moderation Mute': {
|
case 'Moderation VolumeX': {
|
||||||
args = await playerModerationRequest.sendPlayerModeration({
|
args = await playerModerationRequest.sendPlayerModeration({
|
||||||
moderated: userId,
|
moderated: userId,
|
||||||
type: 'mute'
|
type: 'mute'
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-icon><CaretBottom /></el-icon>
|
<ChevronDown />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</template>
|
</template>
|
||||||
<span
|
<span
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { CaretBottom } from '@element-plus/icons-vue';
|
import { ChevronDown } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Upload } from '@element-plus/icons-vue';
|
import { Upload } from 'lucide-vue-next';
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
|
|||||||
@@ -21,14 +21,12 @@
|
|||||||
class="dialog-title"
|
class="dialog-title"
|
||||||
style="margin-right: 5px; cursor: pointer"
|
style="margin-right: 5px; cursor: pointer"
|
||||||
@click="copyWorldName">
|
@click="copyWorldName">
|
||||||
<el-icon
|
<Home
|
||||||
v-if="
|
v-if="
|
||||||
currentUser.$homeLocation &&
|
currentUser.$homeLocation &&
|
||||||
currentUser.$homeLocation.worldId === worldDialog.id
|
currentUser.$homeLocation.worldId === worldDialog.id
|
||||||
"
|
"
|
||||||
style="margin-right: 5px"
|
style="margin-right: 5px" />
|
||||||
><HomeFilled
|
|
||||||
/></el-icon>
|
|
||||||
{{ worldDialog.ref.name }}
|
{{ worldDialog.ref.name }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -198,12 +196,12 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuContent>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Refresh')">
|
<DropdownMenuItem @click="worldDialogCommand('RefreshCw')">
|
||||||
<Refresh class="size-4" />
|
<RefreshCw class="size-4" />
|
||||||
{{ t('dialog.world.actions.refresh') }}
|
{{ t('dialog.world.actions.refresh') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Share')">
|
<DropdownMenuItem @click="worldDialogCommand('Share2')">
|
||||||
<Share class="size-4" />
|
<Share2 class="size-4" />
|
||||||
{{ t('dialog.world.actions.share') }}
|
{{ t('dialog.world.actions.share') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
@@ -212,7 +210,7 @@
|
|||||||
{{ t('dialog.world.actions.new_instance') }}
|
{{ t('dialog.world.actions.new_instance') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('New Instance and Self Invite')">
|
<DropdownMenuItem @click="worldDialogCommand('New Instance and Self Invite')">
|
||||||
<Message class="size-4" />
|
<MessageSquare class="size-4" />
|
||||||
{{
|
{{
|
||||||
canOpenInstanceInGame
|
canOpenInstanceInGame
|
||||||
? t('dialog.world.actions.new_instance_and_open_ingame')
|
? t('dialog.world.actions.new_instance_and_open_ingame')
|
||||||
@@ -226,56 +224,56 @@
|
|||||||
currentUser.$homeLocation.worldId === worldDialog.id
|
currentUser.$homeLocation.worldId === worldDialog.id
|
||||||
"
|
"
|
||||||
@click="worldDialogCommand('Reset Home')">
|
@click="worldDialogCommand('Reset Home')">
|
||||||
<MagicStick class="size-4" />
|
<Wand2 class="size-4" />
|
||||||
{{ t('dialog.world.actions.reset_home') }}
|
{{ t('dialog.world.actions.reset_home') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="worldDialogCommand('Make Home')">
|
<DropdownMenuItem v-else @click="worldDialogCommand('Make Home')">
|
||||||
<HomeFilled class="size-4" />
|
<Home class="size-4" />
|
||||||
{{ t('dialog.world.actions.make_home') }}
|
{{ t('dialog.world.actions.make_home') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Previous Instances')">
|
<DropdownMenuItem @click="worldDialogCommand('Previous Instances')">
|
||||||
<DataLine class="size-4" />
|
<LineChart class="size-4" />
|
||||||
{{ t('dialog.world.actions.show_previous_instances') }}
|
{{ t('dialog.world.actions.show_previous_instances') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<template v-if="currentUser.id !== worldDialog.ref.authorId">
|
<template v-if="currentUser.id !== worldDialog.ref.authorId">
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
:disabled="!worldDialog.hasPersistData"
|
:disabled="!worldDialog.hasPersistData"
|
||||||
@click="worldDialogCommand('Delete Persistent Data')">
|
@click="worldDialogCommand('Trash2 Persistent Data')">
|
||||||
<Upload class="size-4" />
|
<Upload class="size-4" />
|
||||||
{{ t('dialog.world.actions.delete_persistent_data') }}
|
{{ t('dialog.world.actions.delete_persistent_data') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Rename')">
|
<DropdownMenuItem @click="worldDialogCommand('Rename')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.rename') }}
|
{{ t('dialog.world.actions.rename') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change Description')">
|
<DropdownMenuItem @click="worldDialogCommand('Change Description')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_description') }}
|
{{ t('dialog.world.actions.change_description') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change Capacity')">
|
<DropdownMenuItem @click="worldDialogCommand('Change Capacity')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_capacity') }}
|
{{ t('dialog.world.actions.change_capacity') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change Recommended Capacity')">
|
<DropdownMenuItem @click="worldDialogCommand('Change Recommended Capacity')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_recommended_capacity') }}
|
{{ t('dialog.world.actions.change_recommended_capacity') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change YouTube Preview')">
|
<DropdownMenuItem @click="worldDialogCommand('Change YouTube Preview')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_preview') }}
|
{{ t('dialog.world.actions.change_preview') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change Tags')">
|
<DropdownMenuItem @click="worldDialogCommand('Change Tags')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_warnings_settings_tags') }}
|
{{ t('dialog.world.actions.change_warnings_settings_tags') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem @click="worldDialogCommand('Change Allowed Domains')">
|
<DropdownMenuItem @click="worldDialogCommand('Change Allowed Domains')">
|
||||||
<Edit class="size-4" />
|
<Pencil class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_allowed_video_player_domains') }}
|
{{ t('dialog.world.actions.change_allowed_video_player_domains') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-if="isWindows" @click="worldDialogCommand('Change Image')">
|
<DropdownMenuItem v-if="isWindows" @click="worldDialogCommand('Change Image')">
|
||||||
<Picture class="size-4" />
|
<Image class="size-4" />
|
||||||
{{ t('dialog.world.actions.change_image') }}
|
{{ t('dialog.world.actions.change_image') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
@@ -291,21 +289,21 @@
|
|||||||
worldDialog.ref?.tags?.includes('system_labs')
|
worldDialog.ref?.tags?.includes('system_labs')
|
||||||
"
|
"
|
||||||
@click="worldDialogCommand('Unpublish')">
|
@click="worldDialogCommand('Unpublish')">
|
||||||
<View class="size-4" />
|
<Eye class="size-4" />
|
||||||
{{ t('dialog.world.actions.unpublish') }}
|
{{ t('dialog.world.actions.unpublish') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem v-else @click="worldDialogCommand('Publish')">
|
<DropdownMenuItem v-else @click="worldDialogCommand('Publish')">
|
||||||
<View class="size-4" />
|
<Eye class="size-4" />
|
||||||
{{ t('dialog.world.actions.publish_to_labs') }}
|
{{ t('dialog.world.actions.publish_to_labs') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
:disabled="!worldDialog.hasPersistData"
|
:disabled="!worldDialog.hasPersistData"
|
||||||
@click="worldDialogCommand('Delete Persistent Data')">
|
@click="worldDialogCommand('Trash2 Persistent Data')">
|
||||||
<Upload class="size-4" />
|
<Upload class="size-4" />
|
||||||
{{ t('dialog.world.actions.delete_persistent_data') }}
|
{{ t('dialog.world.actions.delete_persistent_data') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem variant="destructive" @click="worldDialogCommand('Delete')">
|
<DropdownMenuItem variant="destructive" @click="worldDialogCommand('Trash2')">
|
||||||
<Delete class="size-4" />
|
<Trash2 class="size-4" />
|
||||||
{{ t('dialog.world.actions.delete') }}
|
{{ t('dialog.world.actions.delete') }}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</template>
|
</template>
|
||||||
@@ -320,16 +318,16 @@
|
|||||||
:unmount-on-hide="false"
|
:unmount-on-hide="false"
|
||||||
@update:modelValue="worldDialogTabClick">
|
@update:modelValue="worldDialogTabClick">
|
||||||
<template #Instances>
|
<template #Instances>
|
||||||
<div class="">
|
<div>
|
||||||
<el-icon><User /></el-icon>
|
<User />
|
||||||
{{ t('dialog.world.instances.public_count', { count: worldDialog.ref.publicOccupants }) }}
|
{{ t('dialog.world.instances.public_count', { count: worldDialog.ref.publicOccupants }) }}
|
||||||
<el-icon style="margin-left: 10px"><UserFilled /></el-icon>
|
<User style="margin-left: 10px" />
|
||||||
{{
|
{{
|
||||||
t('dialog.world.instances.private_count', {
|
t('dialog.world.instances.private_count', {
|
||||||
count: worldDialog.ref.privateOccupants
|
count: worldDialog.ref.privateOccupants
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
<el-icon style="margin-left: 10px"><Check /></el-icon>
|
<Check style="margin-left: 10px" />
|
||||||
{{
|
{{
|
||||||
t('dialog.world.instances.capacity_count', {
|
t('dialog.world.instances.capacity_count', {
|
||||||
count: worldDialog.ref.recommendedCapacity,
|
count: worldDialog.ref.recommendedCapacity,
|
||||||
@@ -419,9 +417,7 @@
|
|||||||
:style="{ color: user.$userColour }"
|
:style="{ color: user.$userColour }"
|
||||||
v-text="user.displayName" />
|
v-text="user.displayName" />
|
||||||
<span v-if="user.location === 'traveling'" class="extra">
|
<span v-if="user.location === 'traveling'" class="extra">
|
||||||
<el-icon class="is-loading" style="margin-right: 3px"
|
<Loader2 class="is-loading" style="margin-right: 3px" />
|
||||||
><Loading
|
|
||||||
/></el-icon>
|
|
||||||
<Timer :epoch="user.$travelingToTime" />
|
<Timer :epoch="user.$travelingToTime" />
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="extra">
|
<span v-else class="extra">
|
||||||
@@ -615,7 +611,7 @@
|
|||||||
{{ timeInLab }}
|
{{ timeInLab }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
<el-icon><ArrowDown /></el-icon>
|
<ArrowDown />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span class="extra">
|
<span class="extra">
|
||||||
{{ formatDateFilter(worldDialog.ref.publicationDate, 'long') }}
|
{{ formatDateFilter(worldDialog.ref.publicationDate, 'long') }}
|
||||||
@@ -664,33 +660,7 @@
|
|||||||
<span class="name">
|
<span class="name">
|
||||||
{{ t('dialog.world.info.last_visited') }}
|
{{ t('dialog.world.info.last_visited') }}
|
||||||
<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')"
|
<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')"
|
||||||
><el-icon style="margin-left: 3px"><Warning /></el-icon
|
><AlertTriangle style="margin-left: 3px" />
|
||||||
></TooltipWrapper>
|
|
||||||
</span>
|
|
||||||
<span class="extra">{{ formatDateFilter(worldDialog.lastVisit, 'long') }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<TooltipWrapper side="top" :content="t('dialog.user.info.open_previous_instance')">
|
|
||||||
<div class="x-friend-item" @click="showPreviousInstancesWorldDialog(worldDialog.ref)">
|
|
||||||
<div class="detail">
|
|
||||||
<span class="name">
|
|
||||||
{{ t('dialog.world.info.visit_count') }}
|
|
||||||
<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')"
|
|
||||||
><el-icon style="margin-left: 3px"><Warning /></el-icon
|
|
||||||
></TooltipWrapper>
|
|
||||||
</span>
|
|
||||||
<span class="extra">
|
|
||||||
{{ worldDialog.visitCount }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</TooltipWrapper>
|
|
||||||
<div class="x-friend-item" style="cursor: default">
|
|
||||||
<div class="detail">
|
|
||||||
<span class="name"
|
|
||||||
>{{ t('dialog.world.info.time_spent') }}
|
|
||||||
<TooltipWrapper side="top" :content="t('dialog.world.info.accuracy_notice')">
|
|
||||||
<el-icon style="margin-left: 3px"><Warning /></el-icon>
|
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<span class="extra">
|
<span class="extra">
|
||||||
@@ -747,28 +717,29 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
|
AlertTriangle,
|
||||||
ArrowDown,
|
ArrowDown,
|
||||||
Check,
|
Check,
|
||||||
DataLine,
|
|
||||||
Delete,
|
|
||||||
Download,
|
Download,
|
||||||
Edit,
|
Ellipsis,
|
||||||
|
Eye,
|
||||||
Flag,
|
Flag,
|
||||||
HomeFilled,
|
Home,
|
||||||
Loading,
|
Image,
|
||||||
MagicStick,
|
LineChart,
|
||||||
Message,
|
Loader2,
|
||||||
Picture,
|
MessageSquare,
|
||||||
Refresh,
|
Pencil,
|
||||||
Share,
|
RefreshCcw,
|
||||||
|
RefreshCw,
|
||||||
|
Share2,
|
||||||
|
Star,
|
||||||
|
Trash2,
|
||||||
Upload,
|
Upload,
|
||||||
User,
|
User,
|
||||||
UserFilled,
|
Wand2
|
||||||
View,
|
} from 'lucide-vue-next';
|
||||||
Warning
|
|
||||||
} from '@element-plus/icons-vue';
|
|
||||||
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
import { computed, defineAsyncComponent, nextTick, ref, watch } from 'vue';
|
||||||
import { Ellipsis, RefreshCcw, Star, Trash2 } from 'lucide-vue-next';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
@@ -993,13 +964,13 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Delete Favorite':
|
case 'Trash2 Favorite':
|
||||||
case 'Make Home':
|
case 'Make Home':
|
||||||
case 'Reset Home':
|
case 'Reset Home':
|
||||||
case 'Publish':
|
case 'Publish':
|
||||||
case 'Unpublish':
|
case 'Unpublish':
|
||||||
case 'Delete Persistent Data':
|
case 'Trash2 Persistent Data':
|
||||||
case 'Delete':
|
case 'Trash2':
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Continue? ${command}`,
|
description: `Continue? ${command}`,
|
||||||
@@ -1008,7 +979,7 @@
|
|||||||
.then(({ ok }) => {
|
.then(({ ok }) => {
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'Delete Favorite':
|
case 'Trash2 Favorite':
|
||||||
favoriteRequest.deleteFavorite({
|
favoriteRequest.deleteFavorite({
|
||||||
objectId: D.id
|
objectId: D.id
|
||||||
});
|
});
|
||||||
@@ -1053,7 +1024,7 @@
|
|||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'Delete Persistent Data':
|
case 'Trash2 Persistent Data':
|
||||||
miscRequest
|
miscRequest
|
||||||
.deleteWorldPersistData({
|
.deleteWorldPersistData({
|
||||||
worldId: D.id
|
worldId: D.id
|
||||||
@@ -1066,7 +1037,7 @@
|
|||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'Delete':
|
case 'Trash2':
|
||||||
worldRequest
|
worldRequest
|
||||||
.deleteWorld({
|
.deleteWorld({
|
||||||
worldId: D.id
|
worldId: D.id
|
||||||
@@ -1096,7 +1067,7 @@
|
|||||||
case 'Previous Instances':
|
case 'Previous Instances':
|
||||||
showPreviousInstancesWorldDialog(D.ref);
|
showPreviousInstancesWorldDialog(D.ref);
|
||||||
break;
|
break;
|
||||||
case 'Share':
|
case 'Share2':
|
||||||
copyWorldUrl();
|
copyWorldUrl();
|
||||||
break;
|
break;
|
||||||
case 'Change Allowed Domains':
|
case 'Change Allowed Domains':
|
||||||
@@ -1111,7 +1082,7 @@
|
|||||||
case 'Change Image':
|
case 'Change Image':
|
||||||
showChangeWorldImageDialog();
|
showChangeWorldImageDialog();
|
||||||
break;
|
break;
|
||||||
case 'Refresh':
|
case 'RefreshCw':
|
||||||
showWorldDialog(D.id);
|
showWorldDialog(D.id);
|
||||||
break;
|
break;
|
||||||
case 'New Instance':
|
case 'New Instance':
|
||||||
|
|||||||
@@ -133,7 +133,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.lucide {
|
.lucide {
|
||||||
width: 16px;
|
width: 1em;
|
||||||
height: 16px;
|
height: 1em;
|
||||||
stroke-width: 1.5px;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<span>{{ t('view.charts.instance_activity.header') }}</span>
|
<span>{{ t('view.charts.instance_activity.header') }}</span>
|
||||||
<HoverCard>
|
<HoverCard>
|
||||||
<HoverCardTrigger as-child>
|
<HoverCardTrigger as-child>
|
||||||
<el-icon style="margin-left: 5px; font-size: 12px; opacity: 0.7"><InfoFilled /></el-icon>
|
<Info style="margin-left: 5px; font-size: 12px; opacity: 0.7" />
|
||||||
</HoverCardTrigger>
|
</HoverCardTrigger>
|
||||||
<HoverCardContent side="bottom" align="start" class="w-[300px]">
|
<HoverCardContent side="bottom" align="start" class="w-[300px]">
|
||||||
<div class="tips-popover">
|
<div class="tips-popover">
|
||||||
@@ -13,8 +13,8 @@
|
|||||||
<div>{{ t('view.charts.instance_activity.tips.click_Y_axis') }}</div>
|
<div>{{ t('view.charts.instance_activity.tips.click_Y_axis') }}</div>
|
||||||
<div>{{ t('view.charts.instance_activity.tips.click_instance_name') }}</div>
|
<div>{{ t('view.charts.instance_activity.tips.click_instance_name') }}</div>
|
||||||
<div>
|
<div>
|
||||||
<el-icon><WarningFilled /></el-icon
|
<AlertTriangle />
|
||||||
><i>{{ t('view.charts.instance_activity.tips.accuracy_notice') }}</i>
|
<i>{{ t('view.charts.instance_activity.tips.accuracy_notice') }}</i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</HoverCardContent>
|
</HoverCardContent>
|
||||||
@@ -145,9 +145,8 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||||
import { ArrowLeft, ArrowRight, InfoFilled, WarningFilled } from '@element-plus/icons-vue';
|
import { AlertTriangle, ArrowLeft, ArrowRight, Info, RefreshCcw, Settings } from 'lucide-vue-next';
|
||||||
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card';
|
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card';
|
||||||
import { RefreshCcw, Settings } from 'lucide-vue-next';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ButtonGroup } from '@/components/ui/button-group';
|
import { ButtonGroup } from '@/components/ui/button-group';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
@@ -671,9 +670,6 @@
|
|||||||
margin-right: 3px;
|
margin-right: 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
& .el-icon-warning-outline {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.settings {
|
.settings {
|
||||||
& > div {
|
& > div {
|
||||||
|
|||||||
@@ -97,7 +97,7 @@
|
|||||||
:disabled="isFavoriteLoading"
|
:disabled="isFavoriteLoading"
|
||||||
@click.stop="handleRefreshFavorites">
|
@click.stop="handleRefreshFavorites">
|
||||||
<Spinner v-if="isFavoriteLoading" />
|
<Spinner v-if="isFavoriteLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
">
|
">
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
||||||
<MoreFilled />
|
<MoreHorizontal />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent side="right" class="w-55 p-1 rounded-lg">
|
<DropdownMenuContent side="right" class="w-55 p-1 rounded-lg">
|
||||||
@@ -290,7 +290,7 @@
|
|||||||
{ 'is-disabled': !isLocalUserVrcPlusSupporter }
|
{ 'is-disabled': !isLocalUserVrcPlusSupporter }
|
||||||
]"
|
]"
|
||||||
@click="startLocalGroupCreation">
|
@click="startLocalGroupCreation">
|
||||||
<el-icon><Plus /></el-icon>
|
<Plus />
|
||||||
<span>{{ t('view.favorite.avatars.new_group') }}</span>
|
<span>{{ t('view.favorite.avatars.new_group') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
@@ -526,8 +526,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, markRaw, nextTick, onBeforeMount, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';
|
import { computed, markRaw, nextTick, onBeforeMount, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';
|
||||||
import { Ellipsis, Loader, RefreshCcw } from 'lucide-vue-next';
|
import { Ellipsis, Loader, MoreHorizontal, Plus, RefreshCcw, RefreshCw } from 'lucide-vue-next';
|
||||||
import { MoreFilled, Plus, Refresh } from '@element-plus/icons-vue';
|
|
||||||
import { InputGroupField, InputGroupSearch } from '@/components/ui/input-group';
|
import { InputGroupField, InputGroupSearch } from '@/components/ui/input-group';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
@@ -1194,7 +1193,7 @@
|
|||||||
|
|
||||||
const result = await modalStore.confirm({
|
const result = await modalStore.confirm({
|
||||||
description: `Are you sure you want to unfavorite ${total} favorites?\nThis action cannot be undone.`,
|
description: `Are you sure you want to unfavorite ${total} favorites?\nThis action cannot be undone.`,
|
||||||
title: `Delete ${total} favorites?`
|
title: `Trash2 ${total} favorites?`
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result.ok) {
|
if (!result.ok) {
|
||||||
@@ -1448,7 +1447,7 @@
|
|||||||
function promptLocalAvatarFavoriteGroupDelete(group) {
|
function promptLocalAvatarFavoriteGroupDelete(group) {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Delete Group? ${group}`,
|
description: `Trash2 Group? ${group}`,
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(() => deleteLocalAvatarFavoriteGroup(group))
|
.then(() => deleteLocalAvatarFavoriteGroup(group))
|
||||||
|
|||||||
@@ -97,7 +97,7 @@
|
|||||||
:disabled="isFavoriteLoading"
|
:disabled="isFavoriteLoading"
|
||||||
@click.stop="handleRefreshFavorites">
|
@click.stop="handleRefreshFavorites">
|
||||||
<Spinner v-if="isFavoriteLoading" />
|
<Spinner v-if="isFavoriteLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -106,10 +106,7 @@
|
|||||||
<div
|
<div
|
||||||
v-for="group in favoriteFriendGroups"
|
v-for="group in favoriteFriendGroups"
|
||||||
:key="group.key"
|
:key="group.key"
|
||||||
:class="[
|
:class="[ 'group-item', { 'is-active': !hasSearchInput && isGroupActive('remote', group.key) } ]"
|
||||||
'group-item',
|
|
||||||
{ 'is-active': !hasSearchInput && isGroupActive('remote', group.key) }
|
|
||||||
]"
|
|
||||||
@click="handleGroupClick('remote', group.key)">
|
@click="handleGroupClick('remote', group.key)">
|
||||||
<div class="group-item__top">
|
<div class="group-item__top">
|
||||||
<span class="group-item__name">{{ group.displayName }}</span>
|
<span class="group-item__name">{{ group.displayName }}</span>
|
||||||
@@ -126,7 +123,7 @@
|
|||||||
">
|
">
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
||||||
<MoreFilled />
|
<MoreHorizontal />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent side="right" class="w-55 p-1 rounded-lg">
|
<DropdownMenuContent side="right" class="w-55 p-1 rounded-lg">
|
||||||
@@ -152,13 +149,7 @@
|
|||||||
v-for="visibility in friendGroupVisibilityOptions"
|
v-for="visibility in friendGroupVisibilityOptions"
|
||||||
:key="visibility"
|
:key="visibility"
|
||||||
type="button"
|
type="button"
|
||||||
:class="[
|
:class="[ 'group-visibility-menu__item', { 'is-active': group.visibility === visibility } ]"
|
||||||
'group-visibility-menu__item',
|
|
||||||
{
|
|
||||||
'is-active':
|
|
||||||
group.visibility === visibility
|
|
||||||
}
|
|
||||||
]"
|
|
||||||
@click="
|
@click="
|
||||||
handleVisibilitySelection(group, visibility)
|
handleVisibilitySelection(group, visibility)
|
||||||
">
|
">
|
||||||
@@ -310,7 +301,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, nextTick, onBeforeMount, onMounted, onUnmounted, ref, watch } from 'vue';
|
import { computed, nextTick, onBeforeMount, onMounted, onUnmounted, ref, watch } from 'vue';
|
||||||
import { MoreFilled, Refresh } from '@element-plus/icons-vue';
|
import { MoreHorizontal, RefreshCw } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
import { Ellipsis } from 'lucide-vue-next';
|
import { Ellipsis } from 'lucide-vue-next';
|
||||||
@@ -762,7 +753,7 @@
|
|||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Are you sure you want to unfavorite ${total} favorites?\n This action cannot be undone.`,
|
description: `Are you sure you want to unfavorite ${total} favorites?\n This action cannot be undone.`,
|
||||||
title: `Delete ${total} favorites?`
|
title: `Trash2 ${total} favorites?`
|
||||||
})
|
})
|
||||||
.then(({ ok }) => ok && bulkUnfavoriteSelectedFriends([...selectedFavoriteFriends.value]))
|
.then(({ ok }) => ok && bulkUnfavoriteSelectedFriends([...selectedFavoriteFriends.value]))
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
|
|||||||
@@ -97,7 +97,7 @@
|
|||||||
:disabled="isFavoriteLoading"
|
:disabled="isFavoriteLoading"
|
||||||
@click.stop="handleRefreshFavorites">
|
@click.stop="handleRefreshFavorites">
|
||||||
<Spinner v-if="isFavoriteLoading" />
|
<Spinner v-if="isFavoriteLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
">
|
">
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
<Button class="rounded-full" variant="ghost" size="icon-sm" @click.stop>
|
||||||
<MoreFilled />
|
<MoreHorizontal />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent side="right" class="w-50 p-1 rounded-lg">
|
<DropdownMenuContent side="right" class="w-50 p-1 rounded-lg">
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
v-if="!isCreatingLocalGroup"
|
v-if="!isCreatingLocalGroup"
|
||||||
class="group-item group-item--new"
|
class="group-item group-item--new"
|
||||||
@click="startLocalGroupCreation">
|
@click="startLocalGroupCreation">
|
||||||
<el-icon><Plus /></el-icon>
|
<Plus />
|
||||||
<span>{{ t('view.favorite.worlds.new_group') }}</span>
|
<span>{{ t('view.favorite.worlds.new_group') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<InputGroupField
|
<InputGroupField
|
||||||
@@ -437,8 +437,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||||
import { MoreFilled, Plus, Refresh } from '@element-plus/icons-vue';
|
import { Ellipsis, MoreHorizontal, Plus, RefreshCcw, RefreshCw } from 'lucide-vue-next';
|
||||||
import { Ellipsis, RefreshCcw } from 'lucide-vue-next';
|
|
||||||
import { InputGroupField, InputGroupSearch } from '@/components/ui/input-group';
|
import { InputGroupField, InputGroupSearch } from '@/components/ui/input-group';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
@@ -1063,7 +1062,7 @@
|
|||||||
.confirm({
|
.confirm({
|
||||||
description: `Are you sure you want to unfavorite ${total} favorites?
|
description: `Are you sure you want to unfavorite ${total} favorites?
|
||||||
This action cannot be undone.`,
|
This action cannot be undone.`,
|
||||||
title: `Delete ${total} favorites?`
|
title: `Trash2 ${total} favorites?`
|
||||||
})
|
})
|
||||||
.then(() => bulkUnfavoriteSelectedWorlds([...selectedFavoriteWorlds.value]))
|
.then(() => bulkUnfavoriteSelectedWorlds([...selectedFavoriteWorlds.value]))
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
@@ -1174,7 +1173,7 @@
|
|||||||
function promptLocalWorldFavoriteGroupDelete(group) {
|
function promptLocalWorldFavoriteGroupDelete(group) {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Delete Group? ${group}`,
|
description: `Trash2 Group? ${group}`,
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(() => deleteLocalWorldFavoriteGroup(group))
|
.then(() => deleteLocalWorldFavoriteGroup(group))
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div v-if="avatarImportDialog.progress">
|
<div v-if="avatarImportDialog.progress">
|
||||||
{{ t('dialog.avatar_import.process_progress') }} {{ avatarImportDialog.progress }} /
|
{{ t('dialog.avatar_import.process_progress') }} {{ avatarImportDialog.progress }} /
|
||||||
{{ avatarImportDialog.progressTotal }}
|
{{ avatarImportDialog.progressTotal }}
|
||||||
<el-icon style="margin: 0 5px"><Loading /></el-icon>
|
<Loader2 style="margin: 0 5px" />
|
||||||
</div>
|
</div>
|
||||||
<Button v-if="avatarImportDialog.loading" size="sm" variant="secondary" @click="cancelAvatarImport">
|
<Button v-if="avatarImportDialog.loading" size="sm" variant="secondary" @click="cancelAvatarImport">
|
||||||
{{ t('dialog.avatar_import.cancel') }}
|
{{ t('dialog.avatar_import.cancel') }}
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="avatarImportDialog.importProgress" style="margin: 10px">
|
<span v-if="avatarImportDialog.importProgress" style="margin: 10px">
|
||||||
<el-icon style="margin-right: 5px"><Loading /></el-icon>
|
<Loader2 style="margin-right: 5px" />
|
||||||
{{ t('dialog.avatar_import.import_progress') }}
|
{{ t('dialog.avatar_import.import_progress') }}
|
||||||
{{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }}
|
{{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }}
|
||||||
</span>
|
</span>
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { DataTableLayout } from '@/components/ui/data-table';
|
import { DataTableLayout } from '@/components/ui/data-table';
|
||||||
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
import { Loader2 } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div v-if="friendImportDialog.progress">
|
<div v-if="friendImportDialog.progress">
|
||||||
{{ t('dialog.friend_import.process_progress') }} {{ friendImportDialog.progress }} /
|
{{ t('dialog.friend_import.process_progress') }} {{ friendImportDialog.progress }} /
|
||||||
{{ friendImportDialog.progressTotal }}
|
{{ friendImportDialog.progressTotal }}
|
||||||
<el-icon style="margin: 0 5px"><Loading /></el-icon>
|
<Loader2 style="margin: 0 5px" />
|
||||||
</div>
|
</div>
|
||||||
<Button v-if="friendImportDialog.loading" size="sm" variant="secondary" @click="cancelFriendImport">
|
<Button v-if="friendImportDialog.loading" size="sm" variant="secondary" @click="cancelFriendImport">
|
||||||
{{ t('dialog.friend_import.cancel') }}
|
{{ t('dialog.friend_import.cancel') }}
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="friendImportDialog.importProgress" style="margin: 10px">
|
<span v-if="friendImportDialog.importProgress" style="margin: 10px">
|
||||||
<el-icon style="margin-right: 5px"><Loading /></el-icon>
|
<Loader2 style="margin-right: 5px" />
|
||||||
{{ t('dialog.friend_import.import_progress') }} {{ friendImportDialog.importProgress }}/{{
|
{{ t('dialog.friend_import.import_progress') }} {{ friendImportDialog.importProgress }}/{{
|
||||||
friendImportDialog.importProgressTotal
|
friendImportDialog.importProgressTotal
|
||||||
}}
|
}}
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { DataTableLayout } from '@/components/ui/data-table';
|
import { DataTableLayout } from '@/components/ui/data-table';
|
||||||
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
import { Loader2 } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div v-if="worldImportDialog.progress">
|
<div v-if="worldImportDialog.progress">
|
||||||
{{ t('dialog.world_import.process_progress') }}
|
{{ t('dialog.world_import.process_progress') }}
|
||||||
{{ worldImportDialog.progress }} / {{ worldImportDialog.progressTotal }}
|
{{ worldImportDialog.progress }} / {{ worldImportDialog.progressTotal }}
|
||||||
<el-icon style="margin: 0 5px"><Loading /></el-icon>
|
<Loader2 style="margin: 0 5px" />
|
||||||
</div>
|
</div>
|
||||||
<Button v-if="worldImportDialog.loading" size="sm" variant="outline" @click="cancelWorldImport">
|
<Button v-if="worldImportDialog.loading" size="sm" variant="outline" @click="cancelWorldImport">
|
||||||
{{ t('dialog.world_import.cancel') }}
|
{{ t('dialog.world_import.cancel') }}
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="worldImportDialog.importProgress" style="margin: 10px">
|
<span v-if="worldImportDialog.importProgress" style="margin: 10px">
|
||||||
<el-icon style="margin-right: 5px"><Loading /></el-icon>
|
<Loader2 style="margin-right: 5px" />
|
||||||
{{ t('dialog.world_import.import_progress') }}
|
{{ t('dialog.world_import.import_progress') }}
|
||||||
{{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }}
|
{{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }}
|
||||||
</span>
|
</span>
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { DataTableLayout } from '@/components/ui/data-table';
|
import { DataTableLayout } from '@/components/ui/data-table';
|
||||||
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
import { InputGroupTextareaField } from '@/components/ui/input-group';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
import { Loader2 } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|||||||
@@ -148,16 +148,12 @@
|
|||||||
<div v-else class="friend-view__empty">{{ t('view.friends_locations.no_matching_friends') }}</div>
|
<div v-else class="friend-view__empty">{{ t('view.friends_locations.no_matching_friends') }}</div>
|
||||||
</template>
|
</template>
|
||||||
<div v-if="isLoadingMore" class="friend-view__loading">
|
<div v-if="isLoadingMore" class="friend-view__loading">
|
||||||
<el-icon class="friend-view__loading-icon" :size="18">
|
<Loader2 class="friend-view__loading-icon" :size="18" />
|
||||||
<Loading />
|
|
||||||
</el-icon>
|
|
||||||
<span>{{ t('view.friends_locations.loading_more') }}</span>
|
<span>{{ t('view.friends_locations.loading_more') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
<div v-else class="friend-view__initial-loading">
|
<div v-else class="friend-view__initial-loading">
|
||||||
<el-icon class="friend-view__loading-icon" :size="22">
|
<Loader2 class="friend-view__loading-icon" :size="22" />
|
||||||
<Loading />
|
|
||||||
</el-icon>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -165,10 +161,9 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
import { computed, nextTick, onBeforeMount, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||||
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
||||||
|
import { Loader2, Settings } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InputGroupSearch } from '@/components/ui/input-group';
|
import { InputGroupSearch } from '@/components/ui/input-group';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
|
||||||
import { Settings } from 'lucide-vue-next';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
:disabled="playerModerationTable.loading"
|
:disabled="playerModerationTable.loading"
|
||||||
@click="refreshPlayerModerations()">
|
@click="refreshPlayerModerations()">
|
||||||
<Spinner v-if="playerModerationTable.loading" />
|
<Spinner v-if="playerModerationTable.loading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InputGroupField } from '@/components/ui/input-group';
|
import { InputGroupField } from '@/components/ui/input-group';
|
||||||
import { Refresh } from '@element-plus/icons-vue';
|
import { RefreshCw } from 'lucide-vue-next';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
function deletePlayerModerationPrompt(row) {
|
function deletePlayerModerationPrompt(row) {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Continue? Delete Moderation ${row.type}`,
|
description: `Continue? Trash2 Moderation ${row.type}`,
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(({ ok }) => ok && deletePlayerModeration(row))
|
.then(({ ok }) => ok && deletePlayerModeration(row))
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
style="flex: none"
|
style="flex: none"
|
||||||
@click="refreshNotifications()">
|
@click="refreshNotifications()">
|
||||||
<Spinner v-if="isNotificationsLoading" />
|
<Spinner v-if="isNotificationsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InputGroupField } from '@/components/ui/input-group';
|
import { InputGroupField } from '@/components/ui/input-group';
|
||||||
import { Refresh } from '@element-plus/icons-vue';
|
import { RefreshCw } from 'lucide-vue-next';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
@@ -483,7 +483,7 @@
|
|||||||
function deleteNotificationLogPrompt(row) {
|
function deleteNotificationLogPrompt(row) {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: `Continue? Delete ${row.type}`,
|
description: `Continue? Trash2 ${row.type}`,
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(({ ok }) => {
|
.then(({ ok }) => {
|
||||||
|
|||||||
@@ -25,14 +25,12 @@
|
|||||||
line-clamp: 1;
|
line-clamp: 1;
|
||||||
"
|
"
|
||||||
@click="showWorldDialog(currentInstanceWorld.ref.id)">
|
@click="showWorldDialog(currentInstanceWorld.ref.id)">
|
||||||
<el-icon
|
<Home
|
||||||
v-if="
|
v-if="
|
||||||
currentUser.$homeLocation &&
|
currentUser.$homeLocation &&
|
||||||
currentUser.$homeLocation.worldId === currentInstanceWorld.ref.id
|
currentUser.$homeLocation.worldId === currentInstanceWorld.ref.id
|
||||||
"
|
"
|
||||||
style="margin-right: 5px"
|
style="margin-right: 5px" />
|
||||||
><HomeFilled
|
|
||||||
/></el-icon>
|
|
||||||
{{ currentInstanceWorld.ref.name }}
|
{{ currentInstanceWorld.ref.name }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -169,7 +167,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, defineAsyncComponent, onActivated, onMounted, ref, watch } from 'vue';
|
import { computed, defineAsyncComponent, onActivated, onMounted, ref, watch } from 'vue';
|
||||||
import { HomeFilled } from '@element-plus/icons-vue';
|
import { Home } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ArrowRight, Download } from '@element-plus/icons-vue';
|
import { ArrowRight, Download } from 'lucide-vue-next';
|
||||||
|
|
||||||
import Location from '@/components/Location.vue';
|
import Location from '@/components/Location.vue';
|
||||||
import { TooltipWrapper } from '@/components/ui/tooltip';
|
import { TooltipWrapper } from '@/components/ui/tooltip';
|
||||||
@@ -46,9 +46,7 @@ function DetailCell({ row, isPrevious, onShowAvatar, onShowGroup, onShowWorld, o
|
|||||||
|
|
||||||
{!r.inCache ? (
|
{!r.inCache ? (
|
||||||
<span style="color: #aaa">
|
<span style="color: #aaa">
|
||||||
<el-icon>
|
<Download />
|
||||||
<Download />
|
|
||||||
</el-icon>
|
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
@@ -90,9 +88,7 @@ function DetailCell({ row, isPrevious, onShowAvatar, onShowGroup, onShowWorld, o
|
|||||||
></i>
|
></i>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span>
|
<span>
|
||||||
<el-icon>
|
<ArrowRight / />
|
||||||
<ArrowRight />
|
|
||||||
</el-icon>
|
|
||||||
</span>
|
</span>
|
||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
side="top"
|
side="top"
|
||||||
@@ -130,9 +126,7 @@ function DetailCell({ row, isPrevious, onShowAvatar, onShowGroup, onShowWorld, o
|
|||||||
{r.previousGroupName || r.previousGroupId}
|
{r.previousGroupName || r.previousGroupId}
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<el-icon>
|
<ArrowRight / />
|
||||||
<ArrowRight />
|
|
||||||
</el-icon>
|
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="x-link"
|
class="x-link"
|
||||||
@@ -198,9 +192,7 @@ function DetailCell({ row, isPrevious, onShowAvatar, onShowGroup, onShowWorld, o
|
|||||||
|
|
||||||
{!r.inCache ? (
|
{!r.inCache ? (
|
||||||
<span style="color: #aaa">
|
<span style="color: #aaa">
|
||||||
<el-icon>
|
<Download / />
|
||||||
<Download />
|
|
||||||
</el-icon>
|
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
+10
-11
@@ -60,7 +60,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!searchUserParams.offset"
|
:disabled="!searchUserParams.offset"
|
||||||
@click="handleMoreSearchUser(-1)">
|
@click="handleMoreSearchUser(-1)">
|
||||||
<Back />
|
<ArrowLeft />
|
||||||
{{ t('view.search.prev_page') }}
|
{{ t('view.search.prev_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="searchUserResults.length < 10"
|
:disabled="searchUserResults.length < 10"
|
||||||
@click="handleMoreSearchUser(1)">
|
@click="handleMoreSearchUser(1)">
|
||||||
<Right />
|
<ArrowRight />
|
||||||
{{ t('view.search.next_page') }}
|
{{ t('view.search.next_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!searchWorldParams.offset"
|
:disabled="!searchWorldParams.offset"
|
||||||
@click="moreSearchWorld(-1)">
|
@click="moreSearchWorld(-1)">
|
||||||
<Back />
|
<ArrowLeft />
|
||||||
{{ t('view.search.prev_page') }}
|
{{ t('view.search.prev_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="searchWorldResults.length < 10"
|
:disabled="searchWorldResults.length < 10"
|
||||||
@click="moreSearchWorld(1)">
|
@click="moreSearchWorld(1)">
|
||||||
<Right />
|
<ArrowRight />
|
||||||
{{ t('view.search.next_page') }}
|
{{ t('view.search.next_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
:disabled="userDialog.isAvatarsLoading"
|
:disabled="userDialog.isAvatarsLoading"
|
||||||
@click="refreshUserDialogAvatars">
|
@click="refreshUserDialogAvatars">
|
||||||
<Spinner v-if="userDialog.isAvatarsLoading" />
|
<Spinner v-if="userDialog.isAvatarsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
<span style="font-size: 14px; margin-left: 5px; margin-right: 5px">{{
|
||||||
@@ -281,7 +281,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!searchAvatarPageNum"
|
:disabled="!searchAvatarPageNum"
|
||||||
@click="moreSearchAvatar(-1)">
|
@click="moreSearchAvatar(-1)">
|
||||||
<Back />
|
<ArrowLeft />
|
||||||
{{ t('view.search.prev_page') }}
|
{{ t('view.search.prev_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -292,7 +292,7 @@
|
|||||||
(searchAvatarPageNum + 1) * 10 >= searchAvatarResults.length
|
(searchAvatarPageNum + 1) * 10 >= searchAvatarResults.length
|
||||||
"
|
"
|
||||||
@click="moreSearchAvatar(1)">
|
@click="moreSearchAvatar(1)">
|
||||||
<Right />
|
<ArrowRight />
|
||||||
{{ t('view.search.next_page') }}
|
{{ t('view.search.next_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -334,7 +334,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!searchGroupParams.offset"
|
:disabled="!searchGroupParams.offset"
|
||||||
@click="moreSearchGroup(-1)">
|
@click="moreSearchGroup(-1)">
|
||||||
<Back />
|
<ArrowLeft />
|
||||||
{{ t('view.search.prev_page') }}
|
{{ t('view.search.prev_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="searchGroupResults.length < 10"
|
:disabled="searchGroupResults.length < 10"
|
||||||
@click="moreSearchGroup(1)">
|
@click="moreSearchGroup(1)">
|
||||||
<Right />
|
<ArrowRight />
|
||||||
{{ t('view.search.next_page') }}
|
{{ t('view.search.next_page') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -354,7 +354,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
||||||
import { Back, Refresh, Right } from '@element-plus/icons-vue';
|
import { ArrowLeft, ArrowRight, RefreshCw, Trash2 } from 'lucide-vue-next';
|
||||||
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
|
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
@@ -363,7 +363,6 @@
|
|||||||
import { InputGroupField } from '@/components/ui/input-group';
|
import { InputGroupField } from '@/components/ui/input-group';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { TabsUnderline } from '@/components/ui/tabs';
|
import { TabsUnderline } from '@/components/ui/tabs';
|
||||||
import { Trash2 } from 'lucide-vue-next';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
<div class="simple-switch">
|
<div class="simple-switch">
|
||||||
<div class="name" :style="{ width: longLabel ? '300px' : undefined }">
|
<div class="name" :style="{ width: longLabel ? '300px' : undefined }">
|
||||||
{{ label }}
|
{{ label }}
|
||||||
<TooltipWrapper v-if="tooltip" side="top" :content="tooltip"
|
<TooltipWrapper v-if="tooltip" side="top" :content="tooltip">
|
||||||
><el-icon size="small" class="tooltip"><InfoFilled /></el-icon
|
<Info size="small" class="tooltip" />
|
||||||
></TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Switch class="switch" :model-value="value" @update:modelValue="change" :disabled="disabled" />
|
<Switch class="switch" :model-value="value" @update:modelValue="change" :disabled="disabled" />
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { InfoFilled } from '@element-plus/icons-vue';
|
import { Info } from 'lucide-vue-next';
|
||||||
|
|
||||||
import { Switch } from '../../../components/ui/switch';
|
import { Switch } from '../../../components/ui/switch';
|
||||||
defineProps({
|
defineProps({
|
||||||
|
|||||||
@@ -5,15 +5,15 @@
|
|||||||
<div class="options-container-item" style="margin-top: 15px">
|
<div class="options-container-item" style="margin-top: 15px">
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="showVRChatConfig()">
|
<Button variant="outline" size="sm" @click="showVRChatConfig()">
|
||||||
<Operation />
|
<Settings />
|
||||||
VRChat config.json
|
VRChat config.json
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="outline" size="sm" @click="showLaunchOptions()">
|
<Button variant="outline" size="sm" @click="showLaunchOptions()">
|
||||||
<Operation />
|
<Settings />
|
||||||
{{ t('view.settings.advanced.advanced.launch_options') }}
|
{{ t('view.settings.advanced.advanced.launch_options') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="outline" size="sm" @click="showRegistryBackupDialog()">
|
<Button variant="outline" size="sm" @click="showRegistryBackupDialog()">
|
||||||
<Goods />
|
<Package />
|
||||||
{{ t('view.settings.advanced.advanced.vrc_registry_backup') }}
|
{{ t('view.settings.advanced.advanced.vrc_registry_backup') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -384,9 +384,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Folder, Goods, Operation } from '@element-plus/icons-vue';
|
import { Folder, Package, RefreshCcw, Settings, Trash2 } from 'lucide-vue-next';
|
||||||
import { computed, reactive, ref } from 'vue';
|
import { computed, reactive, ref } from 'vue';
|
||||||
import { RefreshCcw, Trash2 } from 'lucide-vue-next';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ButtonGroup } from '@/components/ui/button-group';
|
import { ButtonGroup } from '@/components/ui/button-group';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -220,7 +220,7 @@
|
|||||||
<SelectItem value="Sort by Status">{{
|
<SelectItem value="Sort by Status">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.status')
|
t('view.settings.appearance.side_panel.sorting.status')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort Private to Bottom">{{
|
<SelectItem value="Sort Private to ArrowDown">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort by Last Active">{{
|
<SelectItem value="Sort by Last Active">{{
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<el-icon style="margin: 5px"><ArrowRight /></el-icon>
|
<ArrowRight style="margin: 5px" />
|
||||||
<Select
|
<Select
|
||||||
:model-value="sidebarSortMethod2"
|
:model-value="sidebarSortMethod2"
|
||||||
:disabled="!sidebarSortMethod1"
|
:disabled="!sidebarSortMethod1"
|
||||||
@@ -253,7 +253,7 @@
|
|||||||
<SelectItem value="Sort by Status">{{
|
<SelectItem value="Sort by Status">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.status')
|
t('view.settings.appearance.side_panel.sorting.status')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort Private to Bottom">{{
|
<SelectItem value="Sort Private to ArrowDown">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort by Last Active">{{
|
<SelectItem value="Sort by Last Active">{{
|
||||||
@@ -270,7 +270,7 @@
|
|||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<el-icon style="margin: 5px"><ArrowRight /></el-icon>
|
<ArrowRight style="margin: 5px" />
|
||||||
<Select
|
<Select
|
||||||
:model-value="sidebarSortMethod3"
|
:model-value="sidebarSortMethod3"
|
||||||
:disabled="!sidebarSortMethod2"
|
:disabled="!sidebarSortMethod2"
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
<SelectItem value="Sort by Status">{{
|
<SelectItem value="Sort by Status">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.status')
|
t('view.settings.appearance.side_panel.sorting.status')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort Private to Bottom">{{
|
<SelectItem value="Sort Private to ArrowDown">{{
|
||||||
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
t('view.settings.appearance.side_panel.sorting.private_to_bottom')
|
||||||
}}</SelectItem>
|
}}</SelectItem>
|
||||||
<SelectItem value="Sort by Last Active">{{
|
<SelectItem value="Sort by Last Active">{{
|
||||||
@@ -438,9 +438,8 @@
|
|||||||
} from '@/components/ui/tags-input';
|
} from '@/components/ui/tags-input';
|
||||||
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
||||||
import { computed, onBeforeUnmount, ref, watch } from 'vue';
|
import { computed, onBeforeUnmount, ref, watch } from 'vue';
|
||||||
import { CheckIcon, ChevronDown } from 'lucide-vue-next';
|
import { ArrowRight, CheckIcon, ChevronDown } from 'lucide-vue-next';
|
||||||
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
|
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
|
||||||
import { ArrowRight } from '@element-plus/icons-vue';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
|
|||||||
@@ -244,7 +244,7 @@
|
|||||||
side="top"
|
side="top"
|
||||||
style="margin-left: 5px"
|
style="margin-left: 5px"
|
||||||
:content="t('view.settings.general.automation.auto_invite_request_accept_tooltip')">
|
:content="t('view.settings.general.automation.auto_invite_request_accept_tooltip')">
|
||||||
<el-icon><InfoFilled /></el-icon>
|
<Info />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
@@ -303,7 +303,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, defineAsyncComponent, ref } from 'vue';
|
import { computed, defineAsyncComponent, ref } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InfoFilled } from '@element-plus/icons-vue';
|
import { Info } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('view.settings.advanced.advanced.save_instance_prints_to_file.header_tooltip')">
|
:content="t('view.settings.advanced.advanced.save_instance_prints_to_file.header_tooltip')">
|
||||||
<el-icon><InfoFilled /></el-icon>
|
<Info />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<simple-switch
|
<simple-switch
|
||||||
:label="t('view.settings.advanced.advanced.save_instance_prints_to_file.description')"
|
:label="t('view.settings.advanced.advanced.save_instance_prints_to_file.description')"
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
<TooltipWrapper
|
<TooltipWrapper
|
||||||
side="top"
|
side="top"
|
||||||
:content="t('view.settings.advanced.advanced.save_instance_prints_to_file.header_tooltip')">
|
:content="t('view.settings.advanced.advanced.save_instance_prints_to_file.header_tooltip')">
|
||||||
<el-icon><InfoFilled /></el-icon>
|
<Info />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
<simple-switch
|
<simple-switch
|
||||||
:label="t('view.settings.advanced.advanced.save_instance_emoji_to_file.description')"
|
:label="t('view.settings.advanced.advanced.save_instance_emoji_to_file.description')"
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InfoFilled } from '@element-plus/icons-vue';
|
import { Info } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
side="top"
|
side="top"
|
||||||
style="margin-left: 5px"
|
style="margin-left: 5px"
|
||||||
:content="setting.tooltip">
|
:content="setting.tooltip">
|
||||||
<el-icon v-if="setting.tooltipWarning"><Warning /></el-icon>
|
<AlertTriangle v-if="setting.tooltipWarning" />
|
||||||
<el-icon v-else><InfoFilled /></el-icon>
|
<Info v-else />
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { InfoFilled, Warning } from '@element-plus/icons-vue';
|
import { Info, AlertTriangle } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
style="margin-left: 5px"
|
style="margin-left: 5px"
|
||||||
@click="getVRChatCacheSize">
|
@click="getVRChatCacheSize">
|
||||||
<Spinner v-if="VRChatCacheSizeLoading" />
|
<Spinner v-if="VRChatCacheSizeLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { InputGroupAction } from '@/components/ui/input-group';
|
import { InputGroupAction } from '@/components/ui/input-group';
|
||||||
import { Refresh } from '@element-plus/icons-vue';
|
import { RefreshCw } from 'lucide-vue-next';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
function showDeleteAllVRChatCacheConfirm() {
|
function showDeleteAllVRChatCacheConfirm() {
|
||||||
modalStore
|
modalStore
|
||||||
.confirm({
|
.confirm({
|
||||||
description: 'Continue? Delete all VRChat cache',
|
description: 'Continue? Trash2 all VRChat cache',
|
||||||
title: 'Confirm'
|
title: 'Confirm'
|
||||||
})
|
})
|
||||||
.then(({ ok }) => {
|
.then(({ ok }) => {
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
style="margin-right: 10px"
|
style="margin-right: 10px"
|
||||||
@click="refreshFriendsList">
|
@click="refreshFriendsList">
|
||||||
<Spinner v-if="isRefreshFriendsLoading" />
|
<Spinner v-if="isRefreshFriendsLoading" />
|
||||||
<Refresh v-else />
|
<RefreshCw v-else />
|
||||||
</Button>
|
</Button>
|
||||||
</TooltipWrapper>
|
</TooltipWrapper>
|
||||||
</div>
|
</div>
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Input } from '@/components/ui/input';
|
import { Input } from '@/components/ui/input';
|
||||||
import { Refresh } from '@element-plus/icons-vue';
|
import { RefreshCw } from 'lucide-vue-next';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
import { TabsUnderline } from '@/components/ui/tabs';
|
import { TabsUnderline } from '@/components/ui/tabs';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -17,13 +17,11 @@
|
|||||||
<span v-if="isFriendActiveOrOffline" class="extra">{{ friend.ref.statusDescription }}</span>
|
<span v-if="isFriendActiveOrOffline" class="extra">{{ friend.ref.statusDescription }}</span>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div v-if="friend.pendingOffline" class="extra">
|
<div v-if="friend.pendingOffline" class="extra">
|
||||||
<el-icon><WarningFilled /></el-icon> {{ t('side_panel.pending_offline') }}
|
<AlertTriangle /> {{ t('side_panel.pending_offline') }}
|
||||||
</div>
|
</div>
|
||||||
<template v-else-if="isGroupByInstance">
|
<template v-else-if="isGroupByInstance">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<el-icon v-if="isFriendTraveling" class="is-loading" style="margin-right: 3px"
|
<Loader2 v-if="isFriendTraveling" class="is-loading" style="margin-right: 3px" />
|
||||||
><Loading
|
|
||||||
/></el-icon>
|
|
||||||
<Timer
|
<Timer
|
||||||
class="extra"
|
class="extra"
|
||||||
:epoch="epoch"
|
:epoch="epoch"
|
||||||
@@ -62,7 +60,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Loading, WarningFilled } from '@element-plus/icons-vue';
|
import { Loader2, AlertTriangle } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
isFriendsGroupMe = !isFriendsGroupMe;
|
isFriendsGroupMe = !isFriendsGroupMe;
|
||||||
saveFriendsGroupStates();
|
saveFriendsGroupStates();
|
||||||
">
|
">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': isFriendsGroupMe }"><ArrowRight /></el-icon>
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': isFriendsGroupMe }" />
|
||||||
<span style="margin-left: 5px">{{ t('side_panel.me') }}</span>
|
<span style="margin-left: 5px">{{ t('side_panel.me') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="isFriendsGroupMe">
|
<div v-show="isFriendsGroupMe">
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
isVIPFriends = !isVIPFriends;
|
isVIPFriends = !isVIPFriends;
|
||||||
saveFriendsGroupStates();
|
saveFriendsGroupStates();
|
||||||
">
|
">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': isVIPFriends }"><ArrowRight /></el-icon>
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': isVIPFriends }" />
|
||||||
<span style="margin-left: 5px">
|
<span style="margin-left: 5px">
|
||||||
{{ t('side_panel.favorite') }} ―
|
{{ t('side_panel.favorite') }} ―
|
||||||
{{ vipFriendsDisplayNumber }}
|
{{ vipFriendsDisplayNumber }}
|
||||||
@@ -79,9 +79,9 @@
|
|||||||
|
|
||||||
<template v-if="isSidebarGroupByInstance && friendsInSameInstance.length">
|
<template v-if="isSidebarGroupByInstance && friendsInSameInstance.length">
|
||||||
<div class="x-friend-group x-link" @click="toggleSwitchGroupByInstanceCollapsed">
|
<div class="x-friend-group x-link" @click="toggleSwitchGroupByInstanceCollapsed">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': !isSidebarGroupByInstanceCollapsed }"
|
<ArrowRight
|
||||||
><ArrowRight
|
class="rotation-transition"
|
||||||
/></el-icon>
|
:class="{ 'is-rotated': !isSidebarGroupByInstanceCollapsed }" />
|
||||||
<span style="margin-left: 5px"
|
<span style="margin-left: 5px"
|
||||||
>{{ t('side_panel.same_instance') }} ― {{ friendsInSameInstance.length }}</span
|
>{{ t('side_panel.same_instance') }} ― {{ friendsInSameInstance.length }}</span
|
||||||
>
|
>
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
isOnlineFriends = !isOnlineFriends;
|
isOnlineFriends = !isOnlineFriends;
|
||||||
saveFriendsGroupStates();
|
saveFriendsGroupStates();
|
||||||
">
|
">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': isOnlineFriends }"><ArrowRight /></el-icon>
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': isOnlineFriends }" />
|
||||||
<span style="margin-left: 5px"
|
<span style="margin-left: 5px"
|
||||||
>{{ t('side_panel.online') }} ― {{ onlineFriendsByGroupStatus.length }}</span
|
>{{ t('side_panel.online') }} ― {{ onlineFriendsByGroupStatus.length }}</span
|
||||||
>
|
>
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
isActiveFriends = !isActiveFriends;
|
isActiveFriends = !isActiveFriends;
|
||||||
saveFriendsGroupStates();
|
saveFriendsGroupStates();
|
||||||
">
|
">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': isActiveFriends }"><ArrowRight /></el-icon>
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': isActiveFriends }" />
|
||||||
<span style="margin-left: 5px">{{ t('side_panel.active') }} ― {{ activeFriends.length }}</span>
|
<span style="margin-left: 5px">{{ t('side_panel.active') }} ― {{ activeFriends.length }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isActiveFriends">
|
<div v-if="isActiveFriends">
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
isOfflineFriends = !isOfflineFriends;
|
isOfflineFriends = !isOfflineFriends;
|
||||||
saveFriendsGroupStates();
|
saveFriendsGroupStates();
|
||||||
">
|
">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': isOfflineFriends }"><ArrowRight /></el-icon>
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': isOfflineFriends }" />
|
||||||
<span style="margin-left: 5px">{{ t('side_panel.offline') }} ― {{ offlineFriends.length }}</span>
|
<span style="margin-left: 5px">{{ t('side_panel.offline') }} ― {{ offlineFriends.length }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isOfflineFriends">
|
<div v-if="isOfflineFriends">
|
||||||
@@ -167,7 +167,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { ArrowRight } from '@element-plus/icons-vue';
|
import { ArrowRight } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,9 @@
|
|||||||
<template v-for="(group, index) in groupedGroupInstances" :key="getGroupId(group)">
|
<template v-for="(group, index) in groupedGroupInstances" :key="getGroupId(group)">
|
||||||
<div class="x-friend-group x-link" :style="{ paddingTop: index === 0 ? '0px' : '10px' }">
|
<div class="x-friend-group x-link" :style="{ paddingTop: index === 0 ? '0px' : '10px' }">
|
||||||
<div @click="toggleGroupSidebarCollapse(getGroupId(group))" style="display: flex; align-items: center">
|
<div @click="toggleGroupSidebarCollapse(getGroupId(group))" style="display: flex; align-items: center">
|
||||||
<el-icon
|
<ArrowRight
|
||||||
class="rotation-transition"
|
class="rotation-transition"
|
||||||
:class="{
|
:class="{ 'is-rotated': !groupInstancesCfg[getGroupId(group)]?.isCollapsed }" />
|
||||||
'is-rotated': !groupInstancesCfg[getGroupId(group)]?.isCollapsed
|
|
||||||
}"
|
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
<span style="margin-left: 5px">{{ group[0].group.name }} – {{ group.length }}</span>
|
<span style="margin-left: 5px">{{ group[0].group.name }} – {{ group.length }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -42,7 +38,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { ArrowRight } from '@element-plus/icons-vue';
|
import { ArrowRight } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
|
||||||
import { useAppearanceSettingsStore, useGroupStore } from '../../../stores';
|
import { useAppearanceSettingsStore, useGroupStore } from '../../../stores';
|
||||||
|
|||||||
+11
-12
@@ -62,7 +62,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="refreshGalleryTable">
|
<Button variant="outline" size="sm" @click="refreshGalleryTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!currentUser.profilePicOverride"
|
:disabled="!currentUser.profilePicOverride"
|
||||||
@click="setProfilePicOverride('')">
|
@click="setProfilePicOverride('')">
|
||||||
<Close />
|
<X />
|
||||||
{{ t('dialog.gallery_icons.clear') }}
|
{{ t('dialog.gallery_icons.clear') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="refreshVRCPlusIconsTable">
|
<Button variant="outline" size="sm" @click="refreshVRCPlusIconsTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
:disabled="!currentUser.userIcon"
|
:disabled="!currentUser.userIcon"
|
||||||
@click="setVRCPlusIcon('')">
|
@click="setVRCPlusIcon('')">
|
||||||
<Close />
|
<X />
|
||||||
{{ t('dialog.gallery_icons.clear') }}
|
{{ t('dialog.gallery_icons.clear') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<ButtonGroup style="margin-right: 10px">
|
<ButtonGroup style="margin-right: 10px">
|
||||||
<Button variant="outline" size="sm" @click="refreshEmojiTable">
|
<Button variant="outline" size="sm" @click="refreshEmojiTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -316,7 +316,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div style="display: inline-block; margin: 5px">
|
<div style="display: inline-block; margin: 5px">
|
||||||
<span v-if="image.loopStyle === 'pingpong'">
|
<span v-if="image.loopStyle === 'pingpong'">
|
||||||
<el-icon style="margin-right: 5px"><Refresh /></el-icon>
|
<RefreshCw style="margin-right: 5px" />
|
||||||
</span>
|
</span>
|
||||||
<span style="margin-right: 5px">{{ image.animationStyle }}</span>
|
<span style="margin-right: 5px">{{ image.animationStyle }}</span>
|
||||||
<span v-if="image.framesOverTime" style="margin-right: 5px"
|
<span v-if="image.framesOverTime" style="margin-right: 5px"
|
||||||
@@ -363,7 +363,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="refreshStickerTable">
|
<Button variant="outline" size="sm" @click="refreshStickerTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -428,7 +428,7 @@
|
|||||||
<div style="display: flex; align-items: center">
|
<div style="display: flex; align-items: center">
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="refreshPrintTable">
|
<Button variant="outline" size="sm" @click="refreshPrintTable">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -516,11 +516,11 @@
|
|||||||
<div style="display: flex; align-items: center">
|
<div style="display: flex; align-items: center">
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
<Button variant="outline" size="sm" @click="getInventory">
|
<Button variant="outline" size="sm" @click="getInventory">
|
||||||
<Refresh />
|
<RefreshCw />
|
||||||
{{ t('dialog.gallery_icons.refresh') }}
|
{{ t('dialog.gallery_icons.refresh') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="outline" size="sm" @click="redeemReward">
|
<Button variant="outline" size="sm" @click="redeemReward">
|
||||||
<Present />
|
<Gift />
|
||||||
{{ t('dialog.gallery_icons.redeem') }}
|
{{ t('dialog.gallery_icons.redeem') }}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
@@ -568,6 +568,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { Gift, Maximize2, RefreshCw, Trash2, Upload, X } from 'lucide-vue-next';
|
||||||
import {
|
import {
|
||||||
NumberField,
|
NumberField,
|
||||||
NumberFieldContent,
|
NumberFieldContent,
|
||||||
@@ -575,9 +576,7 @@
|
|||||||
NumberFieldIncrement,
|
NumberFieldIncrement,
|
||||||
NumberFieldInput
|
NumberFieldInput
|
||||||
} from '@/components/ui/number-field';
|
} from '@/components/ui/number-field';
|
||||||
import { Close, Present, Refresh, Upload } from '@element-plus/icons-vue';
|
|
||||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
||||||
import { Maximize2, Trash2 } from 'lucide-vue-next';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { ButtonGroup } from '@/components/ui/button-group';
|
import { ButtonGroup } from '@/components/ui/button-group';
|
||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
|
|||||||
@@ -6,9 +6,7 @@
|
|||||||
<div class="tool-categories">
|
<div class="tool-categories">
|
||||||
<div class="tool-category">
|
<div class="tool-category">
|
||||||
<div class="category-header" @click="toggleCategory('group')">
|
<div class="category-header" @click="toggleCategory('group')">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['group'] }"
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['group'] }" />
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
<span class="category-title">{{ t('view.tools.group.header') }}</span>
|
<span class="category-title">{{ t('view.tools.group.header') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="tools-grid" v-show="!categoryCollapsed['group']">
|
<div class="tools-grid" v-show="!categoryCollapsed['group']">
|
||||||
@@ -28,9 +26,7 @@
|
|||||||
|
|
||||||
<div class="tool-category">
|
<div class="tool-category">
|
||||||
<div class="category-header" @click="toggleCategory('image')">
|
<div class="category-header" @click="toggleCategory('image')">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['image'] }"
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['image'] }" />
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
<span class="category-title">{{ t('view.tools.pictures.header') }}</span>
|
<span class="category-title">{{ t('view.tools.pictures.header') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="tools-grid" v-show="!categoryCollapsed['image']">
|
<div class="tools-grid" v-show="!categoryCollapsed['image']">
|
||||||
@@ -93,9 +89,7 @@
|
|||||||
|
|
||||||
<div class="tool-category">
|
<div class="tool-category">
|
||||||
<div class="category-header" @click="toggleCategory('user')">
|
<div class="category-header" @click="toggleCategory('user')">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['user'] }"
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['user'] }" />
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
<span class="category-title">{{ t('view.tools.export.header') }}</span>
|
<span class="category-title">{{ t('view.tools.export.header') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -158,9 +152,7 @@
|
|||||||
|
|
||||||
<div class="tool-category">
|
<div class="tool-category">
|
||||||
<div class="category-header" @click="toggleCategory('other')">
|
<div class="category-header" @click="toggleCategory('other')">
|
||||||
<el-icon class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['other'] }"
|
<ArrowRight class="rotation-transition" :class="{ 'is-rotated': !categoryCollapsed['other'] }" />
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
<span class="category-title">{{ t('view.tools.other.header') }}</span>
|
<span class="category-title">{{ t('view.tools.other.header') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="tools-grid" v-show="!categoryCollapsed['other']">
|
<div class="tools-grid" v-show="!categoryCollapsed['other']">
|
||||||
@@ -205,7 +197,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, defineAsyncComponent, ref } from 'vue';
|
import { computed, defineAsyncComponent, ref } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import { ArrowRight } from '@element-plus/icons-vue';
|
import { ArrowRight } from 'lucide-vue-next';
|
||||||
import { Card } from '@/components/ui/card';
|
import { Card } from '@/components/ui/card';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { toast } from 'vue-sonner';
|
import { toast } from 'vue-sonner';
|
||||||
@@ -317,7 +309,7 @@
|
|||||||
background-color: var(--el-color-primary-light-9);
|
background-color: var(--el-color-primary-light-9);
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-icon-arrow-right {
|
.rotation-transition {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
transition: transform 0.3s;
|
transition: transform 0.3s;
|
||||||
|
|||||||
@@ -92,20 +92,20 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="badges">
|
<div class="badges">
|
||||||
<div @click="copyEventLink(event)" class="share-badge">
|
<div @click="copyEventLink(event)" class="share-badge">
|
||||||
<el-icon><Share /></el-icon>
|
<Share2 />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isFollowing" @click="toggleEventFollow(event)" class="following-badge is-following">
|
<div v-if="isFollowing" @click="toggleEventFollow(event)" class="following-badge is-following">
|
||||||
<el-icon><Star /></el-icon>
|
<Star />
|
||||||
</div>
|
</div>
|
||||||
<div v-else @click="toggleEventFollow(event)" class="following-badge">
|
<div v-else @click="toggleEventFollow(event)" class="following-badge">
|
||||||
<el-icon><StarFilled /></el-icon>
|
<Star />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Calendar, Download, Share, Star, StarFilled } from '@element-plus/icons-vue';
|
import { Calendar, Download, Share2, Star } from 'lucide-vue-next';
|
||||||
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
|
|||||||
@@ -54,18 +54,12 @@
|
|||||||
<div class="date">
|
<div class="date">
|
||||||
<div
|
<div
|
||||||
class="calendar-date-content"
|
class="calendar-date-content"
|
||||||
:class="{
|
:class="{ 'has-events': filteredCalendar[formatDateKey(data.date)]?.length }">
|
||||||
'has-events': filteredCalendar[formatDateKey(data.date)]?.length
|
|
||||||
}">
|
|
||||||
{{ dayjs(data.date).format('D') }}
|
{{ dayjs(data.date).format('D') }}
|
||||||
<div
|
<div
|
||||||
v-if="filteredCalendar[formatDateKey(data.date)]?.length"
|
v-if="filteredCalendar[formatDateKey(data.date)]?.length"
|
||||||
class="calendar-event-badge"
|
class="calendar-event-badge"
|
||||||
:class="
|
:class="followingCalendarDate[formatDateKey(data.date)] ? 'has-following' : 'no-following'">
|
||||||
followingCalendarDate[formatDateKey(data.date)]
|
|
||||||
? 'has-following'
|
|
||||||
: 'no-following'
|
|
||||||
">
|
|
||||||
{{ filteredCalendar[formatDateKey(data.date)]?.length }}
|
{{ filteredCalendar[formatDateKey(data.date)]?.length }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,11 +81,9 @@
|
|||||||
<div v-if="filteredGroupEvents.length" class="groups-container">
|
<div v-if="filteredGroupEvents.length" class="groups-container">
|
||||||
<div v-for="group in filteredGroupEvents" :key="group.groupId" class="group-row">
|
<div v-for="group in filteredGroupEvents" :key="group.groupId" class="group-row">
|
||||||
<div class="group-header" @click="toggleGroup(group.groupId)">
|
<div class="group-header" @click="toggleGroup(group.groupId)">
|
||||||
<el-icon
|
<ArrowRight
|
||||||
class="el-icon-arrow-right rotation-transition"
|
class="rotation-transition"
|
||||||
:class="{ rotate: !groupCollapsed[group.groupId] }"
|
:class="{ rotate: !groupCollapsed[group.groupId] }" />
|
||||||
><ArrowRight
|
|
||||||
/></el-icon>
|
|
||||||
{{ group.groupName }}
|
{{ group.groupName }}
|
||||||
</div>
|
</div>
|
||||||
<div class="events-row" v-show="!groupCollapsed[group.groupId]">
|
<div class="events-row" v-show="!groupCollapsed[group.groupId]">
|
||||||
@@ -123,7 +115,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, onMounted, ref, watch } from 'vue';
|
import { computed, onMounted, ref, watch } from 'vue';
|
||||||
import { ArrowRight } from '@element-plus/icons-vue';
|
import { ArrowRight } from 'lucide-vue-next';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { InputGroupSearch } from '@/components/ui/input-group';
|
import { InputGroupSearch } from '@/components/ui/input-group';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
@@ -638,7 +630,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
.el-icon-arrow-right {
|
.rotation-transition {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
transition: transform 0.3s;
|
transition: transform 0.3s;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
{{ t('dialog.note_export.cancel') }}
|
{{ t('dialog.note_export.cancel') }}
|
||||||
</Button>
|
</Button>
|
||||||
<span v-if="loading" style="margin: 10px">
|
<span v-if="loading" style="margin: 10px">
|
||||||
<el-icon style="margin-right: 5px"><Loading /></el-icon>
|
<Loader2 style="margin-right: 5px" />
|
||||||
{{ t('dialog.note_export.progress') }} {{ progress }}/{{ progressTotal }}
|
{{ t('dialog.note_export.progress') }} {{ progress }}/{{ progressTotal }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { DataTableLayout } from '@/components/ui/data-table';
|
import { DataTableLayout } from '@/components/ui/data-table';
|
||||||
import { Loading } from '@element-plus/icons-vue';
|
import { Loader2 } from 'lucide-vue-next';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user