diff --git a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx index 6509c251c..dab543b99 100644 --- a/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx +++ b/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx @@ -18,6 +18,7 @@ import { timeAgo, TitleStyle, } from './LibraryCardStyles' +import { sortedLabels } from '../../../lib/labelsSort' dayjs.extend(relativeTime) @@ -178,11 +179,11 @@ export function LibraryGridCard(props: LinkedItemCardProps): JSX.Element { minHeight: '35px', }} > - {props.item.labels - ?.sort((a, b) => a.name.localeCompare(b.name)) - .map(({ name, color }, index) => ( + {sortedLabels(props.item.labels).map( + ({ name, color }, index) => ( - ))} + ) + )} - {props.item.labels - ?.sort((a, b) => a.name.localeCompare(b.name)) - .map(({ name, color }, index) => ( + {sortedLabels(props.item.labels).map( + ({ name, color }, index) => ( - ))} + ) + )} diff --git a/packages/web/lib/labelsSort.ts b/packages/web/lib/labelsSort.ts new file mode 100644 index 000000000..189852e9e --- /dev/null +++ b/packages/web/lib/labelsSort.ts @@ -0,0 +1,36 @@ +import { Label } from './networking/fragments/labelFragment' + +export const sortedLabels = (labels: Label[] | undefined): Label[] => { + if (!labels) { + return [] + } + + const colors = new Map() + for (const label of labels) { + let list = colors.get(label.color) ?? [] + list.push(label) + colors.set( + label.color, + list.sort((a, b) => a.name.localeCompare(b.name)) + ) + } + + const sortedColors = Array.from(colors.keys()).sort((a, b) => { + // Sort by the first element's name + const aname = colors.get(a)?.find(() => true)?.name ?? a + const bname = colors.get(b)?.find(() => true)?.name ?? b + return aname.localeCompare(bname) + }) + + const result: Label[] = [] + for (const key of sortedColors) { + const items = colors.get(key) + if (!items) { + continue + } + const sorted = items.sort((a, b) => a.name.localeCompare(b.name)) + result.push(...sorted) + } + + return result +}