From e58eab2e5b1e2768f5ca8ac45a91cb25d1eae0ca Mon Sep 17 00:00:00 2001 From: Bill Leoutsakos Date: Sun, 20 Sep 2026 16:38:06 -0700 Subject: [PATCH] improvement(ui): share knowledge tag rows --- .../document-tags-modal.tsx | 40 ++++---------- .../base-tags-modal/base-tags-modal.tsx | 43 +++++---------- .../components/knowledge-tag-row.tsx | 55 +++++++++++++++++++ 3 files changed, 82 insertions(+), 56 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-tags-modal/document-tags-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-tags-modal/document-tags-modal.tsx index 414c7c5511b..06912e37498 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-tags-modal/document-tags-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-tags-modal/document-tags-modal.tsx @@ -15,7 +15,6 @@ import { handleKeyboardActivation, Label, } from '@sim/emcn' -import { Trash } from '@sim/emcn/icons' import { createLogger } from '@sim/logger' import { formatDate } from '@sim/utils/formatting' import { @@ -27,6 +26,7 @@ import { } from '@/lib/knowledge/constants' import type { DocumentTag } from '@/lib/knowledge/tags/types' import type { DocumentData } from '@/lib/knowledge/types' +import { KnowledgeTagRow } from '@/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row' import { type TagDefinition, useKnowledgeBaseTagDefinitions, @@ -385,40 +385,24 @@ export function DocumentTagsModal({
{documentTags.map((tag, index) => (
-
startEditingTag(index)} onKeyDown={(event) => { if (event.target !== event.currentTarget) return handleKeyboardActivation(event, () => startEditingTag(index)) }} - > - - {tag.displayName} - - - {FIELD_TYPE_LABELS[tag.fieldType] || tag.fieldType} - -
- - {formatValueForDisplay(tag.value, tag.fieldType)} - -
- -
-
+ name={tag.displayName} + typeLabel={FIELD_TYPE_LABELS[tag.fieldType] || tag.fieldType} + detail={formatValueForDisplay(tag.value, tag.fieldType)} + truncateDetail + removeLabel='Remove tag' + onRemove={(e) => { + e.stopPropagation() + handleRemoveTag(index) + }} + /> {editingTagIndex === index && (
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx index 11fd1e18f6d..8278f269f57 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/base-tags-modal/base-tags-modal.tsx @@ -14,7 +14,6 @@ import { type ComboboxOption, handleKeyboardActivation, } from '@sim/emcn' -import { Trash } from '@sim/emcn/icons' import { createLogger } from '@sim/logger' import { getDocumentIcon } from '@/components/icons/document-icons' import type { TagUsageData } from '@/lib/api/contracts/knowledge' @@ -24,6 +23,7 @@ import { SUPPORTED_FIELD_TYPES, TAG_SLOT_CONFIG, } from '@/lib/knowledge/constants' +import { KnowledgeTagRow } from '@/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row' import { type TagDefinition, useKnowledgeBaseTagDefinitions, @@ -270,41 +270,28 @@ export function BaseTagsModal({ open, onOpenChange, knowledgeBaseId }: BaseTagsM {kbTagDefinitions.map((tag) => { const usage = getTagUsage(tag.tagSlot) return ( -
handleViewDocuments(tag)} onKeyDown={(event) => { if (event.target !== event.currentTarget) return handleKeyboardActivation(event, () => handleViewDocuments(tag)) }} - > - - {tag.displayName} - - - {FIELD_TYPE_LABELS[tag.fieldType] || tag.fieldType} - -
- - {usage.documentCount} document{usage.documentCount !== 1 ? 's' : ''} - -
- -
-
+ name={tag.displayName} + typeLabel={FIELD_TYPE_LABELS[tag.fieldType] || tag.fieldType} + detail={ + <> + {usage.documentCount} document{usage.documentCount !== 1 ? 's' : ''} + + } + removeLabel='Delete Tag' + onRemove={(e) => { + e.stopPropagation() + handleDeleteTagClick(tag) + }} + /> ) })} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row.tsx new file mode 100644 index 00000000000..c94e9f37940 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-tag-row.tsx @@ -0,0 +1,55 @@ +import type { HTMLAttributes, MouseEventHandler, ReactNode } from 'react' +import { Button, cn } from '@sim/emcn' +import { Trash } from '@sim/emcn/icons' + +interface KnowledgeTagRowProps + extends Omit, 'children' | 'className'> { + name: string + typeLabel: string + detail: ReactNode + truncateDetail?: boolean + removeLabel: string + onRemove: MouseEventHandler +} + +/** Shared tag summary; callers retain activation, keyboard and removal behavior. */ +export function KnowledgeTagRow({ + name, + typeLabel, + detail, + truncateDetail = false, + removeLabel, + onRemove, + ...props +}: KnowledgeTagRowProps) { + return ( +
+ {name} + + {typeLabel} + +
+ + {detail} + +
+ +
+
+ ) +}