fix(badges): use relative coloring for badges

fixes #286
This commit is contained in:
Bastian Ike
2023-01-19 10:22:18 +01:00
committed by Bastian
parent e4d9a6fb97
commit a48e0bb7db
8 changed files with 44 additions and 17 deletions

View File

@@ -1,25 +1,35 @@
import classNames from "classnames"; import classNames from "classnames";
import React, { MouseEventHandler } from "react"; import React, { MouseEventHandler } from "react";
import { ConfigData } from "../../config";
import "./badge.scss"; import "./badge.scss";
type BadgeProps = { type BadgeProps = {
onClick?: MouseEventHandler; onClick?: MouseEventHandler;
big?: boolean; big?: boolean;
type: "big" | "all" | "empty" | string; type: "big" | "all" | "empty" | string;
config: ConfigData;
};
const badgeClass = (type: string, config: ConfigData) => {
if (!config.rings.includes(type)) {
return type;
}
return ["first", "second", "third", "fourth"][config.rings.indexOf(type)];
}; };
export default function Badge({ export default function Badge({
onClick, onClick,
big, big,
type, type,
config,
children, children,
}: React.PropsWithChildren<BadgeProps>) { }: React.PropsWithChildren<BadgeProps>) {
const Comp = onClick ? "a" : "span"; const Comp = onClick ? "a" : "span";
return ( return (
<Comp <Comp
className={classNames("badge", `badge--${type}`, { className={classNames("badge", `badge--${badgeClass(type, config)}`, {
"badge--big": big === true, "badge--big": big === true,
})} })}
onClick={onClick} onClick={onClick}

View File

@@ -24,19 +24,19 @@
background: var(--color-gray-normal); background: var(--color-gray-normal);
border-color: var(--color-gray-normal); border-color: var(--color-gray-normal);
} }
&--adopt { &--first {
background: var(--color-green); background: var(--color-green);
border-color: var(--color-green); border-color: var(--color-green);
} }
&--trial { &--second {
background: var(--color-orange); background: var(--color-orange);
border-color: var(--color-orange); border-color: var(--color-orange);
} }
&--assess { &--third {
background: var(--color-blue); background: var(--color-blue);
border-color: var(--color-blue); border-color: var(--color-blue);
} }
&--hold { &--fourth {
background: var(--color-marine); background: var(--color-marine);
border-color: var(--color-marine); border-color: var(--color-marine);
} }

View File

@@ -1,18 +1,21 @@
import { ConfigData } from "../../config";
import { formatRelease } from "../../date"; import { formatRelease } from "../../date";
import { Revision } from "../../model"; import { Revision } from "../../model";
import Badge from "../Badge/Badge"; import Badge from "../Badge/Badge";
export default function ItemRevision({ export default function ItemRevision({
revision, revision,
config,
dateFormat, dateFormat,
}: { }: {
revision: Revision; revision: Revision;
config: ConfigData;
dateFormat?: string; dateFormat?: string;
}) { }) {
return ( return (
<div className="item-revision"> <div className="item-revision">
<div> <div>
<Badge type={revision.ring}> <Badge type={revision.ring} config={config}>
{revision.ring} | {formatRelease(revision.release, dateFormat)} {revision.ring} | {formatRelease(revision.release, dateFormat)}
</Badge> </Badge>
</div> </div>

View File

@@ -1,3 +1,4 @@
import { ConfigData } from "../../config";
import { useMessages } from "../../context/MessagesContext"; import { useMessages } from "../../context/MessagesContext";
import { Revision } from "../../model"; import { Revision } from "../../model";
import HeadlineGroup from "../HeadlineGroup/HeadlineGroup"; import HeadlineGroup from "../HeadlineGroup/HeadlineGroup";
@@ -6,9 +7,11 @@ import "./item-revisions.scss";
export default function ItemRevisions({ export default function ItemRevisions({
revisions, revisions,
config,
dateFormat, dateFormat,
}: { }: {
revisions: Revision[]; revisions: Revision[];
config: ConfigData;
dateFormat?: string; dateFormat?: string;
}) { }) {
const { revisionsText } = useMessages(); const { revisionsText } = useMessages();
@@ -25,6 +28,7 @@ export default function ItemRevisions({
key={revision.release} key={revision.release}
revision={revision} revision={revision}
dateFormat={dateFormat} dateFormat={dateFormat}
config={config}
/> />
))} ))}
</div> </div>

View File

@@ -81,7 +81,7 @@ const PageItem: React.FC<Props> = ({
> >
<div className="split"> <div className="split">
<div className="split__left"> <div className="split__left">
<Badge big type={item.ring}> <Badge big type={item.ring} config={config}>
{item.ring} {item.ring}
</Badge> </Badge>
</div> </div>
@@ -119,7 +119,7 @@ const PageItem: React.FC<Props> = ({
{editButton} {editButton}
</div> </div>
<div className="split__right"> <div className="split__right">
<Badge big type={item.ring}> <Badge big type={item.ring} config={config}>
{item.ring} {item.ring}
</Badge> </Badge>
</div> </div>
@@ -134,6 +134,7 @@ const PageItem: React.FC<Props> = ({
<ItemRevisions <ItemRevisions
revisions={item.revisions.slice(1)} revisions={item.revisions.slice(1)}
dateFormat={config.dateFormat} dateFormat={config.dateFormat}
config={config}
/> />
)} )}
</div> </div>

View File

@@ -65,7 +65,7 @@ export default function PageItemMobile({
{editButton} {editButton}
</div> </div>
<div className="split__right"> <div className="split__right">
<Badge big type={item.ring}> <Badge big type={item.ring} config={config}>
{item.ring} {item.ring}
</Badge> </Badge>
</div> </div>
@@ -77,7 +77,10 @@ export default function PageItemMobile({
/> />
<ItemTags tags={item.tags} /> <ItemTags tags={item.tags} />
{item.revisions.length > 1 && ( {item.revisions.length > 1 && (
<ItemRevisions revisions={item.revisions.slice(1)} /> <ItemRevisions
revisions={item.revisions.slice(1)}
config={config}
/>
)} )}
</div> </div>
</div> </div>

View File

@@ -101,6 +101,7 @@ export default function PageOverview({
big big
onClick={handleRingClick(ringName)} onClick={handleRingClick(ringName)}
type={isRingActive(ringName) ? ringName : "empty"} type={isRingActive(ringName) ? ringName : "empty"}
config={config}
> >
{ringName} {ringName}
</Badge> </Badge>
@@ -137,7 +138,9 @@ export default function PageOverview({
{translate(config, item.quadrant)} {translate(config, item.quadrant)}
</div> </div>
<div className="nav__item"> <div className="nav__item">
<Badge type={item.ring}>{item.ring}</Badge> <Badge type={item.ring} config={config}>
{item.ring}
</Badge>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -10,6 +10,7 @@ const renderList = (
ringName: string, ringName: string,
quadrantName: string, quadrantName: string,
groups: Group, groups: Group,
config: ConfigData,
big: boolean big: boolean
) => { ) => {
const itemsInRing = groups[quadrantName][ringName] || []; const itemsInRing = groups[quadrantName][ringName] || [];
@@ -17,7 +18,7 @@ const renderList = (
if (big) { if (big) {
return ( return (
<ItemList items={itemsInRing} noLeadingBorder> <ItemList items={itemsInRing} noLeadingBorder>
<Badge type={ringName} big={big}> <Badge type={ringName} big={big} config={config}>
{ringName} {ringName}
</Badge> </Badge>
</ItemList> </ItemList>
@@ -27,7 +28,9 @@ const renderList = (
return ( return (
<div className="ring-list"> <div className="ring-list">
<div className="ring-list__header"> <div className="ring-list__header">
<Badge type={ringName}>{ringName}</Badge> <Badge type={ringName} config={config}>
{ringName}
</Badge>
</div> </div>
{itemsInRing.map((item) => ( {itemsInRing.map((item) => (
<span key={item.name} className="ring-list__item"> <span key={item.name} className="ring-list__item">
@@ -45,11 +48,11 @@ const renderRing = (
ringName: string, ringName: string,
quadrantName: string, quadrantName: string,
groups: Group, groups: Group,
renderIfEmpty: boolean, config: ConfigData,
big: boolean big: boolean
) => { ) => {
if ( if (
!renderIfEmpty && !config.showEmptyRings &&
(!groups[quadrantName] || (!groups[quadrantName] ||
!groups[quadrantName][ringName] || !groups[quadrantName][ringName] ||
groups[quadrantName][ringName].length === 0) groups[quadrantName][ringName].length === 0)
@@ -58,7 +61,7 @@ const renderRing = (
} }
return ( return (
<div key={ringName} className="quadrant-section__ring"> <div key={ringName} className="quadrant-section__ring">
{renderList(ringName, quadrantName, groups, big)} {renderList(ringName, quadrantName, groups, config, big)}
</div> </div>
); );
}; };
@@ -93,7 +96,7 @@ export default function QuadrantSection({
</div> </div>
<div className="quadrant-section__rings"> <div className="quadrant-section__rings">
{config.rings.map((ringName: string) => {config.rings.map((ringName: string) =>
renderRing(ringName, quadrantName, groups, config.showEmptyRings, big) renderRing(ringName, quadrantName, groups, config, big)
)} )}
</div> </div>
</div> </div>