From ad198ea0475be3519c2b172402f78078f9c02922 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 29 Nov 2025 19:55:22 -0800 Subject: [PATCH] remove animations and various smart playlist adjustments --- .../components/query-builder/index.tsx | 57 ++++++----------- .../query-builder/query-builder-option.tsx | 64 +++++++++++++------ .../components/playlist-query-builder.tsx | 7 +- 3 files changed, 72 insertions(+), 56 deletions(-) diff --git a/src/renderer/components/query-builder/index.tsx b/src/renderer/components/query-builder/index.tsx index d9c0a6ed7..8e822ab26 100644 --- a/src/renderer/components/query-builder/index.tsx +++ b/src/renderer/components/query-builder/index.tsx @@ -1,4 +1,3 @@ -import { AnimatePresence, motion } from 'motion/react'; import { useTranslation } from 'react-i18next'; import { QueryBuilderOption } from '/@/renderer/components/query-builder/query-builder-option'; @@ -187,41 +186,27 @@ export const QueryBuilder = ({ {level === 0 && saveActions} - - {data?.rules?.map((rule: QueryBuilderRule) => ( - - - - ))} - + {data?.rules?.map((rule: QueryBuilderRule) => ( +
+ +
+ ))} {data?.group && ( - + <> {data.group?.map((group: QueryBuilderGroup, index: number) => ( - +
- +
))} -
+ )} diff --git a/src/renderer/components/query-builder/query-builder-option.tsx b/src/renderer/components/query-builder/query-builder-option.tsx index 033f78031..af87de8a0 100644 --- a/src/renderer/components/query-builder/query-builder-option.tsx +++ b/src/renderer/components/query-builder/query-builder-option.tsx @@ -34,7 +34,15 @@ interface QueryOptionProps { selectData?: { label: string; value: string }[]; } -const QueryValueInput = ({ data, defaultValue, onChange, operator, type, ...props }: any) => { +const QueryValueInput = ({ + data, + defaultValue, + onChange, + operator, + type, + value: valueProp, + ...props +}: any) => { const [numberRange, setNumberRange] = useState([0, 0]); // Parse date value helper - converts date string (YYYY-MM-DD) to Date for display @@ -50,26 +58,45 @@ const QueryValueInput = ({ data, defaultValue, onChange, operator, type, ...prop return null; }; + const value = valueProp !== undefined ? valueProp : defaultValue; + // Store date range as strings for state management const [dateRange, setDateRange] = useState<[null | string, null | string]>(() => { - if (defaultValue && Array.isArray(defaultValue)) { + const currentValue = value !== undefined ? value : defaultValue; + if (currentValue && Array.isArray(currentValue)) { return [ - typeof defaultValue[0] === 'string' ? defaultValue[0] : null, - typeof defaultValue[1] === 'string' ? defaultValue[1] : null, + typeof currentValue[0] === 'string' ? currentValue[0] : null, + typeof currentValue[1] === 'string' ? currentValue[1] : null, ]; } return [null, null]; }); - // Sync dateRange state when defaultValue changes + // Sync dateRange state when value changes useEffect(() => { - if (operator === 'inTheRangeDate' && defaultValue && Array.isArray(defaultValue)) { + const currentValue = value !== undefined ? value : defaultValue; + if (operator === 'inTheRangeDate' && currentValue && Array.isArray(currentValue)) { setDateRange([ - typeof defaultValue[0] === 'string' ? defaultValue[0] : null, - typeof defaultValue[1] === 'string' ? defaultValue[1] : null, + typeof currentValue[0] === 'string' ? currentValue[0] : null, + typeof currentValue[1] === 'string' ? currentValue[1] : null, ]); } - }, [defaultValue, operator]); + }, [value, defaultValue, operator]); + + // Sync numberRange state when value changes + useEffect(() => { + const currentValue = value !== undefined ? value : defaultValue; + if (operator === 'inTheRange' && currentValue && Array.isArray(currentValue)) { + setNumberRange([ + typeof currentValue[0] === 'number' + ? currentValue[0] + : Number(currentValue[0]) || 0, + typeof currentValue[1] === 'number' + ? currentValue[1] + : Number(currentValue[1]) || 0, + ]); + } + }, [value, defaultValue, operator]); // Check if operator requires DatePicker const isDatePickerOperator = @@ -84,12 +111,13 @@ const QueryValueInput = ({ data, defaultValue, onChange, operator, type, ...prop { label: 'false', value: 'false' }, ]} onChange={onChange} + value={value} {...props} /> ); case 'date': if (isDatePickerOperator && operator !== 'inTheRangeDate') { - const dateValue = defaultValue ? parseDateValue(defaultValue) : null; + const dateValue = value ? parseDateValue(value) : null; return ( ); } - return ; + return ; case 'dateRange': if (operator === 'inTheRangeDate') { return ( @@ -158,24 +186,24 @@ const QueryValueInput = ({ data, defaultValue, onChange, operator, type, ...prop <> { const newRange = [Number(e) || 0, numberRange[1]]; setNumberRange(newRange); onChange(newRange); }} + value={numberRange[0] || undefined} width="10%" /> { const newRange = [numberRange[0], Number(e) || 0]; setNumberRange(newRange); onChange(newRange); }} + value={numberRange[1] || undefined} width="10%" /> @@ -185,14 +213,14 @@ const QueryValueInput = ({ data, defaultValue, onChange, operator, type, ...prop ); case 'playlist': - return ; case 'string': - return ; + return ; default: return <>; @@ -301,7 +329,6 @@ export const QueryBuilderOption = ({ {field ? ( ) : ( )} diff --git a/src/renderer/features/playlists/components/playlist-query-builder.tsx b/src/renderer/features/playlists/components/playlist-query-builder.tsx index 217c74883..bb577865e 100644 --- a/src/renderer/features/playlists/components/playlist-query-builder.tsx +++ b/src/renderer/features/playlists/components/playlist-query-builder.tsx @@ -276,10 +276,13 @@ export const PlaylistQueryBuilder = forwardRef( const handleDeleteRuleGroup = useCallback((args: DeleteArgs) => { const { groupIndex, level, uniqueId } = args; - const path = level === 0 ? 'group' : getTypePath(groupIndex); + const path = level === 0 ? 'group' : getGroupPath(level - 1, groupIndex.slice(0, -1)); setFilters((prev) => { - const currentGroups = get(prev, path) || []; + const currentGroups = get(prev, path); + if (!Array.isArray(currentGroups)) { + return prev; + } return setWith( clone(prev), path,