-
Notifications
You must be signed in to change notification settings - Fork 344
fix(metadata-view): fix filtering folders and files #4255
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughI pity the fool — this PR replaces a mimetype special-case with mapping via Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant C as Caller
participant MQB as MetadataQueryBuilder
participant MAP as mapFileTypes
participant QB as QueryConsumer
C->>MQB: getMimeTypeFilter(fieldKey, values, argIndexStart)
MQB->>MAP: mapFileTypes(values)
MAP-->>MQB: ['folder'] or ['pdf','doc',...] or ['file'] or []
MQB->>MQB: Partition -> folderPart?, extensionList[]
alt extensionList non-empty
MQB->>MQB: gen param keys -> :arg_field_ext_N...
MQB->>MQB: Clause A: item.extension IN (:args...)
end
alt folderPart present
MQB->>MQB: gen param key -> :arg_mime_folderType_X
MQB->>MQB: Clause B: item.type = :arg_mime_folderType_X
end
alt Both parts exist
MQB->>MQB: Combine -> (Clause A) OR (Clause B)
end
MQB-->>C: { queries, queryParams, keysGenerated }
C->>QB: apply queries & params
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20–30 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
405-510: Solid coverage on folderType OR logic—nice hustle! Add one more edge case, fool.
- Great tests for mixed values, indexing, and special chars.
- Add a case for folderType-only with a non-zero start index to lock indexing (e.g., start=5 ⇒ arg_mime_folderType_6).
Example:
test('should handle folderType only with non-zero start index', () => { const result = getMimeTypeFilter(['folderType'], 'mimetype', 5); expect(result).toEqual({ queryParams: { arg_mime_folderType_6: 'folder' }, queries: ['(item.type = :arg_mime_folderType_6)'], keysGenerated: 1, }); });
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP (Model Context Protocol) integration is disabled
- Jira integration is disabled
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (2)
src/elements/content-explorer/MetadataQueryBuilder.ts(2 hunks)src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
📚 Learning: 2025-08-25T16:19:22.007Z
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
Applied to files:
src/elements/content-explorer/MetadataQueryBuilder.tssrc/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts
🧬 Code graph analysis (1)
src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
getMimeTypeFilter(126-187)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: lint_test_build
- GitHub Check: Summary
🔇 Additional comments (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
118-121: Safe to drop the mimetype-filter mapping, fool! No callers invokegetSelectFilter('mimetype-filter')(verified via ripgrep); all mimetype filtering now lives inMetadataQueryAPIHelper.
8f6207b to
94c0708
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
136-141: Good cleanup — no noisy logs left, fool.Previous debug logging around these paths is gone. Keep it that way.
🧹 Nitpick comments (2)
src/elements/content-explorer/MetadataQueryBuilder.ts (2)
135-150: Solid folder detection; tighten symbols, fool.Logic’s correct and idempotent for repeated folderType. Consider avoiding magic strings.
- let hasFolder = false; + const FOLDER_TOKEN = 'folderType'; + const FOLDER_VALUE = 'folder'; + let hasFolder = false; @@ - if (value === 'folderType' && !hasFolder) { + if (value === FOLDER_TOKEN && !hasFolder) { @@ - queryParams[folderArgKey] = 'folder'; + queryParams[folderArgKey] = FOLDER_VALUE; queries.push(`(item.type = :${folderArgKey})`); hasFolder = true; - } else if (value !== 'folderType') { + } else if (value !== FOLDER_TOKEN) {
157-172: Deduplicate extensions before building IN list, sucka.Repeated types waste args and can bloat queries. Filter to unique extensions while preserving order.
- if (extensions.length > 0) { - const extensionQueryParams = Object.fromEntries( - extensions.map(extension => { + if (extensions.length > 0) { + const uniqueExtensions = Array.from(new Set(extensions)); + const extensionQueryParams = Object.fromEntries( + uniqueExtensions.map(extension => { currentArgIndex += 1; return [generateArgKey(fieldKey, currentArgIndex), extension]; }), );
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP (Model Context Protocol) integration is disabled
- Jira integration is disabled
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (2)
src/elements/content-explorer/MetadataQueryBuilder.ts(2 hunks)src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
📚 Learning: 2025-08-25T16:19:22.007Z
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
Applied to files:
src/elements/content-explorer/MetadataQueryBuilder.tssrc/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts
🧬 Code graph analysis (2)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
src/api/uploads/BaseUpload.js (1)
extension(178-178)
src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
getMimeTypeFilter(126-182)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: lint_test_build
- GitHub Check: Summary
🔇 Additional comments (3)
src/elements/content-explorer/MetadataQueryBuilder.ts (3)
174-176: LGTM on OR-wrapping.Parentheses and OR-composition are correct and produce a single clause when needed.
97-124: Drop the mimetype-filter guard in getSelectFilter — I pity the fool who adds dead code; the API helper already delegates 'mimetype-filter' to getMimeTypeFilter.Likely an incorrect or invalid review comment.
168-171: Ignore dot-prefix concern – extensions are consistently normalized without leading dots (FILE_EXT_REGEX in utils/file.js and ContentUploader logic), and MetadataQueryBuilder queriesitem.extensionwith dotless values. I pity the fool who doubts it.Likely an incorrect or invalid review comment.
94c0708 to
90e8ec6
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
99-126: Back-compat regression: honor ‘mimetype-filter’ in getSelectFilter, fool.Per previous learnings, calls passing 'mimetype-filter' must still work. Delegate to getMimeTypeFilter to avoid breaking callers.
Apply this diff:
export const getSelectFilter = (filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult => { + // Back-compat: delegate mimetype-filter to mime-specific handler + if (fieldKey === 'mimetype-filter') { + return getMimeTypeFilter(filterValue, fieldKey, argIndexStart); + } if (!Array.isArray(filterValue) || filterValue.length === 0) { return { queryParams: {}, queries: [], keysGenerated: 0, }; }
♻️ Duplicate comments (1)
src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
414-533: Add back-compat test for getSelectFilter('mimetype-filter'), fool.We asked for this before; it guards regressions when callers still use getSelectFilter.
Apply this diff:
@@ describe('getMimeTypeFilter', () => { @@ }); + + // Back-compat: ensure getSelectFilter delegates for 'mimetype-filter' + describe('getSelectFilter (mimetype-filter back-compat)', () => { + test('should delegate to getMimeTypeFilter and support folderType OR extension', () => { + const result = getSelectFilter(['folderType', 'pdfType'], 'mimetype-filter', 0); + expect(result).toEqual({ + queryParams: { + arg_mime_folderType_1: 'folder', + arg_mimetype_filter_2: 'pdf', + }, + queries: ['((item.type = :arg_mime_folderType_1) OR (item.extension IN (:arg_mimetype_filter_2)))'], + keysGenerated: 2, + }); + }); + });
🧹 Nitpick comments (4)
src/elements/content-explorer/constants.ts (4)
13-47: Broaden common types (optional) — don’t make users feel foolish.Consider covering widely used formats you’re currently missing.
export const NON_FOLDER_FILE_TYPES_MAP = new Map([ ['boxnoteType', ['boxnote']], ['boxcanvasType', ['boxcanvas']], ['pdfType', ['pdf']], ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']], ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']], ['presentationType', ['ppt', 'pptx', 'odp']], - ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']], - ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']], + ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff', 'webp', 'svg', 'heic', 'heif']], + ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma', 'aac', 'flac', 'opus', 'aiff', 'aif', 'oga']], [ 'videoType', [ 'mp4', 'mpeg', 'mpg', 'wmv', '3g2', '3gp', 'avi', 'm2v', 'm4v', 'mkv', 'mov', - 'ogg', + 'ogg', // container; keep if you must, but consider 'ogv' for video and 'oga' for audio + 'webm', 'mts', 'qt', 'ts', 'flv', 'rm', ], ], ['drawingType', ['dwg', 'dxf']], - ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']], + ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges', 'igs', 'step', 'stp']], ]);Optional: If extension matching is case-insensitive elsewhere, ensure normalization to lowercase before comparison; otherwise you’ll look like a fool when 'JPG' slips through.
13-47: Add explicit types and immutability — lock it down, chump.Make intent clear and prevent accidental mutation by typing these as read-only.
-export const NON_FOLDER_FILE_TYPES_MAP = new Map([ +export const NON_FOLDER_FILE_TYPES_MAP: ReadonlyMap<string, readonly string[]> = + new Map<string, readonly string[]>([ ['boxnoteType', ['boxnote']], ['boxcanvasType', ['boxcanvas']], ['pdfType', ['pdf']], ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']], ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']], ['presentationType', ['ppt', 'pptx', 'odp']], ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']], ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']], [ 'videoType', [ 'mp4', 'mpeg', 'mpg', 'wmv', '3g2', '3gp', 'avi', 'm2v', 'm2v', 'm4v', 'mkv', 'mov', 'ogg', 'mts', 'qt', 'ts', 'flv', 'rm', ], ], ['drawingType', ['dwg', 'dxf']], ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']], -]); + ] as const);
49-49: Don’t chain .set — build the map immutably and type it, fool.Clearer construction and read-only typing avoid accidental mutation.
-export const FILE_FOLDER_TYPES_MAP = new Map(NON_FOLDER_FILE_TYPES_MAP).set('folderType', ['folder']); +export const FILE_FOLDER_TYPES_MAP: ReadonlyMap<string, readonly string[]> = + new Map<string, readonly string[]>([ + ...NON_FOLDER_FILE_TYPES_MAP, + ['folderType', ['folder'] as const], + ]);
51-51: Type-safe keys export — give consumers a union, not guesses.Export keys as a readonly tuple and a union type. Don’t make your users parse maps like fools.
-export const NON_FOLDER_FILE_TYPES = Array.from(NON_FOLDER_FILE_TYPES_MAP.keys()); +export const NON_FOLDER_FILE_TYPES = [...NON_FOLDER_FILE_TYPES_MAP.keys()] as const; +export type NonFolderFileType = typeof NON_FOLDER_FILE_TYPES[number];If you need perfect literal inference, consider defining the mapping as a const object and deriving both the Map and the key union from it.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP (Model Context Protocol) integration is disabled
- Jira integration is disabled
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (6)
src/elements/content-explorer/ContentExplorer.tsx(1 hunks)src/elements/content-explorer/MetadataQueryBuilder.ts(3 hunks)src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts(1 hunks)src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts(3 hunks)src/elements/content-explorer/constants.ts(1 hunks)src/elements/content-explorer/utils.ts(2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
📚 Learning: 2025-08-25T16:19:22.007Z
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
Applied to files:
src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.tssrc/elements/content-explorer/utils.tssrc/elements/content-explorer/MetadataQueryBuilder.tssrc/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts
🧬 Code graph analysis (4)
src/elements/content-explorer/utils.ts (1)
src/elements/content-explorer/constants.ts (2)
NON_FOLDER_FILE_TYPES(51-51)FILE_FOLDER_TYPES_MAP(49-49)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
src/elements/content-explorer/utils.ts (1)
mapFileTypes(199-212)
src/elements/content-explorer/constants.ts (1)
src/utils/fields.js (1)
FOLDER_FIELDS_TO_FETCH(66-85)
src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
getMimeTypeFilter(128-194)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: lint_test_build
- GitHub Check: Summary
🔇 Additional comments (6)
src/elements/content-explorer/ContentExplorer.tsx (1)
37-37: Named import switch looks right, fool.Import matches the new named export; no runtime impact expected.
src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts (1)
676-690: Tests align with expanded mime-type mapping.Good expectation updates for mapped extensions and arg keys.
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
137-194: No callers pass ‘mimetype-filter’ into getSelectFilter—I pity the fool who thought otherwise!src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts (1)
298-316: LGTM on mapFileTypes-based expectations.Expanded IN list and arg indexing look consistent.
src/elements/content-explorer/constants.ts (2)
5-11: Named export safe—no default imports found
I pity the fool worrying ’bout breakage—ran a repo-wide search and found zero default imports of this module.
13-51: MIME type filter special-case mapping remains intact.
I pity the fool who breaks query semantics—getMimeTypeFilter still maps selected types to item.extension IN (…) for file extensions and uses item.type = 'folder' for folderType.
32802e3
90e8ec6 to
32802e3
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/elements/content-explorer/MetadataQueryBuilder.ts (2)
128-135: Hoist getMimeTypeFilter to allow delegation from getSelectFilter, fool.Switch to a function declaration so the earlier guard can call it without TDZ issues.
-export const getMimeTypeFilter = (filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult => { +export function getMimeTypeFilter(filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult {And close with
}instead of};at the end of the function.-}; +}
99-126: Addmimetype-filterdelegation ingetSelectFilter
I pity the fool who drops the legacy mapping—preserve it by inserting before the multi-select logic:export const getSelectFilter = (filterValue: string[], fieldKey: string, argIndexStart: number): QueryResult => { if (!Array.isArray(filterValue) || filterValue.length === 0) { return { queryParams: {}, queries: [], keysGenerated: 0, }; } + // Delegate legacy 'mimetype-filter' to the MIME-specific builder + if (fieldKey === 'mimetype-filter') { + return getMimeTypeFilter(filterValue, fieldKey, argIndexStart); + } let currentArgIndex = argIndexStart; …
♻️ Duplicate comments (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
137-167: Handle ‘file’ sentinel and de-dupe mapped values, or your query gonna be bogus.mapFileTypes can return 'file' and 'folder'. You only handle 'folder', leading to
item.extension IN ('file')nonsense. Also de-dupe to keep args tight.- // Use mapFileTypes to get the correct extensions and handle special cases - const mappedExtensions = mapFileTypes(filterValue as BoxItemSelection); - if (mappedExtensions.length === 0) { + // Use mapFileTypes to get the correct extensions/types and handle special cases + const mapped = Array.from(new Set(mapFileTypes(filterValue as BoxItemSelection))); + if (mapped.length === 0) { return { queryParams: {}, queries: [], keysGenerated: 0, }; } let currentArgIndex = argIndexStart; const queryParams: { [key: string]: number | Date | string } = {}; const queries: string[] = []; // Handle specific extensions and folder type const extensions: string[] = []; let hasFolder = false; + let hasFile = false; - for (const extension of mappedExtensions) { + for (const extension of mapped) { if (extension === 'folder') { if (!hasFolder) { currentArgIndex += 1; const folderArgKey = generateArgKey('mime_folderType', currentArgIndex); queryParams[folderArgKey] = 'folder'; queries.push(`(item.type = :${folderArgKey})`); hasFolder = true; } + } else if (extension === 'file') { + if (!hasFile) { + currentArgIndex += 1; + const fileArgKey = generateArgKey('mime_fileType', currentArgIndex); + queryParams[fileArgKey] = 'file'; + queries.push(`(item.type = :${fileArgKey})`); + hasFile = true; + } } else { extensions.push(extension); } }
🧹 Nitpick comments (2)
src/elements/content-explorer/MetadataQueryBuilder.ts (2)
1-1: Use a type-only import for BoxItemSelection, fool.Avoid pulling runtime code when you only need a type.
-import { BoxItemSelection } from '@box/box-item-type-selector'; +import type { BoxItemSelection } from '@box/box-item-type-selector';
120-123: Field key safety: ensure only trusted keys hit HASANY, sucka.Using raw fieldKey in the query is fine for internal constants, but don’t feed user input here. If any dynamic mapping exists upstream, validate against an allowlist.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP (Model Context Protocol) integration is disabled
- Jira integration is disabled
- Linear integration is disabled
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (6)
src/elements/content-explorer/ContentExplorer.tsx(1 hunks)src/elements/content-explorer/MetadataQueryBuilder.ts(3 hunks)src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts(1 hunks)src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts(3 hunks)src/elements/content-explorer/constants.ts(1 hunks)src/elements/content-explorer/utils.ts(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
- src/elements/content-explorer/ContentExplorer.tsx
- src/elements/content-explorer/constants.ts
- src/elements/content-explorer/tests/MetadataQueryAPIHelper.test.ts
- src/elements/content-explorer/utils.ts
- src/elements/content-explorer/tests/MetadataQueryBuilder.test.ts
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-25T16:19:22.007Z
Learnt from: greg-in-a-box
PR: box/box-ui-elements#4235
File: src/elements/content-explorer/MetadataQueryBuilder.ts:103-110
Timestamp: 2025-08-25T16:19:22.007Z
Learning: In src/elements/content-explorer/MetadataQueryBuilder.ts, the getSelectFilter function has a special case that maps 'mimetype-filter' to 'item.extension' because mimetype-filter is a multi-select field but the actual database field is 'item.extension'. This mapping is necessary and should not be removed.
Applied to files:
src/elements/content-explorer/MetadataQueryBuilder.ts
🧬 Code graph analysis (1)
src/elements/content-explorer/MetadataQueryBuilder.ts (1)
src/elements/content-explorer/utils.ts (1)
mapFileTypes(199-212)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: lint_test_build
- GitHub Check: Summary
🔇 Additional comments (3)
src/elements/content-explorer/MetadataQueryBuilder.ts (3)
169-184: Batching IN clause looks solid.With deduped inputs from the previous fix, this is clean and efficient.
186-193: OR-combine is correct and parenthesized properly.This preserves precedence when mixing folder/file type checks with extension IN.
99-126: No direct getSelectFilter misuse found. I pity the fool who doubts—grep confirms all “mimetype-filter” keys go through getMimeTypeFilter in MetadataQueryAPIHelper, with no callers of getSelectFilter using it.
when selecting folders or files via the filter chip, they will be added to the query correctly now
Summary by CodeRabbit
New Features
Bug Fixes
Tests