Appearance
SearchBar Typesense Component ​
File Information ​
- Path:
components/dam/SearchBarTypeSense.vue - Purpose: Main search bar component with Typesense integration for real-time search across assets, folders, and collages
Overview ​
The SearchBarTypeSense component provides a comprehensive search interface integrated with Typesense for high-performance full-text search. It supports real-time search suggestions, autocomplete, multi-collection searching, advanced filtering, and seamless navigation to search results. The component is used in the main header and provides the primary search functionality for the DAM system.
Key Features ​
Typesense Integration
- Real-time search with Typesense backend
- Multi-collection search (assets, folders, collages)
- Autocomplete suggestions
- Search result preview
Search Interface
- Search input with placeholder
- Loading indicators
- Result count display
- Keyboard shortcuts (Ctrl+K)
- Clear search functionality
Search Tabs
- Switch between result types (All, Assets, Folders, Collages)
- Tab-specific result counts
- Active tab indication
Advanced Filters
- Tag filters
- Custom field filters
- File type filters
- Date range filters
- Permission filters
Search Results Display
- Inline search results
- Result preview cards
- Quick actions on results
- Navigate to full results page
Props ​
javascript
{
workspaceId: {
type: String,
required: true,
description: 'Workspace ID for search scope'
},
placeholder: {
type: String,
default: 'Search for assets, collages, or folders',
description: 'Search input placeholder text'
},
autoFocus: {
type: Boolean,
default: false,
description: 'Auto-focus search input on mount'
},
debounce: {
type: Number,
default: 300,
description: 'Debounce delay for search input (ms)'
},
shortcutKey: {
type: String,
default: 'Ctrl+K',
description: 'Keyboard shortcut key combination'
}
}Events ​
javascript
{
'search': (query, filters) => {}, // Search executed
'suggestion-selected': (item) => {}, // Suggestion clicked
'filter-applied': (filters) => {}, // Filters applied
'tab-changed': (tab) => {}, // Tab switched
'clear': () => {}, // Search cleared
'close': () => {} // Search menu closed
}Data Properties ​
javascript
{
searchParams: {
search_term: string, // Search query
filters: object, // Applied filters
tab: string // Active tab
},
loading: boolean, // Search in progress
searchResult: object, // Search results
openSearchList: boolean, // Search results visible
isShowResultsCount: boolean, // Show result count
isFocused: boolean, // Input focused state
tab: number, // Active tab index
tabLabels: array, // Tab labels ['All', 'Assets', 'Folders', 'Collages']
advancedSearchAllowed: boolean, // Advanced search permission
activeFilters: array, // Active filter list
searchClass: string // Dynamic CSS class
}Mixins Used ​
search-common-functions- Search utilities (~/mixins/search-common-functions)
Computed Properties ​
advancedSearchAllowed- Permission check for advanced searchgetResultsCount- Total results count across all tabshasFilters- Whether any filters are appliedactiveFilters- List of active filters for display
Methods ​
computeSearch(trigger) ​
Executes search:
trigger: 'click', 'enter', or 'auto'- Builds search query
- Calls Typesense API
- Updates search results
- Navigates to search page or shows inline results
- Emits
searchevent
debouncedSearch() ​
Debounced search function:
- Delays search execution
- Prevents excessive API calls
- Updates search query
- Shows suggestions while typing
commonSearch(query, filters) ​
Performs common search:
- Builds Typesense query
- Applies filters
- Calls multi-search API
- Formats results
- Updates UI state
getSuggestions(query) ​
Gets search suggestions:
- Calls Typesense autocomplete
- Returns matching suggestions
- Formats suggestion data
- Updates suggestion list
handleSuggestionSelect(suggestion) ​
Handles suggestion selection:
- Sets search query
- Executes search
- Navigates to result
- Closes suggestion list
applyFilters(filters) ​
Applies search filters:
- Updates filter state
- Rebuilds search query
- Executes filtered search
- Updates active filters display
- Emits
filter-appliedevent
removeFilter(filter) ​
Removes a filter:
- Removes from active filters
- Rebuilds search query
- Executes search
- Updates UI
changeTab(tabIndex) ​
Changes active tab:
- Updates
tabstate - Filters results by type
- Updates result display
- Emits
tab-changedevent
closeSearchMenu(force) ​
Closes search menu:
- Hides search results
- Resets search state
- Clears search input if
forceis true - Emits
closeevent
closeSearch() ​
Closes search:
- Clears search input
- Closes search menu
- Resets state
API Integration ​
Typesense Multi-Search ​
- Endpoint:
POST /api/typesense/search - Request Body:json
{ "request": { "q": "search query", "collections": ["digital_assets", "digital_assets_categories", "dam_collections"] }, "filterQuery": { "digital_assets": "file_type:=jpg && tags:=[marketing]", "digital_assets_categories": "visibility:=0", "dam_collections": "visibility:=0" }, "commonSearchParams": { "query_by": "search_name,description", "per_page": 20, "page": 1, "sort_by": "modified_at:desc" }, "workspace_id": "workspace-id" } - Response: Multi-collection search results
Typesense Autocomplete ​
- Endpoint:
POST /api/typesense/autocomplete - Request: Query string and collection
- Response: Array of suggestions
Search Flow ​
User Input
- User types in search input
- Debounced search triggers
- Suggestions shown (if enabled)
Search Execution
- User presses Enter or clicks search
- Query built with filters
- Typesense API called
Results Display
- Results received and formatted
- Displayed in active tab
- Result counts updated
Navigation
- Click result to view details
- Or navigate to full search page
- Search state preserved
Keyboard Shortcuts ​
- Ctrl+K (or Cmd+K): Focus search input
- Enter: Execute search
- Esc: Close search menu
- Arrow Keys: Navigate suggestions (if enabled)
- Tab: Switch between tabs (if enabled)
Usage Examples ​
Basic Usage ​
vue
<template>
<SearchBarTypeSense
:workspace-id="workspaceId"
@search="handleSearch"
/>
</template>
<script>
export default {
methods: {
handleSearch(query, filters) {
// Navigate to search page
this.$router.push({
path: `/${this.workspaceId}/dam/search`,
query: { q: query, ...filters }
})
}
}
}
</script>With Filters ​
vue
<template>
<SearchBarTypeSense
:workspace-id="workspaceId"
@filter-applied="handleFilters"
/>
</template>Styling ​
- Uses custom CSS classes:
headerMainSearch- Main containersearchInput- Input containersearchResult- Results containersearchTopFixed- Fixed top sectionsearchType- Tab sectionsearch-progress-bar- Loading indicator- Responsive design for mobile/tablet/desktop
Integration Points ​
- Typesense API: Search backend
- Search Common Functions Mixin: Filter building
- Search Page: Full search results
- Router: Navigation to search results
- Analytics: Search tracking
Notes for Development ​
- Component integrates with Typesense for real-time search
- Search is debounced to prevent excessive API calls
- Results can be displayed inline or navigate to full page
- Advanced filters require subscription permission
- Keyboard shortcuts enhance UX
- Component maintains search state during navigation
Related Documentation ​
- Search Feature - Complete search system
- Typesense Integration - Typesense backend
- Search Filter Component - Filter interface
- Search Tabs Component - Tab navigation
- Search Common Functions Mixin - Search utilities