diff --git a/src/components/templates/TemplateWorkflowCard.spec.ts b/src/components/templates/TemplateWorkflowCard.spec.ts
deleted file mode 100644
index dc3266db8..000000000
--- a/src/components/templates/TemplateWorkflowCard.spec.ts
+++ /dev/null
@@ -1,263 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { describe, expect, it, vi } from 'vitest'
-import { ref } from 'vue'
-
-import TemplateWorkflowCard from '@/components/templates/TemplateWorkflowCard.vue'
-import { TemplateInfo } from '@/types/workflowTemplateTypes'
-
-vi.mock('@/components/templates/thumbnails/AudioThumbnail.vue', () => ({
- default: {
- name: 'AudioThumbnail',
- template: '
',
- props: ['src']
- }
-}))
-
-vi.mock('@/components/templates/thumbnails/CompareSliderThumbnail.vue', () => ({
- default: {
- name: 'CompareSliderThumbnail',
- template:
- '',
- props: ['baseImageSrc', 'overlayImageSrc', 'alt', 'isHovered']
- }
-}))
-
-vi.mock('@/components/templates/thumbnails/DefaultThumbnail.vue', () => ({
- default: {
- name: 'DefaultThumbnail',
- template: '',
- props: ['src', 'alt', 'isHovered', 'isVideo', 'hoverZoom']
- }
-}))
-
-vi.mock('@/components/templates/thumbnails/HoverDissolveThumbnail.vue', () => ({
- default: {
- name: 'HoverDissolveThumbnail',
- template:
- '',
- props: ['baseImageSrc', 'overlayImageSrc', 'alt', 'isHovered']
- }
-}))
-
-vi.mock('@vueuse/core', () => ({
- useElementHover: () => ref(false)
-}))
-
-vi.mock('@/scripts/api', () => ({
- api: {
- fileURL: (path: string) => `/fileURL${path}`,
- apiURL: (path: string) => `/apiURL${path}`,
- addEventListener: vi.fn(),
- removeEventListener: vi.fn()
- }
-}))
-
-vi.mock('@/scripts/app', () => ({
- app: {
- loadGraphData: vi.fn()
- }
-}))
-
-vi.mock('@/stores/dialogStore', () => ({
- useDialogStore: () => ({
- closeDialog: vi.fn()
- })
-}))
-
-vi.mock('@/stores/workflowTemplatesStore', () => ({
- useWorkflowTemplatesStore: () => ({
- isLoaded: true,
- loadWorkflowTemplates: vi.fn().mockResolvedValue(true),
- groupedTemplates: []
- })
-}))
-
-vi.mock('vue-i18n', () => ({
- useI18n: () => ({
- t: (key: string, fallback: string) => fallback || key
- })
-}))
-
-vi.mock('@/composables/useTemplateWorkflows', () => ({
- useTemplateWorkflows: () => ({
- getTemplateThumbnailUrl: (
- template: TemplateInfo,
- sourceModule: string,
- index = ''
- ) => {
- const basePath =
- sourceModule === 'default'
- ? `/fileURL/templates/${template.name}`
- : `/apiURL/workflow_templates/${sourceModule}/${template.name}`
- const indexSuffix = sourceModule === 'default' && index ? `-${index}` : ''
- return `${basePath}${indexSuffix}.${template.mediaSubtype}`
- },
- getTemplateTitle: (template: TemplateInfo, sourceModule: string) => {
- const fallback =
- template.title ?? template.name ?? `${sourceModule} Template`
- return sourceModule === 'default'
- ? template.localizedTitle ?? fallback
- : fallback
- },
- getTemplateDescription: (template: TemplateInfo, sourceModule: string) => {
- return sourceModule === 'default'
- ? template.localizedDescription ?? ''
- : template.description?.replace(/[-_]/g, ' ').trim() ?? ''
- },
- loadWorkflowTemplate: vi.fn()
- })
-}))
-
-describe('TemplateWorkflowCard', () => {
- const createTemplate = (overrides = {}): TemplateInfo => ({
- name: 'test-template',
- mediaType: 'image',
- mediaSubtype: 'png',
- thumbnailVariant: 'default',
- description: 'Test description',
- ...overrides
- })
-
- const mountCard = (props = {}) => {
- return mount(TemplateWorkflowCard, {
- props: {
- sourceModule: 'default',
- categoryTitle: 'Test Category',
- loading: false,
- template: createTemplate(),
- ...props
- },
- global: {
- stubs: {
- Card: {
- template:
- '
',
- props: ['dataTestid', 'pt']
- },
- ProgressSpinner: {
- template: ''
- }
- }
- }
- })
- }
-
- it('emits loadWorkflow event when clicked', async () => {
- const wrapper = mountCard({
- template: createTemplate({ name: 'test-workflow' })
- })
- await wrapper.find('.card').trigger('click')
- expect(wrapper.emitted('loadWorkflow')).toBeTruthy()
- expect(wrapper.emitted('loadWorkflow')?.[0]).toEqual(['test-workflow'])
- })
-
- it('shows loading spinner when loading is true', () => {
- const wrapper = mountCard({ loading: true })
- expect(wrapper.find('.progress-spinner').exists()).toBe(true)
- })
-
- it('renders audio thumbnail for audio media type', () => {
- const wrapper = mountCard({
- template: createTemplate({ mediaType: 'audio' })
- })
- expect(wrapper.find('.mock-audio-thumbnail').exists()).toBe(true)
- })
-
- it('renders compare slider thumbnail for compareSlider variant', () => {
- const wrapper = mountCard({
- template: createTemplate({ thumbnailVariant: 'compareSlider' })
- })
- expect(wrapper.find('.mock-compare-slider').exists()).toBe(true)
- })
-
- it('renders hover dissolve thumbnail for hoverDissolve variant', () => {
- const wrapper = mountCard({
- template: createTemplate({ thumbnailVariant: 'hoverDissolve' })
- })
- expect(wrapper.find('.mock-hover-dissolve').exists()).toBe(true)
- })
-
- it('renders default thumbnail by default', () => {
- const wrapper = mountCard()
- expect(wrapper.find('.mock-default-thumbnail').exists()).toBe(true)
- })
-
- it('passes correct props to default thumbnail for video', () => {
- const wrapper = mountCard({
- template: createTemplate({ mediaType: 'video' })
- })
- const thumbnail = wrapper.find('.mock-default-thumbnail')
- expect(thumbnail.exists()).toBe(true)
- })
-
- it('uses zoomHover scale when variant is zoomHover', () => {
- const wrapper = mountCard({
- template: createTemplate({ thumbnailVariant: 'zoomHover' })
- })
- expect(wrapper.find('.mock-default-thumbnail').exists()).toBe(true)
- })
-
- it('displays localized title for default source module', () => {
- const wrapper = mountCard({
- sourceModule: 'default',
- template: createTemplate({ localizedTitle: 'My Localized Title' })
- })
- expect(wrapper.text()).toContain('My Localized Title')
- })
-
- it('displays template name as title for non-default source modules', () => {
- const wrapper = mountCard({
- sourceModule: 'custom',
- template: createTemplate({ name: 'custom-template' })
- })
- expect(wrapper.text()).toContain('custom-template')
- })
-
- it('displays localized description for default source module', () => {
- const wrapper = mountCard({
- sourceModule: 'default',
- template: createTemplate({
- localizedDescription: 'My Localized Description'
- })
- })
- expect(wrapper.text()).toContain('My Localized Description')
- })
-
- it('processes description for non-default source modules', () => {
- const wrapper = mountCard({
- sourceModule: 'custom',
- template: createTemplate({ description: 'custom_module-description' })
- })
- expect(wrapper.text()).toContain('custom module description')
- })
-
- it('generates correct thumbnail URLs for default source module', () => {
- const wrapper = mountCard({
- sourceModule: 'default',
- template: createTemplate({
- name: 'my-template',
- mediaSubtype: 'jpg'
- })
- })
- const vm = wrapper.vm as any
- expect(vm.baseThumbnailSrc).toBe('/fileURL/templates/my-template-1.jpg')
- expect(vm.overlayThumbnailSrc).toBe('/fileURL/templates/my-template-2.jpg')
- })
-
- it('generates correct thumbnail URLs for custom source module', () => {
- const wrapper = mountCard({
- sourceModule: 'custom-module',
- template: createTemplate({
- name: 'my-template',
- mediaSubtype: 'png'
- })
- })
- const vm = wrapper.vm as any
- expect(vm.baseThumbnailSrc).toBe(
- '/apiURL/workflow_templates/custom-module/my-template.png'
- )
- expect(vm.overlayThumbnailSrc).toBe(
- '/apiURL/workflow_templates/custom-module/my-template.png'
- )
- })
-})
diff --git a/src/components/templates/TemplateWorkflowCard.vue b/src/components/templates/TemplateWorkflowCard.vue
deleted file mode 100644
index b674f7b95..000000000
--- a/src/components/templates/TemplateWorkflowCard.vue
+++ /dev/null
@@ -1,180 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ title }}
-
-
-
- {{ description }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/templates/TemplateWorkflowCardSkeleton.vue b/src/components/templates/TemplateWorkflowCardSkeleton.vue
deleted file mode 100644
index 856c6e5ea..000000000
--- a/src/components/templates/TemplateWorkflowCardSkeleton.vue
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/templates/TemplateWorkflowList.vue b/src/components/templates/TemplateWorkflowList.vue
deleted file mode 100644
index eb8df47a6..000000000
--- a/src/components/templates/TemplateWorkflowList.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
- {{ slotProps.data.title }}
-
-
-
-
-
- {{ slotProps.data.description }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/templates/TemplateWorkflowView.spec.ts b/src/components/templates/TemplateWorkflowView.spec.ts
deleted file mode 100644
index 6860797c6..000000000
--- a/src/components/templates/TemplateWorkflowView.spec.ts
+++ /dev/null
@@ -1,185 +0,0 @@
-import { mount } from '@vue/test-utils'
-import { describe, expect, it, vi } from 'vitest'
-import { createI18n } from 'vue-i18n'
-
-import TemplateWorkflowView from '@/components/templates/TemplateWorkflowView.vue'
-import { TemplateInfo } from '@/types/workflowTemplateTypes'
-
-vi.mock('primevue/dataview', () => ({
- default: {
- name: 'DataView',
- template: `
-
- `,
- props: ['value', 'layout', 'lazy', 'pt']
- }
-}))
-
-vi.mock('primevue/selectbutton', () => ({
- default: {
- name: 'SelectButton',
- template:
- '
',
- props: ['modelValue', 'options', 'allowEmpty']
- }
-}))
-
-vi.mock('@/components/templates/TemplateWorkflowCard.vue', () => ({
- default: {
- template: `
-
- `,
- props: ['sourceModule', 'categoryTitle', 'loading', 'template'],
- emits: ['loadWorkflow']
- }
-}))
-
-vi.mock('@/components/templates/TemplateWorkflowList.vue', () => ({
- default: {
- template: '',
- props: ['sourceModule', 'categoryTitle', 'loading', 'templates'],
- emits: ['loadWorkflow']
- }
-}))
-
-vi.mock('@/components/templates/TemplateSearchBar.vue', () => ({
- default: {
- template: '',
- props: ['searchQuery', 'filteredCount'],
- emits: ['update:searchQuery', 'clearFilters']
- }
-}))
-
-vi.mock('@/components/templates/TemplateWorkflowCardSkeleton.vue', () => ({
- default: {
- template: ''
- }
-}))
-
-vi.mock('@vueuse/core', () => ({
- useLocalStorage: () => 'grid'
-}))
-
-vi.mock('@/composables/useIntersectionObserver', () => ({
- useIntersectionObserver: vi.fn()
-}))
-
-vi.mock('@/composables/useLazyPagination', () => ({
- useLazyPagination: (items: any) => ({
- paginatedItems: items,
- isLoading: { value: false },
- hasMoreItems: { value: false },
- loadNextPage: vi.fn(),
- reset: vi.fn()
- })
-}))
-
-vi.mock('@/composables/useTemplateFiltering', () => ({
- useTemplateFiltering: (templates: any) => ({
- searchQuery: { value: '' },
- filteredTemplates: templates,
- filteredCount: { value: templates.value?.length || 0 }
- })
-}))
-
-describe('TemplateWorkflowView', () => {
- const createTemplate = (name: string): TemplateInfo => ({
- name,
- mediaType: 'image',
- mediaSubtype: 'png',
- thumbnailVariant: 'default',
- description: `Description for ${name}`
- })
-
- const mountView = (props = {}) => {
- const i18n = createI18n({
- legacy: false,
- locale: 'en',
- messages: {
- en: {
- templateWorkflows: {
- loadingMore: 'Loading more...'
- }
- }
- }
- })
-
- return mount(TemplateWorkflowView, {
- props: {
- title: 'Test Templates',
- sourceModule: 'default',
- categoryTitle: 'Test Category',
- templates: [
- createTemplate('template-1'),
- createTemplate('template-2'),
- createTemplate('template-3')
- ],
- loading: null,
- ...props
- },
- global: {
- plugins: [i18n]
- }
- })
- }
-
- it('renders template cards for each template', () => {
- const wrapper = mountView()
- const cards = wrapper.findAll('.mock-template-card')
-
- expect(cards.length).toBe(3)
- expect(cards[0].attributes('data-name')).toBe('template-1')
- expect(cards[1].attributes('data-name')).toBe('template-2')
- expect(cards[2].attributes('data-name')).toBe('template-3')
- })
-
- it('emits loadWorkflow event when clicked', async () => {
- const wrapper = mountView()
- const card = wrapper.find('.mock-template-card')
-
- await card.trigger('click')
-
- expect(wrapper.emitted()).toHaveProperty('loadWorkflow')
- // Check that the emitted event contains the template name
- const emitted = wrapper.emitted('loadWorkflow')
- expect(emitted).toBeTruthy()
- expect(emitted?.[0][0]).toBe('template-1')
- })
-
- it('passes correct props to template cards', () => {
- const wrapper = mountView({
- sourceModule: 'custom',
- categoryTitle: 'Custom Category'
- })
-
- const card = wrapper.find('.mock-template-card')
- expect(card.exists()).toBe(true)
- expect(card.attributes('data-source-module')).toBe('custom')
- expect(card.attributes('data-category-title')).toBe('Custom Category')
- })
-
- it('applies loading state correctly to cards', () => {
- const wrapper = mountView({
- loading: 'template-2'
- })
-
- const cards = wrapper.findAll('.mock-template-card')
-
- // Only the second card should have loading=true since loading="template-2"
- expect(cards[0].attributes('data-loading')).toBe('false')
- expect(cards[1].attributes('data-loading')).toBe('true')
- expect(cards[2].attributes('data-loading')).toBe('false')
- })
-})
diff --git a/src/components/templates/TemplateWorkflowView.vue b/src/components/templates/TemplateWorkflowView.vue
deleted file mode 100644
index f3db7f2ee..000000000
--- a/src/components/templates/TemplateWorkflowView.vue
+++ /dev/null
@@ -1,143 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ t('templateWorkflows.loadingMore') }}
-
-
-
-
-
-
-
-
diff --git a/src/components/templates/TemplateWorkflowsContent.vue b/src/components/templates/TemplateWorkflowsContent.vue
deleted file mode 100644
index 54bd0c986..000000000
--- a/src/components/templates/TemplateWorkflowsContent.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
diff --git a/src/components/templates/TemplateWorkflowsDialogHeader.vue b/src/components/templates/TemplateWorkflowsDialogHeader.vue
deleted file mode 100644
index 9313ab104..000000000
--- a/src/components/templates/TemplateWorkflowsDialogHeader.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
- {{ $t('templateWorkflows.title') }}
-
-
-
diff --git a/src/components/templates/TemplateWorkflowsSideNav.vue b/src/components/templates/TemplateWorkflowsSideNav.vue
deleted file mode 100644
index 6a3252b78..000000000
--- a/src/components/templates/TemplateWorkflowsSideNav.vue
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
- {{ slotProps.option.label }}
-
-
-
-
-
-
-
-