From 055ca89ac0c25624269f75769ee8fe3aa0afac82 Mon Sep 17 00:00:00 2001 From: ZayanKhan-12 <108294002+ZayanKhan-12@users.noreply.github.com> Date: Sat, 25 Jul 2026 06:02:17 -0400 Subject: [PATCH 1/2] Always include a requested activation in the connection PATCH The PATCH body is built from the differences between the staged endpoint response and the intended staged values, but the activation object in a PATCH is a request rather than staged state. When a receiver's staged endpoint already reported the same activation values (e.g. a node that initializes staged activation.mode to "activate_immediate"), the differences omitted the activation object entirely, so pressing Activate in the Connect tab or activating from Staged/Edit sent a PATCH with no activation and nothing happened. Include the activation object whenever a mode is set, even if the staged endpoint already reported the same values. A null mode is still only sent when it results from an actual difference, so pending activations are not unintentionally cancelled. Fixes #97 Co-Authored-By: Claude Fable 5 --- Development/src/dataProvider.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Development/src/dataProvider.js b/Development/src/dataProvider.js index fd52561..325e7b4 100644 --- a/Development/src/dataProvider.js +++ b/Development/src/dataProvider.js @@ -568,6 +568,18 @@ const convertDataProviderRequestToHTTP = ( JsonPointer.set(patchData, `/${d.path.join('/')}`, d.rhs, true); } + // the activation object in a PATCH requests an activation, rather + // than reflecting staged state, so when a mode is set, include it + // even if the staged endpoint already reported the same values, + // which otherwise leaves it out of the differences (see #97) + if (get(params, 'data.$staged.activation.mode') != null) { + set( + patchData, + 'activation', + get(params, 'data.$staged.activation') + ); + } + if (has(patchData, 'transport_file')) { if (get(patchData, 'transport_file.data') === null) { set(patchData, 'transport_file.type', null); From 6a391cc967d9f5de8245df7deab1ba9319a2b661 Mon Sep 17 00:00:00 2001 From: ZayanKhan-12 <108294002+ZayanKhan-12@users.noreply.github.com> Date: Thu, 30 Jul 2026 00:19:56 -0400 Subject: [PATCH 2/2] Expand comment explaining why a requested activation is always included in the PATCH Co-Authored-By: Claude Fable 5 --- Development/src/dataProvider.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Development/src/dataProvider.js b/Development/src/dataProvider.js index 325e7b4..5cf06f7 100644 --- a/Development/src/dataProvider.js +++ b/Development/src/dataProvider.js @@ -568,10 +568,12 @@ const convertDataProviderRequestToHTTP = ( JsonPointer.set(patchData, `/${d.path.join('/')}`, d.rhs, true); } - // the activation object in a PATCH requests an activation, rather - // than reflecting staged state, so when a mode is set, include it - // even if the staged endpoint already reported the same values, - // which otherwise leaves it out of the differences (see #97) + // Activation in a PATCH is a request, not staged state. Include it whenever + // the request has a non-null mode, even if GET /staged already reported the + // same values (otherwise deep-diff omits it). That also covers non-conformant + // devices that leave activate_immediate on /staged (see #97). A null mode is + // only sent when it appears in the differences, so unrelated edits do not + // cancel a pending activation. if (get(params, 'data.$staged.activation.mode') != null) { set( patchData,