mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 16:34:02 +01:00
Group details: Flippable images in expanded view. (#5367)
* flippable images in expanded view * adjust table title width * cleanup * eliminate bounce and other improvements * expand support to non full-width option
This commit is contained in:
parent
069a4b1f80
commit
7fb8f9172e
2 changed files with 83 additions and 4 deletions
|
|
@ -21,7 +21,7 @@ import {
|
||||||
GroupDetailsPanel,
|
GroupDetailsPanel,
|
||||||
} from "./GroupDetailsPanel";
|
} from "./GroupDetailsPanel";
|
||||||
import { GroupEditPanel } from "./GroupEditPanel";
|
import { GroupEditPanel } from "./GroupEditPanel";
|
||||||
import { faTrashAlt } from "@fortawesome/free-solid-svg-icons";
|
import { faRefresh, faTrashAlt } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { RatingSystem } from "src/components/Shared/Rating/RatingSystem";
|
import { RatingSystem } from "src/components/Shared/Rating/RatingSystem";
|
||||||
import { ConfigurationContext } from "src/hooks/Config";
|
import { ConfigurationContext } from "src/hooks/Config";
|
||||||
import { DetailImage } from "src/components/Shared/DetailImage";
|
import { DetailImage } from "src/components/Shared/DetailImage";
|
||||||
|
|
@ -39,8 +39,9 @@ import {
|
||||||
TabTitleCounter,
|
TabTitleCounter,
|
||||||
useTabKey,
|
useTabKey,
|
||||||
} from "src/components/Shared/DetailsPage/Tabs";
|
} from "src/components/Shared/DetailsPage/Tabs";
|
||||||
import { Tab, Tabs } from "react-bootstrap";
|
import { Button, Tab, Tabs } from "react-bootstrap";
|
||||||
import { GroupSubGroupsPanel } from "./GroupSubGroupsPanel";
|
import { GroupSubGroupsPanel } from "./GroupSubGroupsPanel";
|
||||||
|
import { Icon } from "src/components/Shared/Icon";
|
||||||
|
|
||||||
const validTabs = ["default", "scenes", "subgroups"] as const;
|
const validTabs = ["default", "scenes", "subgroups"] as const;
|
||||||
type TabKey = (typeof validTabs)[number];
|
type TabKey = (typeof validTabs)[number];
|
||||||
|
|
@ -130,6 +131,8 @@ const GroupPage: React.FC<IProps> = ({ group, tabKey }) => {
|
||||||
const showAllDetails = uiConfig?.showAllDetails ?? true;
|
const showAllDetails = uiConfig?.showAllDetails ?? true;
|
||||||
const abbreviateCounter = uiConfig?.abbreviateCounters ?? false;
|
const abbreviateCounter = uiConfig?.abbreviateCounters ?? false;
|
||||||
|
|
||||||
|
const [focusedOnFront, setFocusedOnFront] = useState<boolean>(true);
|
||||||
|
|
||||||
const [collapsed, setCollapsed] = useState<boolean>(!showAllDetails);
|
const [collapsed, setCollapsed] = useState<boolean>(!showAllDetails);
|
||||||
const loadStickyHeader = useLoadStickyHeader();
|
const loadStickyHeader = useLoadStickyHeader();
|
||||||
|
|
||||||
|
|
@ -328,7 +331,13 @@ const GroupPage: React.FC<IProps> = ({ group, tabKey }) => {
|
||||||
<div className="group-images">
|
<div className="group-images">
|
||||||
{!!activeFrontImage && (
|
{!!activeFrontImage && (
|
||||||
<LightboxLink images={lightboxImages}>
|
<LightboxLink images={lightboxImages}>
|
||||||
<DetailImage alt="Front Cover" src={activeFrontImage} />
|
<DetailImage
|
||||||
|
className={`front-cover ${
|
||||||
|
focusedOnFront ? "active" : "inactive"
|
||||||
|
}`}
|
||||||
|
alt="Front Cover"
|
||||||
|
src={activeFrontImage}
|
||||||
|
/>
|
||||||
</LightboxLink>
|
</LightboxLink>
|
||||||
)}
|
)}
|
||||||
{!!activeBackImage && (
|
{!!activeBackImage && (
|
||||||
|
|
@ -336,9 +345,23 @@ const GroupPage: React.FC<IProps> = ({ group, tabKey }) => {
|
||||||
images={lightboxImages}
|
images={lightboxImages}
|
||||||
index={lightboxImages.length - 1}
|
index={lightboxImages.length - 1}
|
||||||
>
|
>
|
||||||
<DetailImage alt="Back Cover" src={activeBackImage} />
|
<DetailImage
|
||||||
|
className={`back-cover ${
|
||||||
|
!focusedOnFront ? "active" : "inactive"
|
||||||
|
}`}
|
||||||
|
alt="Back Cover"
|
||||||
|
src={activeBackImage}
|
||||||
|
/>
|
||||||
</LightboxLink>
|
</LightboxLink>
|
||||||
)}
|
)}
|
||||||
|
{!!(activeFrontImage && activeBackImage) && (
|
||||||
|
<Button
|
||||||
|
className="flip"
|
||||||
|
onClick={() => setFocusedOnFront(!focusedOnFront)}
|
||||||
|
>
|
||||||
|
<Icon icon={faRefresh} />
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</HeaderImage>
|
</HeaderImage>
|
||||||
<div className="row">
|
<div className="row">
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,62 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button.flip {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#group-page .detail-header:not(.collapsed) {
|
||||||
|
.group-images {
|
||||||
|
padding: 0.375rem 0.75rem;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
button.btn-link {
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
transition: all 0.3s;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:has(.active) {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:has(.inactive) {
|
||||||
|
opacity: 0.5;
|
||||||
|
padding: 0;
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
button.flip {
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 50%;
|
||||||
|
bottom: -5px;
|
||||||
|
display: flex;
|
||||||
|
font-size: 20px;
|
||||||
|
height: 40px;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
right: -5px;
|
||||||
|
width: 40px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.active {
|
||||||
|
max-width: 22rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.inactive {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-item .detail-item-title {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.groups-list {
|
.groups-list {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding-inline-start: 0;
|
padding-inline-start: 0;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue