diff --git a/packages/raga-app/src/client/components/trackTable/trackTable.tsx b/packages/raga-app/src/client/components/trackTable/trackTable.tsx index d8e35cc7..d3c5fec3 100644 --- a/packages/raga-app/src/client/components/trackTable/trackTable.tsx +++ b/packages/raga-app/src/client/components/trackTable/trackTable.tsx @@ -26,6 +26,7 @@ import classNames from "classnames"; import { unique } from "radash"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { Roarr as log } from "roarr"; +import { useResizeObserver } from "usehooks-ts"; import { useShallow } from "zustand/react/shallow"; import { TRACK_TABLE_ROW_HEIGHT } from "../../../common/constants"; @@ -134,6 +135,19 @@ export default function TrackTable({ playlistId }: TrackTableProps) { sortedTrackDefs, }); + const setTrackTablePanelWidth = appStore.use.setTrackTablePanelWidth(); + const handleTrackTableResize = useCallback( + (size: { width: number | undefined }) => { + setTrackTablePanelWidth(size.width); + }, + [setTrackTablePanelWidth], + ); + + useResizeObserver({ + ref: containerElement, + onResize: handleTrackTableResize, + }); + const table = ( ) { const analyzeBPMPerTrack = appStore.use.analyzeBPMPerTrack(); + const disabledColumns = useDisabledColumns(); + return (
@@ -227,6 +243,7 @@ function TrackTableHeader({ playlistId }: Pick) { className={styles.headerCell} stiff={true} sortKey={TrackPropertySortKey.RATING} + hide={disabledColumns.rating} > Rating @@ -241,6 +258,7 @@ function TrackTableHeader({ playlistId }: Pick) { className={styles.headerCell} stiff={true} sortKey={TrackPropertySortKey.FILESOURCE} + hide={disabledColumns.filesource} > Source @@ -269,6 +287,7 @@ interface TrackTableRowProps const TrackTableRow = ({ item: track, playlistId }: TrackTableRowProps) => { const analyzeBPMPerTrack = appStore.use.analyzeBPMPerTrack(); const activeTrackId = appStore.use.activeTrackId(); + const disabledColumns = useDisabledColumns(); return ( { - - - + {disabledColumns.rating ? null : ( + + + + )} - - - + {disabledColumns.filesource ? null : ( + + + + )} @@ -383,9 +406,21 @@ function useTrackDefinitionNodes(playlistId: string): Data ); } +/** Determines which track table columns should be hidden according to responsive design constraints */ +function useDisabledColumns(): PartialRecord { + const trackTablePanelWidth = appStore.use.trackTablePanelWidth() ?? 9999; + + return useMemo(() => { + return { + [TrackPropertySortKey.RATING]: trackTablePanelWidth < 700, + [TrackPropertySortKey.FILESOURCE]: trackTablePanelWidth < 650, + }; + }, [trackTablePanelWidth]); +} + /** Configures CSS grid styles. */ function useTableTheme(numTracksInPlaylist: number): Theme { - const indexColumnWidth = Math.log10(numTracksInPlaylist) * 10 + 15; + const indexColumnWidth = Math.ceil(Math.log10(numTracksInPlaylist) * 10 + 15); const analyzeColumnWidth = 90; const bpmColumnWidth = 60; const ratingColumnWidth = 90; @@ -393,16 +428,19 @@ function useTableTheme(numTracksInPlaylist: number): Theme { const fileSourceColumnWidth = 80; const dateAddedColumnWidth = 80; + const disabledColumns = useDisabledColumns(); + const gridTemplateColumns = [ `${indexColumnWidth.toString()}px`, `${analyzeColumnWidth.toString()}px`, `${bpmColumnWidth.toString()}px`, `repeat(2, minmax(40px, 1fr))`, - `${ratingColumnWidth.toString()}px`, + disabledColumns.rating ? undefined : `${ratingColumnWidth.toString()}px`, `${fileTypeColumnWidth.toString()}px`, - `${fileSourceColumnWidth.toString()}px`, + disabledColumns.filesource ? undefined : `${fileSourceColumnWidth.toString()}px`, `${dateAddedColumnWidth.toString()}px`, - ]; + ].filter((value) => !!value); + return useTheme([ { Table: ` diff --git a/packages/raga-app/src/client/store/slices/trackTableSlice.ts b/packages/raga-app/src/client/store/slices/trackTableSlice.ts index 0941e8be..a56e1d97 100644 --- a/packages/raga-app/src/client/store/slices/trackTableSlice.ts +++ b/packages/raga-app/src/client/store/slices/trackTableSlice.ts @@ -9,11 +9,13 @@ export interface TrackTableSortState { export interface TrackTableState { trackTableFilterVisible: boolean; trackTableSort: TrackTableSortState; + trackTablePanelWidth: number | undefined; } export interface TrackTableActions { setTrackTableFilterVisible: (isVisible: boolean) => void; setTrackTableSort: (sort: TrackTableSortState) => void; + setTrackTablePanelWidth: (width: number | undefined) => void; } export const createTrackTableSlice: AppStoreSliceCreator = ( @@ -24,6 +26,8 @@ export const createTrackTableSlice: AppStoreSliceCreator { set({ trackTableFilterVisible: isVisible }); }, @@ -31,4 +35,8 @@ export const createTrackTableSlice: AppStoreSliceCreator { set({ trackTableSort: newSort }); }, + + setTrackTablePanelWidth: (width) => { + set({ trackTablePanelWidth: width }); + }, });