From ec7a9797cb46577b462412e92024e083ae7d3de8 Mon Sep 17 00:00:00 2001 From: balibabu Date: Fri, 31 Jul 2026 16:28:55 +0800 Subject: [PATCH] Fix: The wiki's claim card does not display the title. (#17626) --- .../components/add-field-modal.tsx | 2 +- .../create-next/components/field-card.tsx | 34 ++++++++--- .../components/section-field-grid.tsx | 14 +++-- .../components/template-configuration.tsx | 2 +- .../components/template-sidebar.tsx | 6 +- .../create-next/constant.ts | 60 +++++++++++++++++++ .../use-compilation-template-group-form.ts | 7 +-- .../create-next/utils.ts | 55 ++--------------- .../edit-next/components/add-field-modal.tsx | 2 +- .../edit-next/components/field-card.tsx | 34 ++++++++--- .../components/section-field-grid.tsx | 14 +++-- .../components/template-configuration.tsx | 2 +- .../edit-next/constant.ts | 60 +++++++++++++++++++ .../use-compilation-template-group-form.ts | 3 +- .../compilation-templates/edit-next/utils.ts | 55 ++--------------- 15 files changed, 210 insertions(+), 140 deletions(-) create mode 100644 web/src/pages/user-setting/compilation-templates/create-next/constant.ts create mode 100644 web/src/pages/user-setting/compilation-templates/edit-next/constant.ts diff --git a/web/src/pages/user-setting/compilation-templates/create-next/components/add-field-modal.tsx b/web/src/pages/user-setting/compilation-templates/create-next/components/add-field-modal.tsx index 25e1b3f49c..79b6158924 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/components/add-field-modal.tsx +++ b/web/src/pages/user-setting/compilation-templates/create-next/components/add-field-modal.tsx @@ -9,7 +9,7 @@ import { startCase } from 'lodash'; import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { FieldLabelKeyMap } from '@/pages/user-setting/compilation-templates/create-next/utils'; +import { FieldLabelKeyMap } from '@/pages/user-setting/compilation-templates/create-next/constant'; import { useAddFieldForm } from '../hooks/use-add-field-form'; diff --git a/web/src/pages/user-setting/compilation-templates/create-next/components/field-card.tsx b/web/src/pages/user-setting/compilation-templates/create-next/components/field-card.tsx index d0762d3a51..2b26744cd1 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/components/field-card.tsx +++ b/web/src/pages/user-setting/compilation-templates/create-next/components/field-card.tsx @@ -1,22 +1,38 @@ import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Pencil, Trash2 } from 'lucide-react'; +import { useCallback } from 'react'; type FieldCardProps = { + index: number; title?: string; - field: Record; - onEdit: () => void; - onDelete: () => void; + description?: string; + onEdit: (index: number) => void; + onDelete: (index: number) => void; }; -export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { +export function FieldCard({ + index, + title, + description, + onEdit, + onDelete, +}: FieldCardProps) { + const handleEdit = useCallback(() => { + onEdit(index); + }, [onEdit, index]); + + const handleDelete = useCallback(() => { + onDelete(index); + }, [onDelete, index]); + return (
{title && ( - + {title} )} @@ -26,7 +42,7 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { type="button" variant="ghost" size="icon-xs" - onClick={onEdit} + onClick={handleEdit} className="text-text-secondary hover:text-text-primary" > @@ -35,7 +51,7 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { type="button" variant="ghost" size="icon-xs" - onClick={onDelete} + onClick={handleDelete} className="text-text-secondary hover:text-state-error" > @@ -43,9 +59,9 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) {
- {field.description && ( + {description && (

- {field.description} + {description}

)}
diff --git a/web/src/pages/user-setting/compilation-templates/create-next/components/section-field-grid.tsx b/web/src/pages/user-setting/compilation-templates/create-next/components/section-field-grid.tsx index 677be7f734..a63bf69580 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/components/section-field-grid.tsx +++ b/web/src/pages/user-setting/compilation-templates/create-next/components/section-field-grid.tsx @@ -4,6 +4,7 @@ import { Plus } from 'lucide-react'; import { useFieldArray, useFormContext, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; +import { SectionCardFieldMap } from '../constant'; import { FieldCard } from './field-card'; type SectionFieldGridProps = { @@ -26,7 +27,7 @@ export function SectionFieldGrid({ name: fieldsPath, }); - const isTypedSection = sectionName === 'entity' || sectionName === 'relation'; + const cardFields = SectionCardFieldMap[sectionName]; const currentFields = useWatch({ control: form.control, @@ -40,10 +41,13 @@ export function SectionFieldGrid({ return ( onEditField(index)} - onDelete={() => remove(index)} + index={index} + title={cardFields ? fieldValue[cardFields.title] : undefined} + description={ + cardFields ? fieldValue[cardFields.description] : undefined + } + onEdit={onEditField} + onDelete={remove} /> ); })} diff --git a/web/src/pages/user-setting/compilation-templates/create-next/components/template-configuration.tsx b/web/src/pages/user-setting/compilation-templates/create-next/components/template-configuration.tsx index 65a826160f..dd1e3bf42d 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/components/template-configuration.tsx +++ b/web/src/pages/user-setting/compilation-templates/create-next/components/template-configuration.tsx @@ -16,7 +16,7 @@ import { CompilationTemplateKind } from '@/constants/compilation'; import { TreeTemplateFields } from '@/pages/user-setting/compilation-templates/create-next/components/tree-template-fields'; import { useTemplateKindChange } from '@/pages/user-setting/compilation-templates/create-next/hooks/use-template-kind-change'; import { FormSchemaType } from '@/pages/user-setting/compilation-templates/create-next/schema'; -import { SectionTitleKeyMap } from '@/pages/user-setting/compilation-templates/create-next/utils'; +import { SectionTitleKeyMap } from '@/pages/user-setting/compilation-templates/create-next/constant'; import { useActiveSectionTab } from '../hooks/use-active-section-tab'; import { useAvailableKindOptions } from '../hooks/use-available-kind-options'; diff --git a/web/src/pages/user-setting/compilation-templates/create-next/components/template-sidebar.tsx b/web/src/pages/user-setting/compilation-templates/create-next/components/template-sidebar.tsx index c0c20f68a4..9b6c0b20b3 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/components/template-sidebar.tsx +++ b/web/src/pages/user-setting/compilation-templates/create-next/components/template-sidebar.tsx @@ -11,11 +11,9 @@ import { useTranslation } from 'react-i18next'; import { formatKindLabel } from '@/utils/compilation-template-util'; +import { DefaultTemplateValues } from '@/pages/user-setting/compilation-templates/create-next/constant'; import { FormSchemaType } from '@/pages/user-setting/compilation-templates/create-next/schema'; -import { - DefaultTemplateValues, - generateTemplateName, -} from '@/pages/user-setting/compilation-templates/create-next/utils'; +import { generateTemplateName } from '@/pages/user-setting/compilation-templates/create-next/utils'; import { useTemplateAddButton } from '../hooks/use-template-add-button'; diff --git a/web/src/pages/user-setting/compilation-templates/create-next/constant.ts b/web/src/pages/user-setting/compilation-templates/create-next/constant.ts new file mode 100644 index 0000000000..e7f7b0f45f --- /dev/null +++ b/web/src/pages/user-setting/compilation-templates/create-next/constant.ts @@ -0,0 +1,60 @@ +import { FormSchemaType, TemplateSchemaType } from './schema'; + +export const DefaultFieldKeys = ['type', 'description', 'rule']; + +export const FieldKeyOrders = [ + DefaultFieldKeys, + ['statement', 'subject'], + ['definition_excerpt', 'term'], +]; + +export const DefaultTemplateValues: TemplateSchemaType = { + id: undefined, + name: '', + description: '', + llm_id: '', + kind: '', + config: { + kind: '', + llm_id: '', + global_rules: '', + example: '', + instruction: '', + page_example: '', + use_blueprint: false, + rechunk: false, + rechunk_rules: '', + }, +}; + +export const DefaultValues: FormSchemaType = { + name: '', + description: '', + avatar: '', + templates: [DefaultTemplateValues], +}; + +export const SectionTitleKeyMap: Record = { + entity: 'setting.entitySpecification', + relation: 'setting.relationSpecification', + concept: 'setting.conceptSpecification', + claim: 'setting.claimSpecification', +}; + +export const SectionCardFieldMap: Record< + string, + { title: string; description: string } +> = { + entity: { title: 'type', description: 'description' }, + relation: { title: 'type', description: 'description' }, + claim: { title: 'statement', description: 'subject' }, + concept: { title: 'definition_excerpt', description: 'term' }, +}; + +export const SectionPriority = ['entity', 'relation']; + +export const FieldLabelKeyMap: Record = { + type: 'setting.fieldType', + description: 'setting.fieldDescription', + rule: 'setting.fieldRule', +}; diff --git a/web/src/pages/user-setting/compilation-templates/create-next/hooks/use-compilation-template-group-form.ts b/web/src/pages/user-setting/compilation-templates/create-next/hooks/use-compilation-template-group-form.ts index 8a7ccc7458..1f5c539654 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/hooks/use-compilation-template-group-form.ts +++ b/web/src/pages/user-setting/compilation-templates/create-next/hooks/use-compilation-template-group-form.ts @@ -6,11 +6,8 @@ import { useTranslation } from 'react-i18next'; import { ICompilationTemplateGroup } from '@/interfaces/database/compilation-template'; import { buildFormSchema, FormSchemaType } from '../schema'; -import { - DefaultValues, - generateTemplateName, - transformGroupDetailToForm, -} from '../utils'; +import { DefaultValues } from '../constant'; +import { generateTemplateName, transformGroupDetailToForm } from '../utils'; type UseCompilationTemplateGroupFormOptions = { detail?: ICompilationTemplateGroup; diff --git a/web/src/pages/user-setting/compilation-templates/create-next/utils.ts b/web/src/pages/user-setting/compilation-templates/create-next/utils.ts index d9cd24640e..71c886082f 100644 --- a/web/src/pages/user-setting/compilation-templates/create-next/utils.ts +++ b/web/src/pages/user-setting/compilation-templates/create-next/utils.ts @@ -13,8 +13,12 @@ import { ICompilationTemplateConfigRequest } from '@/interfaces/request/compilat import { CompilationTemplateKind } from '@/constants/compilation'; import { FormSchemaType, TemplateSchemaType } from './schema'; - -export const DefaultFieldKeys = ['type', 'description', 'rule']; +import { + DefaultFieldKeys, + DefaultTemplateValues, + FieldKeyOrders, + SectionPriority, +} from './constant'; export const splitExampleToBlueprintFields = ( example: string, @@ -30,12 +34,6 @@ export const splitExampleToBlueprintFields = ( }; }; -export const FieldKeyOrders = [ - DefaultFieldKeys, - ['statement', 'subject'], - ['definition_excerpt', 'term'], -]; - export const getFieldKeyOrder = (keys: string[]): string[] => { const sortedKeys = [...keys].sort(); return ( @@ -47,32 +45,6 @@ export const getFieldKeyOrder = (keys: string[]): string[] => { export const generateTemplateName = () => humanId({ separator: ' ', capitalize: true }); -export const DefaultTemplateValues: TemplateSchemaType = { - id: undefined, - name: '', - description: '', - llm_id: '', - kind: '', - config: { - kind: '', - llm_id: '', - global_rules: '', - example: '', - instruction: '', - page_example: '', - use_blueprint: false, - rechunk: false, - rechunk_rules: '', - }, -}; - -export const DefaultValues: FormSchemaType = { - name: '', - description: '', - avatar: '', - templates: [DefaultTemplateValues], -}; - export const isConfigMetaKey = (key: string) => [ 'kind', @@ -317,27 +289,12 @@ export const transformFormToPayload = (values: FormSchemaType) => { }; }; -export const SectionTitleKeyMap: Record = { - entity: 'setting.entitySpecification', - relation: 'setting.relationSpecification', - concept: 'setting.conceptSpecification', - claim: 'setting.claimSpecification', -}; - -export const SectionPriority = ['entity', 'relation']; - export const sortSectionNames = (names: string[]): string[] => { const priority = SectionPriority.filter((name) => names.includes(name)); const rest = names.filter((name) => !SectionPriority.includes(name)); return [...priority, ...rest]; }; -export const FieldLabelKeyMap: Record = { - type: 'setting.fieldType', - description: 'setting.fieldDescription', - rule: 'setting.fieldRule', -}; - export const getTypeOptionsFromBuiltinSection = ( builtinSection?: ICompilationTemplateSection, ) => { diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/components/add-field-modal.tsx b/web/src/pages/user-setting/compilation-templates/edit-next/components/add-field-modal.tsx index be301e51df..9e792fa057 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/components/add-field-modal.tsx +++ b/web/src/pages/user-setting/compilation-templates/edit-next/components/add-field-modal.tsx @@ -9,7 +9,7 @@ import { startCase } from 'lodash'; import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { FieldLabelKeyMap } from '../utils'; +import { FieldLabelKeyMap } from '../constant'; import { useAddFieldForm } from '../hooks/use-add-field-form'; diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/components/field-card.tsx b/web/src/pages/user-setting/compilation-templates/edit-next/components/field-card.tsx index d0762d3a51..2b26744cd1 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/components/field-card.tsx +++ b/web/src/pages/user-setting/compilation-templates/edit-next/components/field-card.tsx @@ -1,22 +1,38 @@ import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Pencil, Trash2 } from 'lucide-react'; +import { useCallback } from 'react'; type FieldCardProps = { + index: number; title?: string; - field: Record; - onEdit: () => void; - onDelete: () => void; + description?: string; + onEdit: (index: number) => void; + onDelete: (index: number) => void; }; -export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { +export function FieldCard({ + index, + title, + description, + onEdit, + onDelete, +}: FieldCardProps) { + const handleEdit = useCallback(() => { + onEdit(index); + }, [onEdit, index]); + + const handleDelete = useCallback(() => { + onDelete(index); + }, [onDelete, index]); + return (
{title && ( - + {title} )} @@ -26,7 +42,7 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { type="button" variant="ghost" size="icon-xs" - onClick={onEdit} + onClick={handleEdit} className="text-text-secondary hover:text-text-primary" > @@ -35,7 +51,7 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) { type="button" variant="ghost" size="icon-xs" - onClick={onDelete} + onClick={handleDelete} className="text-text-secondary hover:text-state-error" > @@ -43,9 +59,9 @@ export function FieldCard({ title, field, onEdit, onDelete }: FieldCardProps) {
- {field.description && ( + {description && (

- {field.description} + {description}

)}
diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/components/section-field-grid.tsx b/web/src/pages/user-setting/compilation-templates/edit-next/components/section-field-grid.tsx index 677be7f734..a63bf69580 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/components/section-field-grid.tsx +++ b/web/src/pages/user-setting/compilation-templates/edit-next/components/section-field-grid.tsx @@ -4,6 +4,7 @@ import { Plus } from 'lucide-react'; import { useFieldArray, useFormContext, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; +import { SectionCardFieldMap } from '../constant'; import { FieldCard } from './field-card'; type SectionFieldGridProps = { @@ -26,7 +27,7 @@ export function SectionFieldGrid({ name: fieldsPath, }); - const isTypedSection = sectionName === 'entity' || sectionName === 'relation'; + const cardFields = SectionCardFieldMap[sectionName]; const currentFields = useWatch({ control: form.control, @@ -40,10 +41,13 @@ export function SectionFieldGrid({ return ( onEditField(index)} - onDelete={() => remove(index)} + index={index} + title={cardFields ? fieldValue[cardFields.title] : undefined} + description={ + cardFields ? fieldValue[cardFields.description] : undefined + } + onEdit={onEditField} + onDelete={remove} /> ); })} diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/components/template-configuration.tsx b/web/src/pages/user-setting/compilation-templates/edit-next/components/template-configuration.tsx index 89a41ec0e8..8549116b9e 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/components/template-configuration.tsx +++ b/web/src/pages/user-setting/compilation-templates/edit-next/components/template-configuration.tsx @@ -15,7 +15,7 @@ import { CompilationTemplateKind } from '@/constants/compilation'; import { TreeTemplateFields } from './tree-template-fields'; import { useTemplateKindChange } from '../hooks/use-template-kind-change'; import { FormSchemaType } from '../schema'; -import { SectionTitleKeyMap } from '../utils'; +import { SectionTitleKeyMap } from '../constant'; import { useActiveSectionTab } from '../hooks/use-active-section-tab'; import { useAvailableKindOptions } from '../hooks/use-available-kind-options'; diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/constant.ts b/web/src/pages/user-setting/compilation-templates/edit-next/constant.ts new file mode 100644 index 0000000000..e7f7b0f45f --- /dev/null +++ b/web/src/pages/user-setting/compilation-templates/edit-next/constant.ts @@ -0,0 +1,60 @@ +import { FormSchemaType, TemplateSchemaType } from './schema'; + +export const DefaultFieldKeys = ['type', 'description', 'rule']; + +export const FieldKeyOrders = [ + DefaultFieldKeys, + ['statement', 'subject'], + ['definition_excerpt', 'term'], +]; + +export const DefaultTemplateValues: TemplateSchemaType = { + id: undefined, + name: '', + description: '', + llm_id: '', + kind: '', + config: { + kind: '', + llm_id: '', + global_rules: '', + example: '', + instruction: '', + page_example: '', + use_blueprint: false, + rechunk: false, + rechunk_rules: '', + }, +}; + +export const DefaultValues: FormSchemaType = { + name: '', + description: '', + avatar: '', + templates: [DefaultTemplateValues], +}; + +export const SectionTitleKeyMap: Record = { + entity: 'setting.entitySpecification', + relation: 'setting.relationSpecification', + concept: 'setting.conceptSpecification', + claim: 'setting.claimSpecification', +}; + +export const SectionCardFieldMap: Record< + string, + { title: string; description: string } +> = { + entity: { title: 'type', description: 'description' }, + relation: { title: 'type', description: 'description' }, + claim: { title: 'statement', description: 'subject' }, + concept: { title: 'definition_excerpt', description: 'term' }, +}; + +export const SectionPriority = ['entity', 'relation']; + +export const FieldLabelKeyMap: Record = { + type: 'setting.fieldType', + description: 'setting.fieldDescription', + rule: 'setting.fieldRule', +}; diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/hooks/use-compilation-template-group-form.ts b/web/src/pages/user-setting/compilation-templates/edit-next/hooks/use-compilation-template-group-form.ts index dd526c23b2..325ad76a98 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/hooks/use-compilation-template-group-form.ts +++ b/web/src/pages/user-setting/compilation-templates/edit-next/hooks/use-compilation-template-group-form.ts @@ -6,7 +6,8 @@ import { useTranslation } from 'react-i18next'; import { ICompilationTemplateGroup } from '@/interfaces/database/compilation-template'; import { buildFormSchema, FormSchemaType } from '../schema'; -import { DefaultValues, transformGroupDetailToForm } from '../utils'; +import { DefaultValues } from '../constant'; +import { transformGroupDetailToForm } from '../utils'; type UseCompilationTemplateGroupFormOptions = { detail?: ICompilationTemplateGroup; diff --git a/web/src/pages/user-setting/compilation-templates/edit-next/utils.ts b/web/src/pages/user-setting/compilation-templates/edit-next/utils.ts index f21a6d275e..ab005f3204 100644 --- a/web/src/pages/user-setting/compilation-templates/edit-next/utils.ts +++ b/web/src/pages/user-setting/compilation-templates/edit-next/utils.ts @@ -12,8 +12,12 @@ import { ICompilationTemplateConfigRequest } from '@/interfaces/request/compilat import { CompilationTemplateKind } from '@/constants/compilation'; import { FormSchemaType, TemplateSchemaType } from './schema'; - -export const DefaultFieldKeys = ['type', 'description', 'rule']; +import { + DefaultFieldKeys, + DefaultTemplateValues, + FieldKeyOrders, + SectionPriority, +} from './constant'; export const splitExampleToBlueprintFields = ( example: string, @@ -29,12 +33,6 @@ export const splitExampleToBlueprintFields = ( }; }; -export const FieldKeyOrders = [ - DefaultFieldKeys, - ['statement', 'subject'], - ['definition_excerpt', 'term'], -]; - export const getFieldKeyOrder = (keys: string[]): string[] => { const sortedKeys = [...keys].sort(); return ( @@ -43,32 +41,6 @@ export const getFieldKeyOrder = (keys: string[]): string[] => { ); }; -export const DefaultTemplateValues: TemplateSchemaType = { - id: undefined, - name: '', - description: '', - llm_id: '', - kind: '', - config: { - kind: '', - llm_id: '', - global_rules: '', - example: '', - instruction: '', - page_example: '', - use_blueprint: false, - rechunk: false, - rechunk_rules: '', - }, -}; - -export const DefaultValues: FormSchemaType = { - name: '', - description: '', - avatar: '', - templates: [DefaultTemplateValues], -}; - export const isConfigMetaKey = (key: string) => [ 'kind', @@ -314,27 +286,12 @@ export const transformFormToPayload = (values: FormSchemaType) => { }; }; -export const SectionTitleKeyMap: Record = { - entity: 'setting.entitySpecification', - relation: 'setting.relationSpecification', - concept: 'setting.conceptSpecification', - claim: 'setting.claimSpecification', -}; - -export const SectionPriority = ['entity', 'relation']; - export const sortSectionNames = (names: string[]): string[] => { const priority = SectionPriority.filter((name) => names.includes(name)); const rest = names.filter((name) => !SectionPriority.includes(name)); return [...priority, ...rest]; }; -export const FieldLabelKeyMap: Record = { - type: 'setting.fieldType', - description: 'setting.fieldDescription', - rule: 'setting.fieldRule', -}; - export const getTypeOptionsFromBuiltinSection = ( builtinSection?: ICompilationTemplateSection, ) => {