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 });
+ },
});