From 7f5378ba731e2f68dea57346bb8155f177474cf1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:13:34 +0000 Subject: [PATCH] Add validation mode to DialogSaveCancel Adds optional aValidationOption parameter to DialogSaveCancel that enables a validation + data-preservation flow matching the pattern used by DialogWithDateRange and DialogWithCustomBody. When aValidationOption is provided, the dialog: - Deep-clones jsonObject into cloneObject once, preserved across reopens - Builds the body via createBody(cloneObject) on every open - On Save, reads widgets into cloneObject via PopulateJsonFromDialog - Runs onValidate; on fail, shows DialogError and re-opens preserving data - On pass, invokes jsOk(cloneObject) Without aValidationOption the behavior is identical to before. Co-Authored-By: shujutech --- lib/UiUtil.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/lib/UiUtil.js b/lib/UiUtil.js index de319b5..2e884e2 100644 --- a/lib/UiUtil.js +++ b/lib/UiUtil.js @@ -437,8 +437,61 @@ UiUtil.DialogAnswerOk = function(value) { return result; }; -UiUtil.DialogSaveCancel = function(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc) { - UiUtil.DialogTwoButton(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc, "Save", "Cancel"); +UiUtil.DialogSaveCancel = function(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc, aValidationOption) { + if (UiUtil.NotUndefineNotNullNotBlank(aValidationOption)) { + // Validation mode: requires jsonObject, divBodyName, createBody, and onValidate + var aOnValidate = aValidationOption.onValidate; + var aBodyName = aValidationOption.divBodyName; + var aJsonObject = aValidationOption.jsonObject; + var aCreateBody = aValidationOption.createBody; + var aOnFailValidation = aValidationOption.onFailValidation; + + if (!aValidationOption.cloneObject) { // will not clone for recursive calls + aValidationOption.cloneObject = JSON.parse(JSON.stringify(aJsonObject)); + } + + var divBody = document.createElement('div'); + divBody.setAttribute('id', aBodyName); + divBody.setAttribute('style', 'text-align:left;margin-top:15px'); + var bodyContent = divBody; + + var jsFunc = function() { + if (UiUtil.NotUndefineNotNullNotBlank(onOpenFunc)) { + onOpenFunc(); + } + if (UiUtil.NotUndefineNotNullNotBlank(aCreateBody)) { + aCreateBody(aValidationOption.cloneObject); + } + }; + + UiUtil.DialogTwoButton(titleHtml, bodyContent, aIcon, function() { + UiUtil.PopulateJsonFromDialog(aBodyName, aValidationOption.cloneObject, function() { + if (UiUtil.NotUndefineNotNullNotBlank(aOnValidate)) { + aOnValidate(aValidationOption.cloneObject, function(aFailMsg) { + if (UiUtil.NotUndefineNotNullNotBlank(aFailMsg)) { + if (UiUtil.NotUndefineNotNullNotBlank(aOnFailValidation)) { + aOnFailValidation(); + } + UiUtil.DialogError("Error", aFailMsg, function() { + UiUtil.DialogSaveCancel(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc, aValidationOption); + }); + } else { + if (UiUtil.NotUndefineNotNullNotBlank(jsOk)) { + jsOk(aValidationOption.cloneObject); + } + } + }); + } else { + if (UiUtil.NotUndefineNotNullNotBlank(jsOk)) { + jsOk(aValidationOption.cloneObject); + } + } + }); + }, jsCancel, jsFunc, "Save", "Cancel"); + } else { + // Original behavior: no validation, simple pass-through + UiUtil.DialogTwoButton(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc, "Save", "Cancel"); + } }; UiUtil.DialogOkCancel = function(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc) { UiUtil.DialogTwoButton(titleHtml, msgHtml, aIcon, jsOk, jsCancel, onOpenFunc, "Ok", "Cancel");