From 7925b601f42bbbb84b5cd766ba0f6482a23523d7 Mon Sep 17 00:00:00 2001 From: SergeantPanda Date: Thu, 11 Sep 2025 12:10:27 -0500 Subject: [PATCH] Add epg column to channels table. --- .../src/components/tables/ChannelsTable.jsx | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/frontend/src/components/tables/ChannelsTable.jsx b/frontend/src/components/tables/ChannelsTable.jsx index a3593ddc..63cfef47 100644 --- a/frontend/src/components/tables/ChannelsTable.jsx +++ b/frontend/src/components/tables/ChannelsTable.jsx @@ -45,6 +45,7 @@ import { Stack, Select, NumberInput, + Tooltip, } from '@mantine/core'; import { getCoreRowModel, flexRender } from '@tanstack/react-table'; import './table.css'; @@ -52,6 +53,7 @@ import useChannelsTableStore from '../../store/channelsTable'; import ChannelTableStreams from './ChannelTableStreams'; import LazyLogo from '../LazyLogo'; import useLocalStorage from '../../hooks/useLocalStorage'; +import useEPGsStore from '../../store/epgs'; import { CustomTable, useTable } from './CustomTable'; import ChannelsTableOnboarding from './ChannelsTable/ChannelsTableOnboarding'; import ChannelTableHeader from './ChannelsTable/ChannelTableHeader'; @@ -217,6 +219,9 @@ const ChannelRowActions = React.memo( ); const ChannelsTable = ({}) => { + // EPG data lookup + const tvgsById = useEPGsStore((s) => s.tvgsById); + const epgs = useEPGsStore((s) => s.epgs); const theme = useMantineTheme(); const channelGroups = useChannelsStore((s) => s.channelGroups); const canEditChannelGroup = useChannelsStore((s) => s.canEditChannelGroup); @@ -705,6 +710,50 @@ const ChannelsTable = ({}) => { ), }, + { + id: 'epg', + header: 'EPG', + accessorKey: 'epg_data_id', + cell: ({ getValue }) => { + const epgDataId = getValue(); + const epgObj = epgDataId ? tvgsById[epgDataId] : null; + const epgName = + epgObj && epgObj.epg_source + ? epgs[epgObj.epg_source]?.name || epgObj.epg_source + : null; + const epgDataName = epgObj?.name; + const tvgId = epgObj?.tvg_id; + const tooltip = epgObj + ? `${epgName ? `EPG Name: ${epgName}\n` : ''}${epgDataName ? `TVG Name: ${epgDataName}\n` : ''}${tvgId ? `TVG-ID: ${tvgId}` : ''}`.trim() + : ''; + return ( + + {epgObj && epgName ? ( + {tooltip} + } + withArrow + position="top" + > + {epgName} + + ) : epgObj ? ( + {epgObj.name} + ) : ( + Not linked + )} + + ); + }, + size: 120, + }, { id: 'channel_group', accessorFn: (row) => @@ -776,6 +825,24 @@ const ChannelsTable = ({}) => { } switch (header.id) { + case 'epg': + return ( + + + EPG + +
+ + ); case 'enabled': return (
@@ -867,6 +934,7 @@ const ChannelsTable = ({}) => { channel_number: renderHeaderCell, channel_group: renderHeaderCell, enabled: renderHeaderCell, + epg: renderHeaderCell, }, getRowStyles: (row) => { const hasStreams =