2022-12-19 15:59:14 -08:00
|
|
|
import type { ChangeEvent } from 'react';
|
2022-12-20 04:26:04 -08:00
|
|
|
import { MultiSelect } from '/@/renderer/components/select';
|
|
|
|
|
import { Slider } from '/@/renderer/components/slider';
|
|
|
|
|
import { Switch } from '/@/renderer/components/switch';
|
2023-05-28 14:31:49 -07:00
|
|
|
import {
|
2023-07-01 19:10:05 -07:00
|
|
|
useSettingsStoreActions,
|
|
|
|
|
useSettingsStore,
|
|
|
|
|
useLyricsSettings,
|
2023-05-28 14:31:49 -07:00
|
|
|
} from '/@/renderer/store/settings.store';
|
2022-12-19 15:59:14 -08:00
|
|
|
import { TableColumn, TableType } from '/@/renderer/types';
|
2023-03-28 14:19:23 -07:00
|
|
|
import { Option } from '/@/renderer/components/option';
|
2023-06-04 23:15:36 -07:00
|
|
|
import { NumberInput } from '/@/renderer/components/input';
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2022-12-27 13:13:12 -08:00
|
|
|
export const SONG_TABLE_COLUMNS = [
|
2023-07-01 19:10:05 -07:00
|
|
|
{ label: 'Row Index', value: TableColumn.ROW_INDEX },
|
|
|
|
|
{ label: 'Title', value: TableColumn.TITLE },
|
|
|
|
|
{ label: 'Title (Combined)', value: TableColumn.TITLE_COMBINED },
|
|
|
|
|
{ label: 'Duration', value: TableColumn.DURATION },
|
|
|
|
|
{ label: 'Album', value: TableColumn.ALBUM },
|
|
|
|
|
{ label: 'Album Artist', value: TableColumn.ALBUM_ARTIST },
|
|
|
|
|
{ label: 'Artist', value: TableColumn.ARTIST },
|
|
|
|
|
{ label: 'Genre', value: TableColumn.GENRE },
|
|
|
|
|
{ label: 'Year', value: TableColumn.YEAR },
|
|
|
|
|
{ label: 'Release Date', value: TableColumn.RELEASE_DATE },
|
|
|
|
|
{ label: 'Disc Number', value: TableColumn.DISC_NUMBER },
|
|
|
|
|
{ label: 'Track Number', value: TableColumn.TRACK_NUMBER },
|
|
|
|
|
{ label: 'Bitrate', value: TableColumn.BIT_RATE },
|
|
|
|
|
{ label: 'Last Played', value: TableColumn.LAST_PLAYED },
|
|
|
|
|
{ label: 'Note', value: TableColumn.COMMENT },
|
|
|
|
|
{ label: 'Channels', value: TableColumn.CHANNELS },
|
|
|
|
|
{ label: 'BPM', value: TableColumn.BPM },
|
|
|
|
|
{ label: 'Date Added', value: TableColumn.DATE_ADDED },
|
|
|
|
|
{ label: 'Path', value: TableColumn.PATH },
|
|
|
|
|
{ label: 'Plays', value: TableColumn.PLAY_COUNT },
|
|
|
|
|
{ label: 'Size', value: TableColumn.SIZE },
|
|
|
|
|
{ label: 'Favorite', value: TableColumn.USER_FAVORITE },
|
|
|
|
|
{ label: 'Rating', value: TableColumn.USER_RATING },
|
2023-07-18 17:37:32 -07:00
|
|
|
{ label: 'Actions', value: TableColumn.ACTIONS },
|
2023-07-01 19:10:05 -07:00
|
|
|
// { label: 'Skip', value: TableColumn.SKIP },
|
2022-12-19 15:59:14 -08:00
|
|
|
];
|
|
|
|
|
|
2022-12-28 01:44:49 -08:00
|
|
|
export const ALBUM_TABLE_COLUMNS = [
|
2023-07-01 19:10:05 -07:00
|
|
|
{ label: 'Row Index', value: TableColumn.ROW_INDEX },
|
|
|
|
|
{ label: 'Title', value: TableColumn.TITLE },
|
|
|
|
|
{ label: 'Title (Combined)', value: TableColumn.TITLE_COMBINED },
|
|
|
|
|
{ label: 'Duration', value: TableColumn.DURATION },
|
|
|
|
|
{ label: 'Album Artist', value: TableColumn.ALBUM_ARTIST },
|
|
|
|
|
{ label: 'Artist', value: TableColumn.ARTIST },
|
|
|
|
|
{ label: 'Genre', value: TableColumn.GENRE },
|
|
|
|
|
{ label: 'Year', value: TableColumn.YEAR },
|
|
|
|
|
{ label: 'Release Date', value: TableColumn.RELEASE_DATE },
|
|
|
|
|
{ label: 'Last Played', value: TableColumn.LAST_PLAYED },
|
|
|
|
|
{ label: 'Date Added', value: TableColumn.DATE_ADDED },
|
|
|
|
|
{ label: 'Plays', value: TableColumn.PLAY_COUNT },
|
|
|
|
|
{ label: 'Favorite', value: TableColumn.USER_FAVORITE },
|
|
|
|
|
{ label: 'Rating', value: TableColumn.USER_RATING },
|
2023-07-18 17:37:32 -07:00
|
|
|
{ label: 'Actions', value: TableColumn.ACTIONS },
|
2022-12-28 01:44:49 -08:00
|
|
|
];
|
|
|
|
|
|
2022-12-30 21:04:06 -08:00
|
|
|
export const ALBUMARTIST_TABLE_COLUMNS = [
|
2023-07-01 19:10:05 -07:00
|
|
|
{ label: 'Row Index', value: TableColumn.ROW_INDEX },
|
|
|
|
|
{ label: 'Title', value: TableColumn.TITLE },
|
|
|
|
|
{ label: 'Title (Combined)', value: TableColumn.TITLE_COMBINED },
|
|
|
|
|
{ label: 'Duration', value: TableColumn.DURATION },
|
|
|
|
|
{ label: 'Biography', value: TableColumn.BIOGRAPHY },
|
|
|
|
|
{ label: 'Genre', value: TableColumn.GENRE },
|
|
|
|
|
{ label: 'Last Played', value: TableColumn.LAST_PLAYED },
|
|
|
|
|
{ label: 'Plays', value: TableColumn.PLAY_COUNT },
|
|
|
|
|
{ label: 'Album Count', value: TableColumn.ALBUM_COUNT },
|
|
|
|
|
{ label: 'Song Count', value: TableColumn.SONG_COUNT },
|
|
|
|
|
{ label: 'Favorite', value: TableColumn.USER_FAVORITE },
|
|
|
|
|
{ label: 'Rating', value: TableColumn.USER_RATING },
|
2023-07-18 17:37:32 -07:00
|
|
|
{ label: 'Actions', value: TableColumn.ACTIONS },
|
2022-12-30 21:04:06 -08:00
|
|
|
];
|
|
|
|
|
|
2022-12-31 03:46:12 -08:00
|
|
|
export const PLAYLIST_TABLE_COLUMNS = [
|
2023-07-01 19:10:05 -07:00
|
|
|
{ label: 'Row Index', value: TableColumn.ROW_INDEX },
|
|
|
|
|
{ label: 'Title', value: TableColumn.TITLE },
|
|
|
|
|
{ label: 'Title (Combined)', value: TableColumn.TITLE_COMBINED },
|
|
|
|
|
{ label: 'Duration', value: TableColumn.DURATION },
|
|
|
|
|
{ label: 'Owner', value: TableColumn.OWNER },
|
|
|
|
|
// { label: 'Genre', value: TableColumn.GENRE },
|
|
|
|
|
{ label: 'Song Count', value: TableColumn.SONG_COUNT },
|
2023-07-18 17:37:32 -07:00
|
|
|
{ label: 'Actions', value: TableColumn.ACTIONS },
|
2022-12-31 03:46:12 -08:00
|
|
|
];
|
|
|
|
|
|
2022-12-19 15:59:14 -08:00
|
|
|
interface TableConfigDropdownProps {
|
2023-07-01 19:10:05 -07:00
|
|
|
type: TableType;
|
2022-12-19 15:59:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const TableConfigDropdown = ({ type }: TableConfigDropdownProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
const { setSettings } = useSettingsStoreActions();
|
|
|
|
|
const tableConfig = useSettingsStore((state) => state.tables);
|
|
|
|
|
const lyricConfig = useLyricsSettings();
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleAddOrRemoveColumns = (values: TableColumn[]) => {
|
|
|
|
|
const existingColumns = tableConfig[type].columns;
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
if (values.length === 0) {
|
|
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
columns: [],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
// If adding a column
|
|
|
|
|
if (values.length > existingColumns.length) {
|
|
|
|
|
const newColumn = { column: values[values.length - 1] };
|
|
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
columns: [...existingColumns, newColumn],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
// If removing a column
|
|
|
|
|
else {
|
|
|
|
|
const removed = existingColumns.filter((column) => !values.includes(column.column));
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const newColumns = existingColumns.filter((column) => !removed.includes(column));
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
columns: newColumns,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleUpdateRowHeight = (value: number) => {
|
|
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
rowHeight: value,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleUpdateAutoFit = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
autoFit: e.currentTarget.checked,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleUpdateFollow = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setSettings({
|
|
|
|
|
tables: {
|
|
|
|
|
...useSettingsStore.getState().tables,
|
|
|
|
|
[type]: {
|
|
|
|
|
...useSettingsStore.getState().tables[type],
|
|
|
|
|
followCurrentSong: e.currentTarget.checked,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2022-12-19 15:59:14 -08:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleLyricFollow = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setSettings({
|
|
|
|
|
lyrics: {
|
|
|
|
|
...useSettingsStore.getState().lyrics,
|
|
|
|
|
follow: e.currentTarget.checked,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2023-05-28 14:31:49 -07:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
const handleLyricOffset = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
setSettings({
|
|
|
|
|
lyrics: {
|
|
|
|
|
...useSettingsStore.getState().lyrics,
|
|
|
|
|
delayMs: Number(e.currentTarget.value),
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
2023-06-04 23:15:36 -07:00
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Label>Auto-fit Columns</Option.Label>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<Switch
|
|
|
|
|
defaultChecked={tableConfig[type]?.autoFit}
|
|
|
|
|
onChange={handleUpdateAutoFit}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Label>Follow current song</Option.Label>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<Switch
|
|
|
|
|
defaultChecked={tableConfig[type]?.followCurrentSong}
|
|
|
|
|
onChange={handleUpdateFollow}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Label>Follow current lyrics</Option.Label>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<Switch
|
|
|
|
|
defaultChecked={lyricConfig.follow}
|
|
|
|
|
onChange={handleLyricFollow}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Label>Lyric offset (ms)</Option.Label>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<NumberInput
|
|
|
|
|
defaultValue={lyricConfig.delayMs}
|
|
|
|
|
step={10}
|
|
|
|
|
onBlur={handleLyricOffset}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<Slider
|
|
|
|
|
defaultValue={tableConfig[type]?.rowHeight}
|
|
|
|
|
label={(value) => `Item size: ${value}`}
|
|
|
|
|
max={100}
|
|
|
|
|
min={25}
|
|
|
|
|
w="100%"
|
|
|
|
|
onChangeEnd={handleUpdateRowHeight}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
<Option>
|
|
|
|
|
<Option.Control>
|
|
|
|
|
<MultiSelect
|
|
|
|
|
clearable
|
|
|
|
|
data={SONG_TABLE_COLUMNS}
|
|
|
|
|
defaultValue={tableConfig[type]?.columns.map((column) => column.column)}
|
|
|
|
|
dropdownPosition="bottom"
|
|
|
|
|
width={300}
|
|
|
|
|
onChange={handleAddOrRemoveColumns}
|
|
|
|
|
/>
|
|
|
|
|
</Option.Control>
|
|
|
|
|
</Option>
|
|
|
|
|
</>
|
|
|
|
|
);
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|