Skip to content

feat: add advanced-search extension with EXIF filters and KQL support#313

Open
paul43210 wants to merge 4 commits intoowncloud:mainfrom
paul43210:feat/web-app-advanced-search-v2
Open

feat: add advanced-search extension with EXIF filters and KQL support#313
paul43210 wants to merge 4 commits intoowncloud:mainfrom
paul43210:feat/web-app-advanced-search-v2

Conversation

@paul43210
Copy link
Contributor

Summary

Re-submission of the advanced-search extension (originally PR #306) providing a powerful search interface with photo/EXIF metadata filtering capabilities.

Features

  • Advanced Filter Panel: Filter by file name, type, size, date modified, media type, tags, and full-text content
  • Photo/EXIF Metadata Filters: Search by camera make, camera model, date taken, ISO, aperture (f-number), and focal length
  • Visual Filter Chips: Active filters displayed as removable chips for easy management
  • KQL Query Builder: Direct KQL input with "Apply to Filters" to parse and populate filter fields
  • Multiple View Modes: List, grid, and table views for search results
  • Saved Searches: Save and load search queries for quick access
  • Search Statistics Panel: View index status, space information, and server details
  • Keyboard Accessibility: WCAG 2.1 AA compliance

Test Plan

  • Run unit tests: pnpm test:unit --filter advanced-search (123 tests)
  • Verify search filters work for standard fields (name, size, date, type)
  • Test EXIF filters (camera make/model, ISO, aperture, focal length)
  • Confirm KQL input parses correctly and populates filter fields
  • Test saved searches save/load functionality
  • Verify keyboard navigation meets accessibility standards

🤖 Generated with Claude Code

@mmattel
Copy link
Contributor

mmattel commented Jan 24, 2026

@paul43210 it seems that we have the same issue as before. CI did not run. You can see that on checks only show the licence check but no CI. We are working on that... Maybe I have to recreate the PR from my side because that worked as you have seen. We will first finalize and merge the photo PR and then do this one next. Sorry for the inconvenience.

@LukasHirt FYI

@CLAassistant
Copy link

CLAassistant commented Jan 25, 2026

CLA assistant check
All committers have signed the CLA.

@paul43210 paul43210 force-pushed the feat/web-app-advanced-search-v2 branch from ebc4e44 to 48a7e8f Compare January 27, 2026 02:34
@paul43210
Copy link
Contributor Author

Rebased onto current main with clean commit history. E2E tests are now properly separated - this PR only contains advanced-search extension files.

Changes:

  • 2 clean commits (feature + E2E tests)
  • 29 files (all in packages/web-app-advanced-search/ + shared config)
  • 124 unit tests passing
  • E2E test suite included

Ready for review once PR #312 (photo-addon) merges, to avoid conflicts with shared playwright.config.ts.

@paul43210 paul43210 force-pushed the feat/web-app-advanced-search-v2 branch from 48a7e8f to 55dc915 Compare January 27, 2026 02:48
@paul43210
Copy link
Contributor Author

Simplified PR - removed custom playwright.config.ts changes.

The E2E tests now use the existing generic browser projects which automatically discover tests in packages/*/tests/e2e/*.spec.ts. No config changes needed.

Shared files in this PR

  • .drone.star - adds advanced-search to APPS array

Merge order

Either PR (#312 or #313) can merge first. The only overlapping file is .drone.star - whichever merges second will have a trivial conflict (just keep both extension names in the APPS array).

No manual steps required between merges.

paul43210 and others added 2 commits January 28, 2026 09:44
Add a powerful advanced search interface with photo/EXIF metadata filtering:

Features:
- Advanced Filter Panel: Filter by file name, type, size, date modified,
  media type, tags, and full-text content
- Photo/EXIF Metadata Filters: Search by camera make, camera model,
  date taken, ISO, aperture (f-number), and focal length
- Visual Filter Chips: Active filters displayed as removable chips
- KQL Query Builder: Direct KQL input with "Apply to Filters" parsing
- Multiple View Modes: List, grid, and table views for search results
- Saved Searches: Save and load search queries for quick access
- Search Statistics Panel: View index status and server details
- Keyboard Accessibility: WCAG 2.1 AA compliance

Includes 123 unit tests covering KQL building and search functionality.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add Playwright E2E test suite for advanced-search:
- Search functionality and filter tests
- Filter panel and KQL input tests
- Saved searches management tests
- View modes and responsive behavior tests

Also includes:
- Test fixtures with authentication helpers
- Global setup for oCIS login
- BACKLOG.md for advanced-search roadmap

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@mmattel mmattel force-pushed the feat/web-app-advanced-search-v2 branch from 55dc915 to 4cebdd2 Compare January 28, 2026 08:44
@dj4oC dj4oC requested a review from LukasHirt January 29, 2026 14:21
@mmattel
Copy link
Contributor

mmattel commented Feb 2, 2026

Referencing: #319 (comment)

We still have some warnings/errors that need fixing, pls add a commit and I will port them to the referenced PR.

Linter + pnpm lint

web-extensions@ lint /drone/src
eslint '{packages,support}/**/.{js,ts,vue}' '.{ts,js}' --color

/drone/src/packages/web-advanced-search/src/components/SearchFilters.vue
398:10 error Unexpected side effect in computed function vue/no-side-effects-in-computed-properties

/drone/src/packages/web-advanced-search/src/components/SearchResults.vue
18:7 error Visible, non-interactive elements with click handlers must have at least one keyboard listener vuejs-accessibility/click-events-have-key-events
18:7 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions
45:7 error Visible, non-interactive elements with click handlers must have at least one keyboard listener vuejs-accessibility/click-events-have-key-events
45:7 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions

/drone/src/packages/web-advanced-search/src/composables/useAdvancedSearch.ts
574:3 warning Async function 'fetchCameraMakes' has no 'await' expression require-await
583:3 warning Async function 'fetchCameraModels' has no 'await' expression require-await

/drone/src/packages/web-advanced-search/src/views/AdvancedSearchView.vue
181:7 error The element ul has an implicit role of list. Defining this explicitly is redundant and should be avoided vuejs-accessibility/no-redundant-roles
182:9 error The element li has an implicit role of listitem. Defining this explicitly is redundant and should be avoided vuejs-accessibility/no-redundant-roles
202:5 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions
360:26 warning '_item' is defined but never used @typescript-eslint/no-unused-vars

/drone/src/packages/web-app-draw-io/src/App.vue
34:5 warning Prop "applicationConfig" should be optional vue/no-required-prop-with-default

✖ 12 problems (8 errors, 4 warnings)

 ELIFECYCLE  Command failed with exit code 1.

/drone/src/packages/web-advanced-search/src/components/SearchFilters.vue
398:10 error Unexpected side effect in computed function vue/no-side-effects-in-computed-properties

/drone/src/packages/web-advanced-search/src/components/SearchResults.vue
18:7 error Visible, non-interactive elements with click handlers must have at least one keyboard listener vuejs-accessibility/click-events-have-key-events
18:7 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions
45:7 error Visible, non-interactive elements with click handlers must have at least one keyboard listener vuejs-accessibility/click-events-have-key-events
45:7 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions

/drone/src/packages/web-advanced-search/src/composables/useAdvancedSearch.ts
574:3 warning Async function 'fetchCameraMakes' has no 'await' expression require-await
583:3 warning Async function 'fetchCameraModels' has no 'await' expression require-await

/drone/src/packages/web-advanced-search/src/views/AdvancedSearchView.vue
181:7 error The element ul has an implicit role of list. Defining this explicitly is redundant and should be avoided vuejs-accessibility/no-redundant-roles
182:9 error The element li has an implicit role of listitem. Defining this explicitly is redundant and should be avoided vuejs-accessibility/no-redundant-roles
202:5 error Visible, non-interactive elements should not have an interactive handler vuejs-accessibility/no-static-element-interactions
360:26 warning '_item' is defined but never used @typescript-eslint/no-unused-vars

/drone/src/packages/web-app-draw-io/src/App.vue
34:5 warning Prop "applicationConfig" should be optional vue/no-required-prop-with-default

✖ 12 problems (8 errors, 4 warnings)

 ELIFECYCLE  Command failed with exit code 1.

paul43210 and others added 2 commits February 5, 2026 19:32
- SearchFilters.vue: avoid side effect in computed by spreading array before sort
- SearchResults.vue: add role="button", tabindex, and keyboard handler to clickable items
- useAdvancedSearch.ts: remove async from functions without await, use Promise.resolve
- AdvancedSearchView.vue: remove redundant ARIA roles on ul/li, move dialog role to
  inner element, eslint-disable modal backdrop click, remove unused parameter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix vue/attributes-order warnings across all components and resolve
accessibility errors in the save dialog modal overlay.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants