mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-05-07 14:56:06 +02:00
Group moderation table sorting
This commit is contained in:
@@ -1,9 +1,30 @@
|
|||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { i18n } from '@/plugin';
|
import { i18n } from '@/plugin';
|
||||||
import { formatDateFilter } from '@/shared/utils';
|
import { formatDateFilter } from '@/shared/utils';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
import { ArrowUpDown } from 'lucide-vue-next';
|
||||||
|
|
||||||
const { t } = i18n.global;
|
const { t } = i18n.global;
|
||||||
|
|
||||||
|
const sortButton = ({ column, label, descFirst = false }) => (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-2 h-8 px-2"
|
||||||
|
onClick={() => {
|
||||||
|
const sorted = column.getIsSorted();
|
||||||
|
if (!sorted && descFirst) {
|
||||||
|
column.toggleSorting(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
column.toggleSorting(sorted === 'asc');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
<ArrowUpDown class="ml-1 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
export const createColumns = ({
|
export const createColumns = ({
|
||||||
randomUserColours,
|
randomUserColours,
|
||||||
rolesText,
|
rolesText,
|
||||||
@@ -64,7 +85,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'displayName',
|
id: 'displayName',
|
||||||
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.display_name'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
|
}),
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
@@ -91,7 +116,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'roles',
|
id: 'roles',
|
||||||
accessorFn: (row) => rolesText?.(row?.roleIds) ?? '',
|
accessorFn: (row) => rolesText?.(row?.roleIds) ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.roles'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.roles')
|
||||||
|
}),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
return <span>{rolesText?.(original?.roleIds) ?? ''}</span>;
|
return <span>{rolesText?.(original?.roleIds) ?? ''}</span>;
|
||||||
@@ -99,7 +128,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'managerNotes',
|
accessorKey: 'managerNotes',
|
||||||
header: () => t('dialog.group_member_moderation.notes'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.notes')
|
||||||
|
}),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span onClick={(e) => e.stopPropagation()}>
|
<span onClick={(e) => e.stopPropagation()}>
|
||||||
{row.original?.managerNotes}
|
{row.original?.managerNotes}
|
||||||
@@ -108,7 +141,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'joinedAt',
|
accessorKey: 'joinedAt',
|
||||||
header: () => t('dialog.group_member_moderation.joined_at'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.joined_at')
|
||||||
|
}),
|
||||||
size: 170,
|
size: 170,
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span>{formatDateFilter(row.original?.joinedAt, 'long')}</span>
|
<span>{formatDateFilter(row.original?.joinedAt, 'long')}</span>
|
||||||
@@ -116,7 +153,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'bannedAt',
|
accessorKey: 'bannedAt',
|
||||||
header: () => t('dialog.group_member_moderation.banned_at'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.banned_at')
|
||||||
|
}),
|
||||||
size: 170,
|
size: 170,
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span>{formatDateFilter(row.original?.bannedAt, 'long')}</span>
|
<span>{formatDateFilter(row.original?.bannedAt, 'long')}</span>
|
||||||
|
|||||||
@@ -1,8 +1,29 @@
|
|||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { i18n } from '@/plugin';
|
import { i18n } from '@/plugin';
|
||||||
|
import { ArrowUpDown } from 'lucide-vue-next';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
|
||||||
const { t } = i18n.global;
|
const { t } = i18n.global;
|
||||||
|
|
||||||
|
const sortButton = ({ column, label, descFirst = false }) => (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-2 h-8 px-2"
|
||||||
|
onClick={() => {
|
||||||
|
const sorted = column.getIsSorted();
|
||||||
|
if (!sorted && descFirst) {
|
||||||
|
column.toggleSorting(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
column.toggleSorting(sorted === 'asc');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
<ArrowUpDown class="ml-1 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
export const createColumns = ({
|
export const createColumns = ({
|
||||||
randomUserColours,
|
randomUserColours,
|
||||||
userImage,
|
userImage,
|
||||||
@@ -62,7 +83,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'displayName',
|
id: 'displayName',
|
||||||
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.display_name'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
|
}),
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
@@ -88,7 +113,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'managerNotes',
|
accessorKey: 'managerNotes',
|
||||||
header: () => t('dialog.group_member_moderation.notes'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.notes')
|
||||||
|
}),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span onClick={(e) => e.stopPropagation()}>
|
<span onClick={(e) => e.stopPropagation()}>
|
||||||
{row.original?.managerNotes}
|
{row.original?.managerNotes}
|
||||||
|
|||||||
@@ -1,8 +1,29 @@
|
|||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { i18n } from '@/plugin';
|
import { i18n } from '@/plugin';
|
||||||
|
import { ArrowUpDown } from 'lucide-vue-next';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
|
||||||
const { t } = i18n.global;
|
const { t } = i18n.global;
|
||||||
|
|
||||||
|
const sortButton = ({ column, label, descFirst = false }) => (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-2 h-8 px-2"
|
||||||
|
onClick={() => {
|
||||||
|
const sorted = column.getIsSorted();
|
||||||
|
if (!sorted && descFirst) {
|
||||||
|
column.toggleSorting(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
column.toggleSorting(sorted === 'asc');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
<ArrowUpDown class="ml-1 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
export const createColumns = ({
|
export const createColumns = ({
|
||||||
randomUserColours,
|
randomUserColours,
|
||||||
userImage,
|
userImage,
|
||||||
@@ -62,7 +83,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'displayName',
|
id: 'displayName',
|
||||||
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.display_name'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
|
}),
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
@@ -88,7 +113,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'managerNotes',
|
accessorKey: 'managerNotes',
|
||||||
header: () => t('dialog.group_member_moderation.notes'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.notes')
|
||||||
|
}),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span onClick={(e) => e.stopPropagation()}>
|
<span onClick={(e) => e.stopPropagation()}>
|
||||||
{row.original?.managerNotes}
|
{row.original?.managerNotes}
|
||||||
|
|||||||
@@ -1,8 +1,29 @@
|
|||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { i18n } from '@/plugin';
|
import { i18n } from '@/plugin';
|
||||||
|
import { ArrowUpDown } from 'lucide-vue-next';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
|
||||||
const { t } = i18n.global;
|
const { t } = i18n.global;
|
||||||
|
|
||||||
|
const sortButton = ({ column, label, descFirst = false }) => (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-2 h-8 px-2"
|
||||||
|
onClick={() => {
|
||||||
|
const sorted = column.getIsSorted();
|
||||||
|
if (!sorted && descFirst) {
|
||||||
|
column.toggleSorting(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
column.toggleSorting(sorted === 'asc');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
<ArrowUpDown class="ml-1 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
export const createColumns = ({
|
export const createColumns = ({
|
||||||
randomUserColours,
|
randomUserColours,
|
||||||
userImage,
|
userImage,
|
||||||
@@ -62,7 +83,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'displayName',
|
id: 'displayName',
|
||||||
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
accessorFn: (row) => row?.user?.displayName ?? row?.$displayName ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.display_name'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
|
}),
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
@@ -88,7 +113,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'managerNotes',
|
accessorKey: 'managerNotes',
|
||||||
header: () => t('dialog.group_member_moderation.notes'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.notes')
|
||||||
|
}),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span onClick={(e) => e.stopPropagation()}>
|
<span onClick={(e) => e.stopPropagation()}>
|
||||||
{row.original?.managerNotes}
|
{row.original?.managerNotes}
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ export const createColumns = ({ onShowUser }) => [
|
|||||||
column,
|
column,
|
||||||
label: t('dialog.group_member_moderation.display_name')
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
}),
|
}),
|
||||||
enableSorting: true,
|
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
|
|||||||
@@ -1,9 +1,30 @@
|
|||||||
import { Checkbox } from '@/components/ui/checkbox';
|
import { Checkbox } from '@/components/ui/checkbox';
|
||||||
import { i18n } from '@/plugin';
|
import { i18n } from '@/plugin';
|
||||||
import { formatDateFilter } from '@/shared/utils';
|
import { formatDateFilter } from '@/shared/utils';
|
||||||
|
import { ArrowUpDown } from 'lucide-vue-next';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
|
||||||
const { t } = i18n.global;
|
const { t } = i18n.global;
|
||||||
|
|
||||||
|
const sortButton = ({ column, label, descFirst = false }) => (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-2 h-8 px-2"
|
||||||
|
onClick={() => {
|
||||||
|
const sorted = column.getIsSorted();
|
||||||
|
if (!sorted && descFirst) {
|
||||||
|
column.toggleSorting(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
column.toggleSorting(sorted === 'asc');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
<ArrowUpDown class="ml-1 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
export const createColumns = ({
|
export const createColumns = ({
|
||||||
randomUserColours,
|
randomUserColours,
|
||||||
rolesText,
|
rolesText,
|
||||||
@@ -64,7 +85,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'displayName',
|
id: 'displayName',
|
||||||
accessorFn: (row) => row?.user?.displayName ?? '',
|
accessorFn: (row) => row?.user?.displayName ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.display_name'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.display_name')
|
||||||
|
}),
|
||||||
size: 160,
|
size: 160,
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
@@ -91,7 +116,11 @@ export const createColumns = ({
|
|||||||
{
|
{
|
||||||
id: 'roles',
|
id: 'roles',
|
||||||
accessorFn: (row) => rolesText?.(row?.roleIds) ?? '',
|
accessorFn: (row) => rolesText?.(row?.roleIds) ?? '',
|
||||||
header: () => t('dialog.group_member_moderation.roles'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.roles')
|
||||||
|
}),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const original = row.original;
|
const original = row.original;
|
||||||
return <span>{rolesText?.(original?.roleIds) ?? ''}</span>;
|
return <span>{rolesText?.(original?.roleIds) ?? ''}</span>;
|
||||||
@@ -99,7 +128,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'managerNotes',
|
accessorKey: 'managerNotes',
|
||||||
header: () => t('dialog.group_member_moderation.notes'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.notes')
|
||||||
|
}),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span onClick={(e) => e.stopPropagation()}>
|
<span onClick={(e) => e.stopPropagation()}>
|
||||||
{row.original?.managerNotes}
|
{row.original?.managerNotes}
|
||||||
@@ -108,7 +141,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'joinedAt',
|
accessorKey: 'joinedAt',
|
||||||
header: () => t('dialog.group_member_moderation.joined_at'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.joined_at')
|
||||||
|
}),
|
||||||
size: 170,
|
size: 170,
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<span>{formatDateFilter(row.original?.joinedAt, 'long')}</span>
|
<span>{formatDateFilter(row.original?.joinedAt, 'long')}</span>
|
||||||
@@ -116,7 +153,11 @@ export const createColumns = ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'visibility',
|
accessorKey: 'visibility',
|
||||||
header: () => t('dialog.group_member_moderation.visibility'),
|
header: ({ column }) =>
|
||||||
|
sortButton({
|
||||||
|
column,
|
||||||
|
label: t('dialog.group_member_moderation.visibility')
|
||||||
|
}),
|
||||||
size: 120,
|
size: 120,
|
||||||
cell: ({ row }) => <span>{row.original?.visibility}</span>
|
cell: ({ row }) => <span>{row.original?.visibility}</span>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user