mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-09 20:29:36 +02:00
add row sizing configuration
This commit is contained in:
@@ -95,11 +95,32 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.row .track-cell {
|
.row .track-cell {
|
||||||
|
padding-right: var(--theme-spacing-sm);
|
||||||
|
padding-left: var(--theme-spacing-sm);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.row .track-row-size-compact .track-cell {
|
||||||
|
padding-top: var(--theme-spacing-xs);
|
||||||
|
padding-bottom: var(--theme-spacing-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.row .track-row-size-default .track-cell {
|
||||||
|
padding-top: var(--theme-spacing-sm);
|
||||||
|
padding-bottom: var(--theme-spacing-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.row .track-row-size-large .track-cell {
|
||||||
|
padding-top: var(--theme-spacing-md);
|
||||||
|
padding-bottom: var(--theme-spacing-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
.row .track-cell-muted {
|
||||||
|
color: var(--theme-colors-foreground-muted);
|
||||||
|
}
|
||||||
|
|
||||||
.track-row-selected {
|
.track-row-selected {
|
||||||
@mixin dark {
|
@mixin dark {
|
||||||
background-color: lighten(var(--theme-colors-surface), 5%);
|
background-color: lighten(var(--theme-colors-surface), 5%);
|
||||||
@@ -133,7 +154,7 @@
|
|||||||
.skeleton-tracks {
|
.skeleton-tracks {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: var(--theme-spacing-xs);
|
gap: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.skeleton-track-row {
|
.skeleton-track-row {
|
||||||
@@ -141,6 +162,23 @@
|
|||||||
grid-template-columns: 40px 1fr 8rem;
|
grid-template-columns: 40px 1fr 8rem;
|
||||||
gap: var(--theme-spacing-sm);
|
gap: var(--theme-spacing-sm);
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
padding-right: var(--theme-spacing-sm);
|
||||||
|
padding-left: var(--theme-spacing-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skeleton-tracks-size-compact .skeleton-track-row {
|
||||||
|
padding-top: var(--theme-spacing-xs);
|
||||||
|
padding-bottom: var(--theme-spacing-xs);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skeleton-tracks-size-default .skeleton-track-row {
|
||||||
|
padding-top: var(--theme-spacing-sm);
|
||||||
|
padding-bottom: var(--theme-spacing-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skeleton-tracks-size-large .skeleton-track-row {
|
||||||
|
padding-top: var(--theme-spacing-md);
|
||||||
|
padding-bottom: var(--theme-spacing-md);
|
||||||
}
|
}
|
||||||
|
|
||||||
.skeleton-track-cell {
|
.skeleton-track-cell {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
||||||
|
import clsx from 'clsx';
|
||||||
import throttle from 'lodash/throttle';
|
import throttle from 'lodash/throttle';
|
||||||
import { AnimatePresence } from 'motion/react';
|
import { AnimatePresence } from 'motion/react';
|
||||||
import { useOverlayScrollbars } from 'overlayscrollbars-react';
|
import { useOverlayScrollbars } from 'overlayscrollbars-react';
|
||||||
@@ -38,7 +39,6 @@ import { ItemListKey, TableColumn } from '/@/shared/types/types';
|
|||||||
interface ItemDetailListProps {
|
interface ItemDetailListProps {
|
||||||
currentPage?: number;
|
currentPage?: number;
|
||||||
data?: unknown[];
|
data?: unknown[];
|
||||||
dataVersion?: number;
|
|
||||||
getItem?: (index: number) => unknown;
|
getItem?: (index: number) => unknown;
|
||||||
internalState?: ItemListStateActions;
|
internalState?: ItemListStateActions;
|
||||||
itemCount?: number;
|
itemCount?: number;
|
||||||
@@ -50,13 +50,12 @@ interface ItemDetailListProps {
|
|||||||
interface RowData {
|
interface RowData {
|
||||||
controls?: ItemControls;
|
controls?: ItemControls;
|
||||||
data: unknown[];
|
data: unknown[];
|
||||||
enableTrackTableHeader: boolean;
|
|
||||||
getItem?: (index: number) => unknown;
|
getItem?: (index: number) => unknown;
|
||||||
internalState: ItemListStateActions;
|
internalState: ItemListStateActions;
|
||||||
isMutatingFavorite: boolean;
|
isMutatingFavorite: boolean;
|
||||||
queryClient: ReturnType<typeof useQueryClient>;
|
|
||||||
registerSongs: (albumId: string, songs: Song[]) => void;
|
registerSongs: (albumId: string, songs: Song[]) => void;
|
||||||
trackColumns: ItemTableListColumnConfig[];
|
trackColumns: ItemTableListColumnConfig[];
|
||||||
|
trackTableSize: 'compact' | 'default' | 'large';
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TrackRowProps {
|
interface TrackRowProps {
|
||||||
@@ -65,6 +64,7 @@ interface TrackRowProps {
|
|||||||
isMutatingFavorite: boolean;
|
isMutatingFavorite: boolean;
|
||||||
onFavoriteClick: (song: Song) => void;
|
onFavoriteClick: (song: Song) => void;
|
||||||
rowIndex: number;
|
rowIndex: number;
|
||||||
|
size: 'compact' | 'default' | 'large';
|
||||||
song: Song;
|
song: Song;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +78,7 @@ const TrackRow = memo(
|
|||||||
isMutatingFavorite,
|
isMutatingFavorite,
|
||||||
onFavoriteClick,
|
onFavoriteClick,
|
||||||
rowIndex,
|
rowIndex,
|
||||||
|
size,
|
||||||
song,
|
song,
|
||||||
}: TrackRowProps) => {
|
}: TrackRowProps) => {
|
||||||
const playerContext = usePlayer();
|
const playerContext = usePlayer();
|
||||||
@@ -173,13 +174,13 @@ const TrackRow = memo(
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
className={
|
className={clsx({
|
||||||
isSelected
|
[styles.trackRowDragging]: isDragging,
|
||||||
? styles.trackRowSelected
|
[styles.trackRowSelected]: isSelected,
|
||||||
: isDragging
|
[styles.trackRowSizeCompact]: size === 'compact',
|
||||||
? styles.trackRowDragging
|
[styles.trackRowSizeDefault]: size === 'default',
|
||||||
: undefined
|
[styles.trackRowSizeLarge]: size === 'large',
|
||||||
}
|
})}
|
||||||
onClick={handleRowClick}
|
onClick={handleRowClick}
|
||||||
ref={dragRef ?? undefined}
|
ref={dragRef ?? undefined}
|
||||||
>
|
>
|
||||||
@@ -210,8 +211,16 @@ const TrackRow = memo(
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const isTitleColumn = col.id === TableColumn.TITLE;
|
||||||
return (
|
return (
|
||||||
<td className={styles.trackCell} key={col.id} style={style}>
|
<td
|
||||||
|
className={clsx(
|
||||||
|
styles.trackCell,
|
||||||
|
!isTitleColumn && styles.trackCellMuted,
|
||||||
|
)}
|
||||||
|
key={col.id}
|
||||||
|
style={style}
|
||||||
|
>
|
||||||
{content}
|
{content}
|
||||||
</td>
|
</td>
|
||||||
);
|
);
|
||||||
@@ -229,14 +238,13 @@ const RowContent = memo(
|
|||||||
({
|
({
|
||||||
controls,
|
controls,
|
||||||
data,
|
data,
|
||||||
enableTrackTableHeader,
|
|
||||||
getItem,
|
getItem,
|
||||||
index,
|
index,
|
||||||
internalState,
|
internalState,
|
||||||
isMutatingFavorite,
|
isMutatingFavorite,
|
||||||
queryClient,
|
|
||||||
registerSongs,
|
registerSongs,
|
||||||
trackColumns,
|
trackColumns,
|
||||||
|
trackTableSize,
|
||||||
}: RowContentProps) => {
|
}: RowContentProps) => {
|
||||||
const [showControls, setShowControls] = useState(false);
|
const [showControls, setShowControls] = useState(false);
|
||||||
const item = useMemo(() => {
|
const item = useMemo(() => {
|
||||||
@@ -291,7 +299,13 @@ const RowContent = memo(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.right}>
|
<div className={styles.right}>
|
||||||
<div className={styles.skeletonTracks}>
|
<div
|
||||||
|
className={clsx(styles.skeletonTracks, {
|
||||||
|
[styles.skeletonTracksSizeCompact]: trackTableSize === 'compact',
|
||||||
|
[styles.skeletonTracksSizeDefault]: trackTableSize === 'default',
|
||||||
|
[styles.skeletonTracksSizeLarge]: trackTableSize === 'large',
|
||||||
|
})}
|
||||||
|
>
|
||||||
{Array.from({ length: 10 }).map((_, i) => (
|
{Array.from({ length: 10 }).map((_, i) => (
|
||||||
<div className={styles.skeletonTrackRow} key={i}>
|
<div className={styles.skeletonTrackRow} key={i}>
|
||||||
<Skeleton className={styles.skeletonTrackCell} />
|
<Skeleton className={styles.skeletonTrackCell} />
|
||||||
@@ -354,6 +368,7 @@ const RowContent = memo(
|
|||||||
key={song.id}
|
key={song.id}
|
||||||
onFavoriteClick={onFavoriteClick}
|
onFavoriteClick={onFavoriteClick}
|
||||||
rowIndex={rowIndex}
|
rowIndex={rowIndex}
|
||||||
|
size={trackTableSize}
|
||||||
song={song as Song}
|
song={song as Song}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
@@ -366,14 +381,13 @@ const RowContent = memo(
|
|||||||
(prev, next) =>
|
(prev, next) =>
|
||||||
prev.index === next.index &&
|
prev.index === next.index &&
|
||||||
prev.data === next.data &&
|
prev.data === next.data &&
|
||||||
prev.enableTrackTableHeader === next.enableTrackTableHeader &&
|
|
||||||
prev.getItem === next.getItem &&
|
prev.getItem === next.getItem &&
|
||||||
prev.internalState === next.internalState &&
|
prev.internalState === next.internalState &&
|
||||||
prev.queryClient === next.queryClient &&
|
|
||||||
prev.isMutatingFavorite === next.isMutatingFavorite &&
|
prev.isMutatingFavorite === next.isMutatingFavorite &&
|
||||||
prev.controls === next.controls &&
|
prev.controls === next.controls &&
|
||||||
prev.registerSongs === next.registerSongs &&
|
prev.registerSongs === next.registerSongs &&
|
||||||
prev.trackColumns === next.trackColumns,
|
prev.trackColumns === next.trackColumns &&
|
||||||
|
prev.trackTableSize === next.trackTableSize,
|
||||||
);
|
);
|
||||||
|
|
||||||
RowContent.displayName = 'RowContent';
|
RowContent.displayName = 'RowContent';
|
||||||
@@ -392,7 +406,6 @@ RowComponent.displayName = 'ItemDetailRow';
|
|||||||
export const ItemDetailList = ({
|
export const ItemDetailList = ({
|
||||||
currentPage,
|
currentPage,
|
||||||
data,
|
data,
|
||||||
dataVersion,
|
|
||||||
getItem,
|
getItem,
|
||||||
itemCount: externalItemCount,
|
itemCount: externalItemCount,
|
||||||
items,
|
items,
|
||||||
@@ -462,7 +475,7 @@ export const ItemDetailList = ({
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
}, [tableConfig?.columns]);
|
}, [tableConfig?.columns]);
|
||||||
const enableTrackTableHeader = tableConfig?.enableHeader ?? false;
|
const trackTableSize = tableConfig?.size ?? 'default';
|
||||||
|
|
||||||
const handleRowsRendered = useCallback(
|
const handleRowsRendered = useCallback(
|
||||||
(range: { startIndex: number; stopIndex: number }) => {
|
(range: { startIndex: number; stopIndex: number }) => {
|
||||||
@@ -492,24 +505,24 @@ export const ItemDetailList = ({
|
|||||||
() => ({
|
() => ({
|
||||||
controls,
|
controls,
|
||||||
data: dataSource,
|
data: dataSource,
|
||||||
enableTrackTableHeader,
|
|
||||||
getItem,
|
getItem,
|
||||||
internalState,
|
internalState,
|
||||||
isMutatingFavorite,
|
isMutatingFavorite,
|
||||||
queryClient,
|
queryClient,
|
||||||
registerSongs,
|
registerSongs,
|
||||||
trackColumns,
|
trackColumns,
|
||||||
|
trackTableSize,
|
||||||
}),
|
}),
|
||||||
[
|
[
|
||||||
controls,
|
controls,
|
||||||
dataSource,
|
dataSource,
|
||||||
enableTrackTableHeader,
|
|
||||||
getItem,
|
getItem,
|
||||||
internalState,
|
internalState,
|
||||||
isMutatingFavorite,
|
isMutatingFavorite,
|
||||||
queryClient,
|
queryClient,
|
||||||
registerSongs,
|
registerSongs,
|
||||||
trackColumns,
|
trackColumns,
|
||||||
|
trackTableSize,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ export const AlbumListHeaderFilters = ({ toggleGenreTarget }: { toggleGenreTarge
|
|||||||
enableHeader: { hidden: true },
|
enableHeader: { hidden: true },
|
||||||
itemsPerPage: { hidden: true },
|
itemsPerPage: { hidden: true },
|
||||||
pagination: { hidden: true },
|
pagination: { hidden: true },
|
||||||
size: { hidden: true },
|
|
||||||
},
|
},
|
||||||
tableColumnsData: SONG_TABLE_COLUMNS,
|
tableColumnsData: SONG_TABLE_COLUMNS,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ const ItemTableListPropsSchema = z.object({
|
|||||||
enableHorizontalBorders: z.boolean(),
|
enableHorizontalBorders: z.boolean(),
|
||||||
enableRowHoverHighlight: z.boolean(),
|
enableRowHoverHighlight: z.boolean(),
|
||||||
enableVerticalBorders: z.boolean(),
|
enableVerticalBorders: z.boolean(),
|
||||||
size: z.enum(['compact', 'default']),
|
size: z.enum(['compact', 'default', 'large']),
|
||||||
});
|
});
|
||||||
|
|
||||||
const ItemListConfigSchema = z.object({
|
const ItemListConfigSchema = z.object({
|
||||||
|
|||||||
Reference in New Issue
Block a user