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 ;
+ 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,