Started working on added task icons to the application.

This commit is contained in:
Colin Dawson 2026-03-13 23:11:37 +00:00
parent 7fd8440ca6
commit 2478d81ee4
2 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,105 @@
import React from "react";
import {
library,
type IconName,
type IconPrefix,
type IconProp,
} from "@fortawesome/fontawesome-svg-core";
import { fas } from "@fortawesome/free-solid-svg-icons";
import { fad } from "@fortawesome/pro-duotone-svg-icons";
import { fal } from "@fortawesome/pro-light-svg-icons";
import { far } from "@fortawesome/pro-regular-svg-icons";
import { fat } from "@fortawesome/pro-thin-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
type FontAwesomeStringIconProps = {
icon?: string;
className?: string;
};
const iconPrefixByToken: Record<string, IconPrefix> = {
"fa-brands": "fab",
fab: "fab",
"fa-duotone": "fad",
fad: "fad",
"fa-light": "fal",
fal: "fal",
"fa-regular": "far",
far: "far",
"fa-solid": "fas",
fas: "fas",
"fa-thin": "fat",
fat: "fat",
};
let hasRegisteredIconPacks = false;
function ensureIconPacksRegistered(): void {
if (hasRegisteredIconPacks) {
return;
}
library.add(fas, far, fal, fat, fad);
hasRegisteredIconPacks = true;
}
function toKebabCase(value: string): string {
return value
.replace(/^fa/, "")
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
.replace(/_/g, "-")
.replace(/\s+/g, "-")
.replace(/^-+/, "")
.toLowerCase();
}
function parseIcon(icon?: string): IconProp | undefined {
if (!icon) {
return undefined;
}
const tokens = icon.trim().split(/\s+/).filter(Boolean);
let prefix: IconPrefix = "fas";
let iconName = "";
tokens.forEach((token) => {
const mappedPrefix = iconPrefixByToken[token];
if (mappedPrefix) {
prefix = mappedPrefix;
return;
}
if (token.startsWith("fa-")) {
iconName = token.slice(3);
return;
}
if (!iconName) {
iconName = token;
}
});
if (!iconName) {
iconName = toKebabCase(icon);
} else if (!iconName.includes("-")) {
iconName = toKebabCase(iconName);
}
return iconName ? [prefix, iconName as IconName] : undefined;
}
const FontAwesomeStringIcon: React.FC<FontAwesomeStringIconProps> = ({
icon,
className,
}) => {
const resolvedIcon = React.useMemo(() => parseIcon(icon), [icon]);
if (!resolvedIcon) {
return null;
}
ensureIconPacksRegistered();
return <FontAwesomeIcon icon={resolvedIcon} className={className} />;
};
export default FontAwesomeStringIcon;

View File

@ -46,6 +46,7 @@ export interface CreateWorkflowTemplateVersion extends FormData {
export interface TaskMetadata {
taskType: string;
displayName: string;
icon: string;
capabilities: string[];
outcomeLabel: string;
outcomes: string[];