mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-05-06 22:46:06 +02:00
Remember table sort order when switching pages
This commit is contained in:
@@ -74,11 +74,13 @@
|
|||||||
emits: [
|
emits: [
|
||||||
'update:currentPage',
|
'update:currentPage',
|
||||||
'update:pageSize',
|
'update:pageSize',
|
||||||
|
'update:tableProps',
|
||||||
'size-change',
|
'size-change',
|
||||||
'current-change',
|
'current-change',
|
||||||
'selection-change',
|
'selection-change',
|
||||||
'row-click',
|
'row-click',
|
||||||
'filtered-data'
|
'filtered-data',
|
||||||
|
'sort-change'
|
||||||
],
|
],
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const appearanceSettingsStore = useAppearanceSettingsStore();
|
const appearanceSettingsStore = useAppearanceSettingsStore();
|
||||||
@@ -180,7 +182,14 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
const handleSortChange = ({ prop, order }) => {
|
const handleSortChange = ({ prop, order }) => {
|
||||||
|
if (props.tableProps.defaultSort) {
|
||||||
|
const { tableProps } = props;
|
||||||
|
tableProps.defaultSort.prop = prop;
|
||||||
|
tableProps.defaultSort.order = order;
|
||||||
|
emit('update:tableProps', tableProps);
|
||||||
|
}
|
||||||
sortData.value = { prop, order };
|
sortData.value = { prop, order };
|
||||||
|
emit('sort-change', sortData.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSelectionChange = (selection) => {
|
const handleSelectionChange = (selection) => {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export async function initSentry(app) {
|
|||||||
const error = hint.originalException;
|
const error = hint.originalException;
|
||||||
if (error && typeof error.message === 'string') {
|
if (error && typeof error.message === 'string') {
|
||||||
if (
|
if (
|
||||||
|
error.message.includes('401') ||
|
||||||
error.message.includes('403') ||
|
error.message.includes('403') ||
|
||||||
error.message.includes('404') ||
|
error.message.includes('404') ||
|
||||||
error.message.includes('500') ||
|
error.message.includes('500') ||
|
||||||
|
|||||||
@@ -12,11 +12,35 @@ export const useModerationStore = defineStore('Moderation', () => {
|
|||||||
|
|
||||||
const cachedPlayerModerations = ref(new Map());
|
const cachedPlayerModerations = ref(new Map());
|
||||||
const cachedPlayerModerationsUserIds = ref(new Set());
|
const cachedPlayerModerationsUserIds = ref(new Set());
|
||||||
const isPlayerModerationsLoading = ref(false);
|
|
||||||
const playerModerationTable = ref({
|
const playerModerationTable = ref({
|
||||||
data: [],
|
data: [],
|
||||||
|
search: '',
|
||||||
|
loading: false,
|
||||||
|
filters: [
|
||||||
|
{
|
||||||
|
prop: 'type',
|
||||||
|
value: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: ['sourceDisplayName', 'targetDisplayName'],
|
||||||
|
value: ''
|
||||||
|
}
|
||||||
|
],
|
||||||
|
tableProps: {
|
||||||
|
stripe: true,
|
||||||
|
size: 'small',
|
||||||
|
defaultSort: {
|
||||||
|
prop: 'created',
|
||||||
|
order: 'descending'
|
||||||
|
}
|
||||||
|
},
|
||||||
pageSize: 15,
|
pageSize: 15,
|
||||||
pageSizeLinked: true
|
pageSizeLinked: true,
|
||||||
|
paginationProps: {
|
||||||
|
small: true,
|
||||||
|
layout: 'sizes,prev,pager,next,total',
|
||||||
|
pageSizes: [10, 15, 20, 25, 50, 100]
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
@@ -24,7 +48,7 @@ export const useModerationStore = defineStore('Moderation', () => {
|
|||||||
(isLoggedIn) => {
|
(isLoggedIn) => {
|
||||||
cachedPlayerModerations.value.clear();
|
cachedPlayerModerations.value.clear();
|
||||||
cachedPlayerModerationsUserIds.value.clear();
|
cachedPlayerModerationsUserIds.value.clear();
|
||||||
isPlayerModerationsLoading.value = false;
|
playerModerationTable.value.loading = false;
|
||||||
playerModerationTable.value.data = [];
|
playerModerationTable.value.data = [];
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
refreshPlayerModerations();
|
refreshPlayerModerations();
|
||||||
@@ -168,17 +192,17 @@ export const useModerationStore = defineStore('Moderation', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function refreshPlayerModerations() {
|
async function refreshPlayerModerations() {
|
||||||
if (isPlayerModerationsLoading.value) {
|
if (playerModerationTable.value.loading) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
isPlayerModerationsLoading.value = true;
|
playerModerationTable.value.loading = true;
|
||||||
expirePlayerModerations();
|
expirePlayerModerations();
|
||||||
Promise.all([
|
Promise.all([
|
||||||
playerModerationRequest.getPlayerModerations(),
|
playerModerationRequest.getPlayerModerations(),
|
||||||
avatarModerationRequest.getAvatarModerations()
|
avatarModerationRequest.getAvatarModerations()
|
||||||
])
|
])
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
isPlayerModerationsLoading.value = false;
|
playerModerationTable.value.loading = false;
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
// TODO: compare with cachedAvatarModerations
|
// TODO: compare with cachedAvatarModerations
|
||||||
@@ -244,7 +268,6 @@ export const useModerationStore = defineStore('Moderation', () => {
|
|||||||
return {
|
return {
|
||||||
cachedPlayerModerations,
|
cachedPlayerModerations,
|
||||||
cachedPlayerModerationsUserIds,
|
cachedPlayerModerationsUserIds,
|
||||||
isPlayerModerationsLoading,
|
|
||||||
playerModerationTable,
|
playerModerationTable,
|
||||||
|
|
||||||
refreshPlayerModerations,
|
refreshPlayerModerations,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<!-- 工具栏 -->
|
<!-- 工具栏 -->
|
||||||
<div class="tool-slot">
|
<div class="tool-slot">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="filters[0].value"
|
v-model="playerModerationTable.filters[0].value"
|
||||||
@change="saveTableFilters()"
|
@change="saveTableFilters()"
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
@@ -16,26 +16,20 @@
|
|||||||
:value="item" />
|
:value="item" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="filters[1].value"
|
v-model="playerModerationTable.filters[1].value"
|
||||||
:placeholder="t('view.moderation.search_placeholder')"
|
:placeholder="t('view.moderation.search_placeholder')"
|
||||||
class="filter-input" />
|
class="filter-input" />
|
||||||
<el-tooltip placement="bottom" :content="t('view.moderation.refresh_tooltip')">
|
<el-tooltip placement="bottom" :content="t('view.moderation.refresh_tooltip')">
|
||||||
<el-button
|
<el-button
|
||||||
type="default"
|
type="default"
|
||||||
:loading="isPlayerModerationsLoading"
|
:loading="playerModerationTable.loading"
|
||||||
@click="refreshPlayerModerations()"
|
@click="refreshPlayerModerations()"
|
||||||
:icon="Refresh"
|
:icon="Refresh"
|
||||||
circle />
|
circle />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<DataTable
|
<DataTable v-bind="playerModerationTable">
|
||||||
:data="playerModerationTable.data"
|
|
||||||
:pageSize="playerModerationTable.pageSize"
|
|
||||||
:filters="filters"
|
|
||||||
:tableProps="tableProps"
|
|
||||||
:paginationProps="paginationProps"
|
|
||||||
v-loading="isPlayerModerationsLoading">
|
|
||||||
<el-table-column :label="t('table.moderation.date')" prop="created" :sortable="true" width="130">
|
<el-table-column :label="t('table.moderation.date')" prop="created" :sortable="true" width="130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tooltip placement="right">
|
<el-tooltip placement="right">
|
||||||
@@ -93,7 +87,6 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { Close, Refresh } from '@element-plus/icons-vue';
|
import { Close, Refresh } from '@element-plus/icons-vue';
|
||||||
import { ElMessageBox } from 'element-plus';
|
import { ElMessageBox } from 'element-plus';
|
||||||
import { ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
@@ -106,39 +99,13 @@
|
|||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { showUserDialog } = useUserStore();
|
const { showUserDialog } = useUserStore();
|
||||||
const { isPlayerModerationsLoading, playerModerationTable } = storeToRefs(useModerationStore());
|
const { playerModerationTable } = storeToRefs(useModerationStore());
|
||||||
const { refreshPlayerModerations, handlePlayerModerationDelete } = useModerationStore();
|
const { refreshPlayerModerations, handlePlayerModerationDelete } = useModerationStore();
|
||||||
const { shiftHeld } = storeToRefs(useUiStore());
|
const { shiftHeld } = storeToRefs(useUiStore());
|
||||||
const { currentUser } = storeToRefs(useUserStore());
|
const { currentUser } = storeToRefs(useUserStore());
|
||||||
|
|
||||||
const filters = ref([
|
|
||||||
{
|
|
||||||
prop: 'type',
|
|
||||||
value: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: ['sourceDisplayName', 'targetDisplayName'],
|
|
||||||
value: ''
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
|
|
||||||
const tableProps = ref({
|
|
||||||
stripe: true,
|
|
||||||
size: 'small',
|
|
||||||
defaultSort: {
|
|
||||||
prop: 'created',
|
|
||||||
order: 'descending'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const paginationProps = ref({
|
|
||||||
small: true,
|
|
||||||
layout: 'sizes,prev,pager,next,total',
|
|
||||||
pageSizes: [10, 15, 20, 25, 50, 100]
|
|
||||||
});
|
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
filters.value[0].value = JSON.parse(
|
playerModerationTable.value.filters[0].value = JSON.parse(
|
||||||
await configRepository.getString('VRCX_playerModerationTableFilters', '[]')
|
await configRepository.getString('VRCX_playerModerationTableFilters', '[]')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -146,7 +113,10 @@
|
|||||||
init();
|
init();
|
||||||
|
|
||||||
function saveTableFilters() {
|
function saveTableFilters() {
|
||||||
configRepository.setString('VRCX_playerModerationTableFilters', JSON.stringify(filters.value[0].value));
|
configRepository.setString(
|
||||||
|
'VRCX_playerModerationTableFilters',
|
||||||
|
JSON.stringify(playerModerationTable.value.filters[0].value)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function deletePlayerModeration(row) {
|
async function deletePlayerModeration(row) {
|
||||||
|
|||||||
Reference in New Issue
Block a user