diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..2b04a7a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const eslint_config_typescript_1 = require("@vue/eslint-config-typescript"); +const eslint_plugin_vue_1 = __importDefault(require("eslint-plugin-vue")); +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup +const vueEssentialConfig = eslint_plugin_vue_1.default.configs['flat/essential']; +const vueTsRecommendedConfig = eslint_config_typescript_1.vueTsConfigs.recommended; +exports.default = (0, eslint_config_typescript_1.defineConfigWithVueTs)({ + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue}'], +}, { + name: 'app/ignores', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], +}, vueEssentialConfig, vueTsRecommendedConfig); diff --git a/eslint.config.ts b/eslint.config.ts index edb1bbb..ff66922 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,4 +1,3 @@ -import { globalIgnores } from 'eslint/config' import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' import pluginVue from 'eslint-plugin-vue' @@ -7,14 +6,22 @@ import pluginVue from 'eslint-plugin-vue' // configureVueProject({ scriptLangs: ['ts', 'tsx'] }) // More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup +const vueEssentialConfig = + pluginVue.configs['flat/essential'] as unknown as Parameters[number] + +const vueTsRecommendedConfig = + vueTsConfigs.recommended as unknown as Parameters[number] + export default defineConfigWithVueTs( { name: 'app/files-to-lint', files: ['**/*.{ts,mts,tsx,vue}'], }, + { + name: 'app/ignores', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], + }, - globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), - - pluginVue.configs['flat/essential'], - vueTsConfigs.recommended, + vueEssentialConfig, + vueTsRecommendedConfig, ) diff --git a/package-lock.json b/package-lock.json index 3d14235..c73085b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "typescript": "~5.8.0", "vite": "^6.2.4", "vite-plugin-vue-devtools": "^7.7.2", - "vue-tsc": "^2.2.8" + "vue-tsc": "^2.2.12" } }, "node_modules/@ampproject/remapping": { @@ -2149,27 +2149,30 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.14.tgz", - "integrity": "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==", + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.14" + "@volar/source-map": "2.4.15" } }, "node_modules/@volar/source-map": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.14.tgz", - "integrity": "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==", - "dev": true + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.14.tgz", - "integrity": "sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==", + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.14", + "@volar/language-core": "2.4.15", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -2275,6 +2278,7 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", "dev": true, + "license": "MIT", "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" @@ -2370,12 +2374,13 @@ } }, "node_modules/@vue/language-core": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.10.tgz", - "integrity": "sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.11", + "@volar/language-core": "2.4.15", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", @@ -2498,7 +2503,8 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ansi-styles": { "version": "4.3.0", @@ -2743,7 +2749,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { "version": "4.4.1", @@ -3396,6 +3403,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -4053,7 +4061,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -4288,7 +4297,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", @@ -4821,6 +4831,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5118,7 +5129,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vue": { "version": "3.5.16", @@ -5191,13 +5203,14 @@ } }, "node_modules/vue-tsc": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.10.tgz", - "integrity": "sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", "dev": true, + "license": "MIT", "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.10" + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" }, "bin": { "vue-tsc": "bin/vue-tsc.js" diff --git a/package.json b/package.json index fb49eff..9689f36 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,6 @@ "typescript": "~5.8.0", "vite": "^6.2.4", "vite-plugin-vue-devtools": "^7.7.2", - "vue-tsc": "^2.2.8" + "vue-tsc": "^2.2.12" } } diff --git a/src/api/offstylesApi.ts b/src/api/offstylesApi.ts index 89a9de1..41a91df 100644 --- a/src/api/offstylesApi.ts +++ b/src/api/offstylesApi.ts @@ -1,8 +1,8 @@ -import { Style } from "@/types/Style"; -import Api from "./api"; -import type { Time } from "@/types/Time"; -import type { User } from "@/types/User"; -import type { RecentModAction, ModerationTargetFilter } from "@/types/moderation"; +import { Style } from '@/types/Style'; +import Api from './api'; +import type { Time } from '@/types/Time'; +import type { User } from '@/types/User'; +import type { RecentModAction, ModerationTargetFilter, ModerationAction } from '@/types/moderation'; // Add new interfaces based on the API spec export interface RankAwareRecord extends Time { @@ -72,6 +72,20 @@ export interface ServerKeyInfo { permissions: number; } +export interface ModerationLogModerator { + steam_id: string; + username: string; + avatar_url?: string; +} + +export interface ModerationLogAction extends ModerationAction { + mod: ModerationLogModerator; +} + +export interface ModerationLogResponse { + actions: ModerationLogAction[]; +} + class OffstylesApi extends Api { static offstylesApiUrl = import.meta.env.DEV ? "/api" : "https://offstyles.tommyy.dev/api"; @@ -318,7 +332,7 @@ class OffstylesApi extends Api { } // Get moderation logs - static async getModerationLogs(id: string): Promise { + static async getModerationLogs(id: string): Promise { const params = new URLSearchParams({ id: id, }); diff --git a/src/components/ComboBox.vue b/src/components/ComboBox.vue index bfe8662..6afbb39 100644 --- a/src/components/ComboBox.vue +++ b/src/components/ComboBox.vue @@ -12,25 +12,30 @@ import IconChevronDown from '@/components/icons/IconChevronDown.vue'; import loadWheel from '@/components/icons/loadWheel.vue'; + interface ComboBoxOptionItem { + id?: number | string, + name: string, + } + const props = defineProps<{ - select_options: object[], - selected_option: { id?:number, name?:string }, + select_options: ComboBoxOptionItem[], + selected_option: ComboBoxOptionItem | null, type: string, is_loading?: boolean, }>() - const selected = ref(props.selected_option); + const selected = ref(props.selected_option); //update selected when parent selected_option changes - const selectedProp = computed(()=>{return props.selected_option}); - watch(selectedProp, async()=>{ - if(props.selected_option !== selected.value){ + const selectedProp = computed(() => props.selected_option); + watch(selectedProp, async () => { + if (props.selected_option !== selected.value) { selected.value = props.selected_option; } }); const emit = defineEmits(['select-Changed']); - watch(selected, async() => { + watch(selected, async () => { emit('select-Changed', selected.value !== null ? selected.value : {}); }); @@ -55,7 +60,7 @@ diff --git a/src/components/PlayerProfile.vue b/src/components/PlayerProfile.vue index d74c36f..7c4280c 100644 --- a/src/components/PlayerProfile.vue +++ b/src/components/PlayerProfile.vue @@ -2,8 +2,8 @@
@@ -11,7 +11,7 @@