diff --git a/pages/form-builder/index.vue b/pages/form-builder/index.vue index 6565a6e..cba8f0b 100644 --- a/pages/form-builder/index.vue +++ b/pages/form-builder/index.vue @@ -7,7 +7,7 @@
Get started by creating a new form or navigate back to manage your existing forms.
+ +Name | -Description | -Components | -Created | -Last Updated | -Actions | -|
---|---|---|---|---|---|---|
Name | +Description | +Category | +Group | +Created | +Last Updated | +Actions | +
+ | ||||||
@@ -118,16 +147,16 @@ Search: "{{ searchQuery }}"
-
+
+
|
-
- {{ form.description || 'No description' }}
-
- |
-
-
- {{ form.components ? form.components.length : 0 }} components
-
- |
-
- {{ formatDate(form.createdAt) }}
- |
+
+
+
+ No category
+ |
+
+
+
+ No group
+ |
+
+ {{ formatDate(form.createdAt) }}
+ |
{{ formatDate(form.updatedAt) }}
|
@@ -385,6 +434,8 @@ try {
// State
const searchQuery = ref('');
+const selectedCategory = ref('');
+const selectedGroup = ref('');
const loading = ref(false);
const showDeleteConfirm = ref(false);
const formToDelete = ref(null);
@@ -398,6 +449,27 @@ const jsonContent = ref('');
const jsonValidationMessage = ref('');
const jsonIsValid = ref(false);
+// Computed properties for grouping
+const categoryOptions = computed(() => {
+ const categories = [...new Set(formStore.savedForms.map(form => form.category).filter(Boolean))];
+ return [
+ { label: 'All Categories', value: '' },
+ ...categories.map(cat => ({ label: cat, value: cat }))
+ ];
+});
+
+const groupOptions = computed(() => {
+ const groups = [...new Set(formStore.savedForms.map(form => form.group).filter(Boolean))];
+ return [
+ { label: 'All Groups', value: '' },
+ ...groups.map(group => ({ label: group, value: group }))
+ ];
+});
+
+const hasActiveFilters = computed(() => {
+ return searchQuery.value || selectedCategory.value || selectedGroup.value;
+});
+
// Filtered forms
const filteredForms = computed(() => {
let filtered = formStore.savedForms;
@@ -412,6 +484,16 @@ const filteredForms = computed(() => {
);
}
+ // Filter by category
+ if (selectedCategory.value) {
+ filtered = filtered.filter(form => form.category === selectedCategory.value);
+ }
+
+ // Filter by group
+ if (selectedGroup.value) {
+ filtered = filtered.filter(form => form.group === selectedGroup.value);
+ }
+
return filtered;
});
@@ -552,8 +634,8 @@ onMounted(async () => {
await loadForms();
});
-// Watch for changes in search and reload forms
-watch([searchQuery], () => {
+// Watch for changes in search and filters
+watch([searchQuery, selectedCategory, selectedGroup], () => {
// Debounce the search to avoid too many API calls
clearTimeout(searchTimeout);
searchTimeout = setTimeout(() => {
@@ -566,9 +648,24 @@ let searchTimeout = null;
// Clear all filters
const clearFilters = () => {
searchQuery.value = '';
+ selectedCategory.value = '';
+ selectedGroup.value = '';
// loadForms will be called automatically by the watcher
};
+// Helper function to get category color
+const getCategoryColor = (category) => {
+ const colors = {
+ 'forms': 'primary',
+ 'surveys': 'success',
+ 'applications': 'info',
+ 'feedback': 'warning',
+ 'registration': 'danger',
+ 'default': 'secondary'
+ };
+ return colors[category?.toLowerCase()] || colors.default;
+};
+
// Clean up the search timeout on component unmount
onUnmounted(() => {
clearTimeout(searchTimeout);
@@ -835,4 +932,13 @@ button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
+
+/* Line clamp utility for description text */
+.line-clamp-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/pages/process-builder/index.vue b/pages/process-builder/index.vue
index 9f11333..ff65be0 100644
--- a/pages/process-builder/index.vue
+++ b/pages/process-builder/index.vue
@@ -3003,10 +3003,6 @@ const sendToBack = () => {