From 0d1f8992bcc1c5e423fd7b7281471de2f1d6ac44 Mon Sep 17 00:00:00 2001 From: Kaushal Shriwas Date: Thu, 19 Mar 2026 17:17:33 +0530 Subject: [PATCH] fix(filter): use JSON encoding for in filter values containing commas --- frappe/model/db_query.py | 6 +++++- frappe/public/js/frappe/ui/filters/filter.js | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index eecacbd790..4c425f1ed6 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -888,7 +888,11 @@ from {tables} if value is None: values = f.value or "" if isinstance(values, str): - values = values.split(",") + try: + parsed = json.loads(values) + values = parsed if isinstance(parsed, list) else [parsed] + except (ValueError, TypeError): + values = values.split(",") fallback = "''" value = [frappe.db.escape((cstr(v) or "").strip(), percent=False) for v in values] diff --git a/frappe/public/js/frappe/ui/filters/filter.js b/frappe/public/js/frappe/ui/filters/filter.js index 40f183450f..7b8c05bf7c 100644 --- a/frappe/public/js/frappe/ui/filters/filter.js +++ b/frappe/public/js/frappe/ui/filters/filter.js @@ -203,7 +203,7 @@ frappe.ui.Filter = class { this._filter_value_set = Promise.resolve(); if (["in", "not in"].includes(condition) && Array.isArray(value)) { - value = value.join(","); + value = value.some((v) => String(v).includes(",")) ? JSON.stringify(value) : value.join(","); } if (Array.isArray(value)) { @@ -485,7 +485,12 @@ frappe.ui.filter_utils = { } } else if (["in", "not in"].includes(condition)) { if (val) { - val = val.split(",").map((v) => strip(v)); + try { + const parsed = JSON.parse(val); + val = Array.isArray(parsed) ? parsed : [String(parsed)]; + } catch { + val = val.split(",").map((v) => strip(v)); + } } } else if (frappe.boot.additional_filters_config[condition]) { val = field.value || val;