From ce30ea3417a98fc05ed4c847dabb823f5fc3b88d Mon Sep 17 00:00:00 2001 From: Johnpaul Date: Wed, 20 Aug 2025 19:38:53 +0100 Subject: [PATCH] feat: enhance MultiSelect and SearchBox components with improved filtering and search functionality --- .../widget/WorkflowTemplateSelector.vue | 164 +++++++++++++----- src/components/input/MultiSelect.vue | 42 ++++- src/components/input/SearchBox.vue | 9 +- 3 files changed, 169 insertions(+), 46 deletions(-) diff --git a/src/components/custom/widget/WorkflowTemplateSelector.vue b/src/components/custom/widget/WorkflowTemplateSelector.vue index 0cfac0c50..5baa85964 100644 --- a/src/components/custom/widget/WorkflowTemplateSelector.vue +++ b/src/components/custom/widget/WorkflowTemplateSelector.vue @@ -34,17 +34,54 @@ - - -
- {{ - $t('templateWorkflows.activeFilters', 'Filters:') - }} - -
@@ -189,13 +207,19 @@ const navigationFilteredTemplates = computed(() => { const { searchQuery, selectedModels, + selectedUseCases, + selectedLicenses, sortBy, filteredTemplates, availableModels, + availableUseCases, + availableLicenses, filteredCount, totalCount, - resetFilters, - removeModelFilter + resetFilters + // removeModelFilter, + // removeUseCaseFilter, + // removeLicenseFilter } = useTemplateFiltering(navigationFilteredTemplates) // Convert between string array and object array for MultiSelect component @@ -208,13 +232,37 @@ const selectedModelObjects = computed({ } }) +const selectedUseCaseObjects = computed({ + get() { + return selectedUseCases.value.map((useCase) => ({ + name: useCase, + value: useCase + })) + }, + set(value: { name: string; value: string }[]) { + selectedUseCases.value = value.map((item) => item.value) + } +}) + +const selectedLicenseObjects = computed({ + get() { + return selectedLicenses.value.map((license) => ({ + name: license, + value: license + })) + }, + set(value: { name: string; value: string }[]) { + selectedLicenses.value = value.map((item) => item.value) + } +}) + // Loading state const isLoading = ref(true) // Navigation const selectedNavItem = ref('all') -// Model filter options +// Filter options const modelOptions = computed(() => availableModels.value.map((model) => ({ name: model, @@ -222,7 +270,21 @@ const modelOptions = computed(() => })) ) -// Model filter label +const useCaseOptions = computed(() => + availableUseCases.value.map((useCase) => ({ + name: useCase, + value: useCase + })) +) + +const licenseOptions = computed(() => + availableLicenses.value.map((license) => ({ + name: license, + value: license + })) +) + +// Filter labels const modelFilterLabel = computed(() => { if (selectedModelObjects.value.length === 0) { return t('templateWorkflows.modelFilter', 'Model Filter') @@ -235,17 +297,41 @@ const modelFilterLabel = computed(() => { } }) +const useCaseFilterLabel = computed(() => { + if (selectedUseCaseObjects.value.length === 0) { + return t('templateWorkflows.useCaseFilter', 'Use Case') + } else if (selectedUseCaseObjects.value.length === 1) { + return selectedUseCaseObjects.value[0].name + } else { + return t('templateWorkflows.useCasesSelected', { + count: selectedUseCaseObjects.value.length + }) + } +}) + +const licenseFilterLabel = computed(() => { + if (selectedLicenseObjects.value.length === 0) { + return t('templateWorkflows.licenseFilter', 'License') + } else if (selectedLicenseObjects.value.length === 1) { + return selectedLicenseObjects.value[0].name + } else { + return t('templateWorkflows.licensesSelected', { + count: selectedLicenseObjects.value.length + }) + } +}) + // Sort options const sortOptions = computed(() => [ - { - name: t('templateWorkflows.sort.recommended', 'Recommended'), - value: 'recommended' - }, { name: t('templateWorkflows.sort.alphabetical', 'A → Z'), value: 'alphabetical' }, - { name: t('templateWorkflows.sort.newest', 'Newest'), value: 'newest' } + { name: t('templateWorkflows.sort.newest', 'Newest'), value: 'newest' }, + { + name: t('templateWorkflows.sort.default', 'Default'), + value: 'default' + } ]) // Additional computed properties for TemplateWorkflowView diff --git a/src/components/input/MultiSelect.vue b/src/components/input/MultiSelect.vue index d1d02a4f1..9f31099f4 100644 --- a/src/components/input/MultiSelect.vue +++ b/src/components/input/MultiSelect.vue @@ -2,7 +2,7 @@
- {{ slotProps.option.name }} + {{ + slotProps.option.name + }} @@ -88,6 +90,7 @@ + \ No newline at end of file