💄 Beautified metadata tabs

This commit is contained in:
2021-08-20 09:17:27 -07:00
parent 7aa3db125b
commit f6650fc18d
2 changed files with 77 additions and 14 deletions

View File

@@ -35,6 +35,7 @@ type ComicDetailProps = {};
export const ComicDetail = ({}: ComicDetailProps): ReactElement => { export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [isActionDropdownCollapsed, collapseActionDropdown] = useState(false);
const comicVineSearchResults = useSelector( const comicVineSearchResults = useSelector(
(state: RootState) => state.comicInfo.searchResults, (state: RootState) => state.comicInfo.searchResults,
@@ -50,6 +51,8 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
); );
const { comicObjectId } = useParams<{ comicObjectId: string }>(); const { comicObjectId } = useParams<{ comicObjectId: string }>();
const dispatch = useDispatch(); const dispatch = useDispatch();
const toggleActionDropdown = () =>
collapseActionDropdown(!isActionDropdownCollapsed);
useEffect(() => { useEffect(() => {
dispatch(getComicBookDetailById(comicObjectId)); dispatch(getComicBookDetailById(comicObjectId));
@@ -77,6 +80,7 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
{ {
id: 1, id: 1,
name: "Volume Information", name: "Volume Information",
icon: <i className="fas fa-layer-group"></i>,
content: isComicBookMetadataAvailable ? ( content: isComicBookMetadataAvailable ? (
<> <>
<div className="columns"> <div className="columns">
@@ -135,6 +139,7 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
}, },
{ {
id: 2, id: 2,
icon: <i className="fas fa-puzzle-piece"></i>,
name: "Other Metadata", name: "Other Metadata",
content: <div>bastard</div>, content: <div>bastard</div>,
}, },
@@ -144,13 +149,16 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
<> <>
<div className="tabs"> <div className="tabs">
<ul> <ul>
{tabGroup.map(({ id, name }) => ( {tabGroup.map(({ id, name, icon }) => (
<li <li
key={id} key={id}
className={id === active ? "is-active" : ""} className={id === active ? "is-active" : ""}
onClick={() => setActive(id)} onClick={() => setActive(id)}
> >
<a>{name}</a> <a>
<span className="icon is-small">{icon}</span>
{name}
</a>
</li> </li>
))} ))}
</ul> </ul>
@@ -212,13 +220,13 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
let imagePath = ""; let imagePath = "";
let comicBookTitle = ""; let comicBookTitle = "";
if (!isNil(comicBookDetailData.rawFilDetails)) { if (!isNil(comicBookDetailData.rawFileDetails)) {
const encodedFilePath = encodeURI( const encodedFilePath = encodeURI(
"http://localhost:3000" + "http://localhost:3000" +
removeLeadingPeriod(comicBookDetailData.rawFilDetails.path), removeLeadingPeriod(comicBookDetailData.rawFileDetails.path),
); );
imagePath = escapePoundSymbol(encodedFilePath); imagePath = escapePoundSymbol(encodedFilePath);
comicBookTitle = comicBookDetailData.rawFilDetails.name; comicBookTitle = comicBookDetailData.rawFileDetails.name;
} else if ( } else if (
!isNil(comicBookDetailData.sourcedMetadata) && !isNil(comicBookDetailData.sourcedMetadata) &&
!isNil(comicBookDetailData.sourcedMetadata.comicvine) !isNil(comicBookDetailData.sourcedMetadata.comicvine)
@@ -240,6 +248,7 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
hasDetails={false} hasDetails={false}
/> />
</div> </div>
{/* raw file details */}
<div className="column"> <div className="column">
{!isNil(comicBookDetailData.rawFileDetails) && ( {!isNil(comicBookDetailData.rawFileDetails) && (
<> <>
@@ -247,21 +256,68 @@ export const ComicDetail = ({}: ComicDetailProps): ReactElement => {
<Divider /> <Divider />
</> </>
)} )}
{/* comic vine scraped metadata */}
{!isNil(comicBookDetailData.sourcedMetadata.comicvine) && ( {!isNil(comicBookDetailData.sourcedMetadata.comicvine) && (
<ComicVineDetails <ComicVineDetails
data={comicBookDetailData.sourcedMetadata.comicvine} data={comicBookDetailData.sourcedMetadata.comicvine}
updatedAt={comicBookDetailData.updatedAt} updatedAt={comicBookDetailData.updatedAt}
/> />
)} )}
<button {/* action dropdown */}
className="button is-small" <div
onClick={openDrawerWithCVMatches} className={
"dropdown " + (isActionDropdownCollapsed ? "is-active" : "")
}
onBlur={() => toggleActionDropdown()}
> >
<span className="icon"> <div className="dropdown-trigger">
<i className="fas fa-magic"></i> <button
</span> className="button is-small"
<span>Match on Comic Vine</span> aria-haspopup="true"
</button> aria-controls="dropdown-menu2"
onClick={() => toggleActionDropdown()}
>
<span>
<i className="fas fa-sliders-h"></i> Actions
</span>
<span className="icon is-small">
<i className="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</div>
<div
className="dropdown-menu"
id="dropdown-menu2"
role="menu"
>
<div className="dropdown-content">
<div
className="dropdown-item"
onClick={openDrawerWithCVMatches}
>
<span className="icon">
<i className="fas fa-magic"></i>
</span>
<span>Match on ComicVine</span>
</div>
<hr className="dropdown-divider" />
<div className="dropdown-item">
<span className="icon">
<i className="fas fa-edit"></i>
</span>
<span>Edit Metdata</span>
</div>
<hr className="dropdown-divider" />
<div className="dropdown-item">
<span className="icon">
<i className="fas fa-trash"></i>
</span>
<span>Delete Comic</span>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>

View File

@@ -257,7 +257,6 @@ export const Library = ({}: IComicBookLibraryProps): ReactElement => {
}), }),
); );
}, [pageIndex, pageSize]); }, [pageIndex, pageSize]);
const comicBookLibraryItems = React.useMemo(() => {});
return ( return (
<section className="container"> <section className="container">
@@ -307,15 +306,19 @@ export const Library = ({}: IComicBookLibraryProps): ReactElement => {
</tbody> </tbody>
</table> </table>
{/* pagination controls */}
<nav <nav
className="pagination" className="pagination"
role="navigation" role="navigation"
aria-label="pagination" aria-label="pagination"
> >
{/* x of total indicator */}
<div> <div>
Page {pageIndex} of {Math.ceil(pageTotal / pageSize)} Page {pageIndex} of {Math.ceil(pageTotal / pageSize)}
(Total resources: {pageTotal}) (Total resources: {pageTotal})
</div> </div>
{/* previous page and next page controls */}
<div className="field has-addons"> <div className="field has-addons">
<p className="control"> <p className="control">
<button <button
@@ -337,6 +340,7 @@ export const Library = ({}: IComicBookLibraryProps): ReactElement => {
</p> </p>
</div> </div>
{/* first and last page controls */}
<div className="field has-addons"> <div className="field has-addons">
<p className="control"> <p className="control">
<button <button
@@ -357,6 +361,8 @@ export const Library = ({}: IComicBookLibraryProps): ReactElement => {
</button> </button>
</p> </p>
</div> </div>
{/* page selector */}
<span> <span>
Go to page: Go to page:
<input <input
@@ -371,6 +377,7 @@ export const Library = ({}: IComicBookLibraryProps): ReactElement => {
/> />
</span> </span>
{/* page size selector */}
<div <div
className={ className={
"dropdown " + (isPageSizeDropdownCollapsed ? "is-active" : "") "dropdown " + (isPageSizeDropdownCollapsed ? "is-active" : "")