From 413d4d77cd1793d3403999e5f15626cbf2c48f4b Mon Sep 17 00:00:00 2001 From: vterentev Date: Mon, 5 Jan 2026 12:20:08 +0300 Subject: [PATCH] GML-72: Fix column rendering and loader icon --- src/shared/converters/index.tsx | 38 ++++++--- src/widgets/profiles-table/lib/columns.tsx | 99 ++++++++++++++-------- 2 files changed, 91 insertions(+), 46 deletions(-) diff --git a/src/shared/converters/index.tsx b/src/shared/converters/index.tsx index e323f113..01488fe8 100644 --- a/src/shared/converters/index.tsx +++ b/src/shared/converters/index.tsx @@ -11,13 +11,13 @@ import quilt from '@/assets/logos/quilt.png'; export const convertGameLoaderImage = (loader: GameLoaderOption) => { const converter: Record = { - [GameLoaderOption.VANILLA]: Minecraft, - [GameLoaderOption.FORGE]: Forge, - [GameLoaderOption.FABRIC]: Fabric, - [GameLoaderOption.NEOFORGE]: NeoForge, - [GameLoaderOption.QUILT]: Quilt, + [GameLoaderOption.VANILLA]: Minecraft, + [GameLoaderOption.FORGE]: Forge, + [GameLoaderOption.FABRIC]: Fabric, + [GameLoaderOption.NEOFORGE]: NeoForge, + [GameLoaderOption.QUILT]: Quilt, [GameLoaderOption.LITELOADER]: ( - Liteloader + Liteloader ), }; @@ -27,24 +27,38 @@ export const convertGameLoaderImage = (loader: GameLoaderOption) => { export const convertApiGameLoaderImage = (loader: GameLoaderType) => { const converter: Record = { [GameLoaderType.VANILLA]: ( - Minecraft + Minecraft ), [GameLoaderType.FORGE]: ( - Forge + Forge ), [GameLoaderType.FABRIC]: ( - Fabric + Fabric ), [GameLoaderType.NEOFORGE]: ( - NeoForge + NeoForge ), [GameLoaderType.QUILT]: ( - Quilt + Quilt ), [GameLoaderType.LITELOADER]: ( - Liteloader + Liteloader ), }; return converter[loader]; }; + + +export const convertApiGameLoaderName = (loader: GameLoaderType) => { + const converter: Record = { + [GameLoaderType.VANILLA]: 'Minecraft', + [GameLoaderType.FORGE]: 'Forge', + [GameLoaderType.FABRIC]: 'Fabric', + [GameLoaderType.NEOFORGE]: 'NeoForge', + [GameLoaderType.QUILT]: 'Quilt', + [GameLoaderType.LITELOADER]: 'Liteloader', + }; + + return converter[loader]; +}; diff --git a/src/widgets/profiles-table/lib/columns.tsx b/src/widgets/profiles-table/lib/columns.tsx index 199b664c..8f9e1c2e 100644 --- a/src/widgets/profiles-table/lib/columns.tsx +++ b/src/widgets/profiles-table/lib/columns.tsx @@ -5,7 +5,7 @@ import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { useQueryClient } from '@tanstack/react-query'; import { createColumnHelper } from '@tanstack/table-core'; -import { Edit2Icon, Trash2Icon } from 'lucide-react'; +import { Edit2Icon, Trash2Icon, X } from 'lucide-react'; import { ClientState } from '@/widgets/client-hub'; import { DataTableColumnHeader } from '@/entities/Table'; @@ -16,14 +16,14 @@ import { DASHBOARD_PAGES } from '@/shared/routes'; import { Icons } from '@/shared/ui/icons'; import { getFormatDate } from '@/shared/lib/utils'; import { profileKeys } from '@/shared/hooks'; -import { convertApiGameLoaderImage } from '@/shared/converters'; +import { convertApiGameLoaderImage, convertApiGameLoaderName } from '@/shared/converters'; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/shared/ui/tooltip"; enum ColumnHeader { ICON = '', NAME = 'Название', CREATED_AT = 'Дата создания', VERSION_LAUNCHER = 'Запускаемая версия', - LOADER_LAUNCHER = '', GAME_VERSION = 'Версия', PRIORITY = 'Приоритет', PROFILE_STATE = 'Статус', @@ -71,29 +71,68 @@ export const useColumns = (props: UseColumnsProps) => { enableSorting: false, enableHiding: false, }), + + columnsHelper.accessor('iconBase64', { size: 64, header: ColumnHeader.ICON, - cell: ({ row }) => - row.original.iconBase64 ? ( - {row.original.name - ) : ( -
- {row.original.name.substring(0, 2).toUpperCase()} + cell: ({ row }) => { + const hasIcon = Boolean(row.original.iconBase64); + const hasLoader = Boolean(row.original.loader); + + const loaderIcon = convertApiGameLoaderImage(row.original.loader); + const loaderName = convertApiGameLoaderName(row.original.loader); + + return ( +
+
+ {hasLoader ? ( + + + {loaderIcon} + + + {loaderName}: {row.original.launchVersion} + + + ) : ( + + + + + +

Не загружен

+
+
+ )} +
+ + + {hasIcon ? ( + {row.original.name + ) : ( +
+ {row.original.name.substring(0, 2).toUpperCase()} +
+ )}
- ), + + + ); + } + }), columnsHelper.display({ size: 400, id: 'name', - header: ({ column }) => , + header: ({ column }) => , cell: ({ row }) => (

{row.original.name}

@@ -101,18 +140,10 @@ export const useColumns = (props: UseColumnsProps) => {
), }), - columnsHelper.accessor('loader', { - size: 70, - enableSorting: false, - header: ({ column }) => ( - - ), - cell: ({ getValue }) => (getValue() ? convertApiGameLoaderImage(getValue()) : 'Не загружен'), - }), columnsHelper.accessor('launchVersion', { size: 500, header: ({ column }) => ( - + ), cell: ({ getValue }) => (getValue() ? getValue() : 'Не загружен'), }), @@ -120,37 +151,37 @@ export const useColumns = (props: UseColumnsProps) => { size: 100, header: ({ column }) => ( - + ), cell: ({ getValue }) => getValue(), }), columnsHelper.accessor('createDate', { size: 500, header: ({ column }) => ( - + ), cell: ({ getValue }) => getFormatDate(getValue()), }), columnsHelper.accessor('priority', { size: 150, header: ({ column }) => ( - + ), cell: ({ getValue }) => getValue(), }), columnsHelper.accessor('state', { size: 270, header: ({ column }) => ( - + ), - cell: ({ getValue }) => , + cell: ({ getValue }) => , }), columnsHelper.display({ size: 48, id: 'edit', cell: ({ row }) => ( ), }), @@ -171,9 +202,9 @@ export const useColumns = (props: UseColumnsProps) => { disabled={props.isPendingDelete} > {props.isPendingDelete ? ( - + ) : ( - + )} );