@@ -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}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user