+
{t(($) => $['skillManagement.detail.publishReferencesTitle'])}
-
+
{t(($) => $['skillManagement.detail.publishReferencesDescription'], {
count: referenceCount,
})}
diff --git a/web/features/skills/detail/skill-publish-confirm-panel.stories.tsx b/web/features/skills/detail/skill-publish-confirm-panel.stories.tsx
index 75d03c8672a..90d565e28de 100644
--- a/web/features/skills/detail/skill-publish-confirm-panel.stories.tsx
+++ b/web/features/skills/detail/skill-publish-confirm-panel.stories.tsx
@@ -2,6 +2,7 @@ import type { SkillReferenceResponse } from '@dify/contracts/api/console/workspa
import type { Meta, StoryObj } from '@storybook/nextjs-vite'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { consoleQuery } from '@/service/client'
+import { SkillPublishBottomActions } from './publish-bar'
import { SkillPublishConfirmPanel } from './skill-metadata'
const scrollSkillId = 'publish-confirm-scroll-visual-test'
@@ -61,9 +62,9 @@ const meta = {
(Story) => (
),
diff --git a/web/features/skills/page.tsx b/web/features/skills/page.tsx
index 82101add23d..454450382d7 100644
--- a/web/features/skills/page.tsx
+++ b/web/features/skills/page.tsx
@@ -39,6 +39,7 @@ import { SkeletonRectangle } from '@/app/components/base/skeleton'
import { SkillCardTags } from '@/features/tag-management/components/skill-card-tags'
import { TagFilter } from '@/features/tag-management/components/tag-filter'
import useDocumentTitle from '@/hooks/use-document-title'
+import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now'
import useTimestamp from '@/hooks/use-timestamp'
import Link from '@/next/link'
import { useRouter } from '@/next/navigation'
@@ -68,14 +69,10 @@ function invalidateSkillListQueries(queryClient: QueryClient) {
})
}
-function SkillIcon({ icon }: { icon?: string }) {
+function SkillIcon() {
return (
-
- {icon ? (
-
{icon}
- ) : (
-
- )}
+
+
)
}
@@ -324,6 +321,7 @@ function SkillCard({
const { t } = useTranslation('skill')
const { t: tCommon } = useTranslation('common')
const { formatTime } = useTimestamp()
+ const { formatTimeFromNow } = useFormatTimeFromNow()
const queryClient = useQueryClient()
const [isDeleteOpen, setIsDeleteOpen] = useState(false)
const duplicateMutation = useMutation(
@@ -343,6 +341,9 @@ function SkillCard({
skill.updated_at,
t(($) => $['skillManagement.dateTimeFormat']),
)
+ const publishedAt = skill.latest_published_at
+ ? formatTimeFromNow(skill.latest_published_at)
+ : undefined
const handleDuplicate = () => {
if (duplicateMutation.isPending) return
@@ -379,7 +380,7 @@ function SkillCard({
className="block min-w-0 shrink-0 cursor-pointer outline-hidden"
>
-
+
{skill.display_name}
@@ -412,7 +413,7 @@ function SkillCard({
{isDraft
? t(($) => $['skillManagement.editedAt'], { time: updatedAt })
- : t(($) => $['skillManagement.publishedAt'], { time: updatedAt })}
+ : t(($) => $['skillManagement.publishedAt'], { time: publishedAt })}