Signed-off-by: mbrucedogs <mbrucedogs@gmail.com>

This commit is contained in:
mbrucedogs 2025-07-20 18:31:36 -05:00
parent dfb3da4e10
commit b696dbdabd
7 changed files with 93 additions and 61 deletions

View File

@ -41,6 +41,8 @@ const ActionButton: React.FC<ActionButtonProps> = ({
}
};
const isIconOnly = icon && iconSlot === ActionButtonIconSlot.ICON_ONLY && !children;
return (
<IonButton
onClick={onClick}
@ -50,11 +52,14 @@ const ActionButton: React.FC<ActionButtonProps> = ({
size={getSize()}
className={className}
style={{
minWidth: '40px',
minWidth: isIconOnly ? '40px' : '40px',
minHeight: '40px',
width: isIconOnly ? '40px' : 'auto',
height: isIconOnly ? '40px' : 'auto',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
justifyContent: 'center',
padding: isIconOnly ? '0' : undefined
}}
>
{icon && <IonIcon

View File

@ -1,7 +1,9 @@
import React, { useState } from 'react';
import { IonSearchbar, IonModal, IonHeader, IonToolbar, IonTitle, IonButton, IonIcon, IonContent, IonItem } from '@ionic/react';
import { close, list } from 'ionicons/icons';
import { InfiniteScrollList, SongItem, ListItem, NumberDisplay, SongInfo } from '../../components/common';
import { IonSearchbar, IonModal, IonHeader, IonToolbar, IonTitle, IonContent, IonItem } from '@ionic/react';
import { list } from 'ionicons/icons';
import { InfiniteScrollList, SongItem, ListItem, NumberDisplay, SongInfo, ActionButton } from '../../components/common';
import { ActionButtonVariant, ActionButtonSize, ActionButtonIconSlot } from '../../types';
import { Icons } from '../../constants';
import { useArtists } from '../../hooks';
import { useAppSelector } from '../../redux';
import { selectSongs } from '../../redux';
@ -97,9 +99,16 @@ const Artists: React.FC = () => {
<IonHeader>
<IonToolbar>
<IonTitle>Songs by {selectedArtist}</IonTitle>
<IonButton slot="end" fill="clear" onClick={handleCloseArtistSongs}>
<IonIcon icon={close} />
</IonButton>
<div slot="end">
<ActionButton
onClick={handleCloseArtistSongs}
variant={ActionButtonVariant.SECONDARY}
size={ActionButtonSize.SMALL}
icon={Icons.CLOSE}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
/>
</div>
</IonToolbar>
</IonHeader>

View File

@ -234,7 +234,8 @@ const Queue: React.FC = () => {
return (
<>
<div className="ion-padding ion-text-end">
<div className="ion-padding">
<div style={{ display: 'flex', justifyContent: 'flex-end', marginBottom: '1rem' }}>
{isAdmin && (
<ActionButton
onClick={toggleQueueMode}
@ -247,7 +248,6 @@ const Queue: React.FC = () => {
)}
</div>
<div className="ion-padding">
{/* First Item (Currently Playing) */}
{renderFirstItem()}

View File

@ -134,13 +134,16 @@ const Settings: React.FC = () => {
<IonHeader>
<IonToolbar>
<IonTitle>Disabled Songs ({filteredDisabledSongs.length})</IonTitle>
<IonButton
slot="end"
fill="clear"
<div slot="end">
<ActionButton
onClick={() => setShowDisabledSongsModal(false)}
>
Close
</IonButton>
variant={ActionButtonVariant.SECONDARY}
size={ActionButtonSize.SMALL}
icon={Icons.CLOSE}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
/>
</div>
</IonToolbar>
</IonHeader>

View File

@ -74,7 +74,8 @@ const Singers: React.FC = () => {
return (
<>
<div className="ion-padding ion-text-end">
<div className="ion-padding">
<div style={{ display: 'flex', justifyContent: 'flex-end', marginBottom: '1rem' }}>
{isAdmin && (
<ActionButton
onClick={handleOpenAddModal}
@ -82,12 +83,11 @@ const Singers: React.FC = () => {
size={ActionButtonSize.SMALL}
icon={Icons.ADD}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
fill="solid"
/>
)}
</div>
<div className="ion-padding">
<InfiniteScrollList<Singer>
items={singers}
isLoading={singersCount === 0}
@ -112,13 +112,16 @@ const Singers: React.FC = () => {
<IonHeader>
<IonToolbar>
<IonTitle>Add New Singer</IonTitle>
<div slot="end">
<ActionButton
onClick={handleCloseAddModal}
variant={ActionButtonVariant.SECONDARY}
size={ActionButtonSize.SMALL}
icon={Icons.CLOSE}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
/>
</div>
</IonToolbar>
</IonHeader>

View File

@ -1,7 +1,9 @@
import React, { useState, useMemo, useCallback } from 'react';
import { IonItem, IonModal, IonHeader, IonToolbar, IonTitle, IonButton, IonIcon, IonChip, IonContent, IonList, IonAccordionGroup, IonAccordion } from '@ionic/react';
import { close, list } from 'ionicons/icons';
import { InfiniteScrollList, SongItem, ListItem, TwoLineDisplay, NumberDisplay, SongInfo } from '../../components/common';
import { IonItem, IonModal, IonHeader, IonToolbar, IonTitle, IonChip, IonContent, IonList, IonAccordionGroup, IonAccordion } from '@ionic/react';
import { list } from 'ionicons/icons';
import { InfiniteScrollList, SongItem, ListItem, TwoLineDisplay, NumberDisplay, SongInfo, ActionButton } from '../../components/common';
import { ActionButtonVariant, ActionButtonSize, ActionButtonIconSlot } from '../../types';
import { Icons } from '../../constants';
import { useSongLists } from '../../hooks';
import { useAppSelector } from '../../redux';
import { selectSongList } from '../../redux';
@ -101,9 +103,16 @@ const SongLists: React.FC = () => {
<IonHeader>
<IonToolbar>
<IonTitle>{finalSelectedList?.title}</IonTitle>
<IonButton slot="end" fill="clear" onClick={handleCloseSongList}>
<IonIcon icon={close} />
</IonButton>
<div slot="end">
<ActionButton
onClick={handleCloseSongList}
variant={ActionButtonVariant.SECONDARY}
size={ActionButtonSize.SMALL}
icon={Icons.CLOSE}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
/>
</div>
</IonToolbar>
</IonHeader>

View File

@ -141,13 +141,16 @@ const Top100: React.FC = () => {
<IonHeader>
<IonToolbar>
<IonTitle>{selectedTopPlayed?.artist}</IonTitle>
<div slot="end">
<ActionButton
onClick={handleCloseModal}
variant={ActionButtonVariant.SECONDARY}
size={ActionButtonSize.SMALL}
icon={Icons.CLOSE}
iconSlot={ActionButtonIconSlot.ICON_ONLY}
fill="clear"
/>
</div>
</IonToolbar>
</IonHeader>