Skip to content

Commit 384da55

Browse files
committed
Added descriptions to tags
1 parent c440556 commit 384da55

File tree

6 files changed

+273
-191
lines changed

6 files changed

+273
-191
lines changed

src/common/components/TextInput/TagList/TagList.tsx

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import type {
55
} from "@tiptap/suggestion";
66
import { forwardRef, useEffect, useImperativeHandle, useState } from "react";
77
import { Tag } from "../../Tag/Tag";
8+
import type { PlainTag } from "../../../../interfaces/Tag";
89

910
export const NEW_TAG_PREFIX = 'New tag "';
1011
export const getNewTagPhrase = (tag: string) =>
1112
`${NEW_TAG_PREFIX}${tag.toLowerCase()}"`;
1213

1314
export let isUserSelectingTag = false;
1415

15-
type Props = SuggestionProps<{ name: string; hue: number }, MentionNodeAttrs>;
16+
type Props = SuggestionProps<PlainTag, MentionNodeAttrs>;
1617

1718
export type TagListRef = {
1819
onKeyDown: (data: SuggestionKeyDownProps) => boolean;
@@ -49,12 +50,25 @@ export const TagList = forwardRef<TagListRef, Props>((props, ref) => {
4950
}
5051
};
5152

53+
const scrollIntoView = (index: number) => {
54+
const itemElement = document.querySelector(
55+
`[data-selector=tags-dropdown]>:nth-child(${index + 1})`,
56+
);
57+
itemElement?.scrollIntoView({
58+
block: "nearest",
59+
});
60+
};
61+
5262
const upHandler = () => {
53-
setSelectedIndex((selectedIndex + items.length - 1) % items.length);
63+
const nextIndex = (selectedIndex + items.length - 1) % items.length;
64+
setSelectedIndex(nextIndex);
65+
scrollIntoView(nextIndex);
5466
};
5567

5668
const downHandler = () => {
57-
setSelectedIndex((selectedIndex + 1) % items.length);
69+
const nextIndex = (selectedIndex + 1) % items.length;
70+
setSelectedIndex(nextIndex);
71+
scrollIntoView(nextIndex);
5872
};
5973

6074
const enterHandler = () => {
@@ -93,12 +107,15 @@ export const TagList = forwardRef<TagListRef, Props>((props, ref) => {
93107
}));
94108

95109
return (
96-
<div className="bg-white border border-stone-400 rounded-md shadow flex flex-col gap-1 scroll-auto px-3 py-2 relative">
110+
<div
111+
data-selector="tags-dropdown"
112+
className="bg-white border border-stone-400 rounded-md shadow flex flex-col gap-1 scroll-auto px-3 py-2 relative overflow-y-auto max-h-64"
113+
>
97114
{items.length ? (
98115
items.map((item, index) => (
99116
<button
100117
type="button"
101-
className={`flex gap-1 text-left py-1 px-3 rounded-md ${index === selectedIndex ? "bg-stone-300" : "hover:bg-stone-200"}`}
118+
className={`flex flex-col gap-1 text-left py-1 px-3 rounded-md ${index === selectedIndex ? "bg-stone-300" : "hover:bg-stone-200"}`}
102119
key={item.name}
103120
title={item.name}
104121
onClick={() => selectItem(index)}
@@ -107,6 +124,13 @@ export const TagList = forwardRef<TagListRef, Props>((props, ref) => {
107124
name={item.name}
108125
hue={item.hue}
109126
/>
127+
<div
128+
className="text-sm text-stone-500 px-2 max-h-10 overflow-hidden text-clip"
129+
// biome-ignore lint/security/noDangerouslySetInnerHtml: it's html entered by the user in the TextInput, they get what they deserve
130+
dangerouslySetInnerHTML={{
131+
__html: item.description ?? "",
132+
}}
133+
/>
110134
</button>
111135
))
112136
) : (

0 commit comments

Comments
 (0)