From 8f1ef2dd72502d4b08cea5f4aab1c4a07e78cd08 Mon Sep 17 00:00:00 2001 From: Sagar Vora <16315650+sagarvora@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:42:08 +0530 Subject: [PATCH 1/2] fix: child table dependency evaluation for depends_on, mandatory_depends_on, read_only_depends_on - Add missing depends_on support for child table field visibility - Fix reset logic to properly re-evaluate all fields with dependencies - Remove buggy dependent_fields tracking that only tracked fields made required/readonly by dependency --- frappe/public/js/frappe/form/grid_row.js | 38 ++++++++---------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 23215eed6c..61905990fe 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -8,10 +8,6 @@ export default class GridRow { this.set_docfields(); this.columns = {}; this.columns_list = []; - this.dependent_fields = { - mandatory: [], - read_only: [], - }; this.row_check_html = ''; this.default_rows_threshold_for_grid_search = 20; this.make(); @@ -796,33 +792,25 @@ export default class GridRow { } set_dependant_property(df) { - if ( - !df.reqd && - df.mandatory_depends_on && - this.evaluate_depends_on_value(df.mandatory_depends_on) - ) { - df.reqd = 1; - this.dependent_fields["mandatory"].push(df); + if (df.depends_on) { + df.hidden_due_to_dependency = !this.evaluate_depends_on_value(df.depends_on) ? 1 : 0; } - if ( - !df.read_only && - df.read_only_depends_on && - this.evaluate_depends_on_value(df.read_only_depends_on) - ) { - df.read_only = 1; - this.dependent_fields["read_only"].push(df); + if (df.mandatory_depends_on) { + df.reqd = this.evaluate_depends_on_value(df.mandatory_depends_on) ? 1 : 0; + } + + if (df.read_only_depends_on) { + df.read_only = this.evaluate_depends_on_value(df.read_only_depends_on) ? 1 : 0; } } refresh_dependency() { - this.dependent_fields["read_only"].forEach((df) => { - df.read_only = 0; - this.set_dependant_property(df); - }); - this.dependent_fields["mandatory"].forEach((df) => { - df.reqd = 0; - this.set_dependant_property(df); + // re-evaluate all fields that have dependency expressions + this.docfields.forEach((df) => { + if (df.depends_on || df.mandatory_depends_on || df.read_only_depends_on) { + this.set_dependant_property(df); + } }); this.refresh(); } From 17f1bf8c29bbfdcd2e44238b3ad06c0a65c0534a Mon Sep 17 00:00:00 2001 From: Sagar Vora <16315650+sagarvora@users.noreply.github.com> Date: Sat, 17 Jan 2026 17:41:20 +0530 Subject: [PATCH 2/2] fix: check write status before updating rating Rating control uses SVG elements instead of $input, so the standard input disabling doesn't apply. Add can_write() check at interaction time to respect read_only state. --- frappe/public/js/frappe/form/controls/rating.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/public/js/frappe/form/controls/rating.js b/frappe/public/js/frappe/form/controls/rating.js index 2ae44d8f45..4401adbf4b 100644 --- a/frappe/public/js/frappe/form/controls/rating.js +++ b/frappe/public/js/frappe/form/controls/rating.js @@ -43,6 +43,9 @@ frappe.ui.form.ControlRating = class ControlRating extends frappe.ui.form.Contro } update_rating(ev, click) { + // Rating doesn't have $input, so check write status at interaction time + if (!this.can_write()) return; + const el = $(ev.currentTarget); let star_value = el.data("rating"); let left_half = false;