Skip to content

Advanced Search Filters ​

Overview ​

The Advanced Search Filters system provides a comprehensive filtering interface with multiple criteria including file types, tags, custom fields, dates, users, and more. It supports filter presets, combinations, and integration with Typesense search.

Filter Types ​

1. File Type Filter ​

  • Image, Video, Audio, Document, etc.
  • Multiple selection
  • Pagination support

2. Tag Filter ​

  • Tag selection
  • Tag search
  • Multiple tags

3. Custom Field Filter ​

  • Field-specific filters
  • Value selection
  • Type-based filtering

4. Collage Filter ​

  • Collage selection
  • Multiple collages

5. Uploaded By Filter ​

  • User selection
  • Multiple users

6. Date Range Filter ​

  • Created date
  • Modified date
  • Upload date

7. Orientation Filter ​

  • Horizontal
  • Vertical
  • Square

8. Permission Filter ​

  • Public
  • Private
  • Shared

Frontend Implementation ​

Filter Component ​

vue
<template>
  <v-card class="filter-panel">
    <v-card-title>Filters</v-card-title>
    <v-card-text>
      <!-- File Type Filter -->
      <v-select
        v-model="filters.fileTypes"
        :items="fileTypes"
        label="File Types"
        multiple
        chips
      />
      
      <!-- Tag Filter -->
      <v-autocomplete
        v-model="filters.tags"
        :items="availableTags"
        label="Tags"
        multiple
        chips
      />
      
      <!-- Date Range -->
      <v-date-picker
        v-model="filters.dateRange"
        range
      />
      
      <!-- Uploaded By -->
      <v-select
        v-model="filters.uploadedBy"
        :items="users"
        label="Uploaded By"
        multiple
      />
    </v-card-text>
  </v-card>
</template>

Filter Query Building ​

javascript
buildFilterQuery(filters) {
  const queries = []
  
  if (filters.fileTypes?.length > 0) {
    const typeFilter = filters.fileTypes
      .map(type => `file_type:=${type}`)
      .join(' || ')
    queries.push(`(${typeFilter})`)
  }
  
  if (filters.tags?.length > 0) {
    const tagFilter = filters.tags
      .map(tag => `tags:=[${tag}]`)
      .join(' && ')
    queries.push(`(${tagFilter})`)
  }
  
  if (filters.dateFrom) {
    const timestamp = Math.floor(new Date(filters.dateFrom).getTime() / 1000)
    queries.push(`modified_at:>=${timestamp}`)
  }
  
  return queries.join(' && ')
}