N°3198 n:n relations in edit mode : refresh remote class fields on extkey change

This commit is contained in:
Pierre Goiffon
2020-08-18 10:56:57 +02:00
parent 7d7270296e
commit 4e5bbcde35
6 changed files with 232 additions and 85 deletions

View File

@@ -1971,6 +1971,11 @@ HTML
$sNullValue = $oAttDef->GetNullValue(); // used for the ValidateField() call in js/forms-json-utils.js $sNullValue = $oAttDef->GetNullValue(); // used for the ValidateField() call in js/forms-json-utils.js
$sFieldToValidateId = $iId; // can be different than the displayed field (for example in TagSet) $sFieldToValidateId = $iId; // can be different than the displayed field (for example in TagSet)
// List of attributes that depend on the current one
// Might be modified depending on the current field
$sWizardHelperJsVarName = "oWizardHelper{$sFormPrefix}";
$aDependencies = MetaModel::GetDependentAttributes($sClass, $sAttCode);
switch ($oAttDef->GetEditClass()) switch ($oAttDef->GetEditClass())
{ {
case 'Date': case 'Date':
@@ -2261,6 +2266,7 @@ EOF
break; break;
case 'ExtKey': case 'ExtKey':
/** @var \AttributeExternalKey $oAttDef */
$aEventsList[] = 'validate'; $aEventsList[] = 'validate';
$aEventsList[] = 'change'; $aEventsList[] = 'change';
@@ -2279,6 +2285,19 @@ EOF
$sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(), $sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(),
$oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aExtKeyParams); $oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aExtKeyParams);
$sHTMLValue .= "<!-- iFlags: $iFlags bMandatory: $bMandatory -->\n"; $sHTMLValue .= "<!-- iFlags: $iFlags bMandatory: $bMandatory -->\n";
$bHasExtKeyUpdatingRemoteClassFields = (
array_key_exists('replaceDependenciesByRemoteClassFields', $aArgs)
&& ($aArgs['replaceDependenciesByRemoteClassFields'])
);
if ($bHasExtKeyUpdatingRemoteClassFields)
{
// On this field update we need to update all the corresponding remote class fields
// Used when extkey widget is in a linkedset indirect
$sWizardHelperJsVarName = $aArgs['wizHelperRemote'];
$aDependencies = $aArgs['remoteCodes'];
}
break; break;
case 'RedundancySetting': case 'RedundancySetting':
@@ -2476,15 +2495,39 @@ EOF
$sNullValue = "'$sNullValue'"; // Add quotes to turn this into a JS string if it's not a number $sNullValue = "'$sNullValue'"; // Add quotes to turn this into a JS string if it's not a number
} }
$sOriginalValue = ($iFlags & OPT_ATT_MUSTCHANGE) ? json_encode($value) : 'undefined'; $sOriginalValue = ($iFlags & OPT_ATT_MUSTCHANGE) ? json_encode($value) : 'undefined';
$oPage->add_ready_script("$('#$sFieldToValidateId').bind('".implode(' ', $sEventList = implode(' ', $aEventsList);
$aEventsList)."', function(evt, sFormId) { return ValidateField('$sFieldToValidateId', '$sPattern', $bMandatory, sFormId, $sNullValue, $sOriginalValue) } );\n"); // Bind to a custom event: validate $oPage->add_ready_script(<<<JS
$('#$sFieldToValidateId')
.bind('$sEventList',
function(evt, sFormId) {
// Bind to a custom event: validate
return ValidateField('$sFieldToValidateId', '$sPattern', $bMandatory, sFormId, $sNullValue, $sOriginalValue);
}
);
JS
);
} }
$aDependencies = MetaModel::GetDependentAttributes($sClass, $sAttCode); // List of attributes that depend on the current one
// handle dependent fields updates (init for WizardHelper JS object)
if (count($aDependencies) > 0) if (count($aDependencies) > 0)
{ {
// Unbind first to avoid duplicate event handlers in case of reload of the whole (or part of the) form //--- Add an event handler to launch a custom event: validate
$oPage->add_ready_script("$('#$iId').unbind('change.dependencies').bind('change.dependencies', function(evt, sFormId) { return oWizardHelper{$sFormPrefix}.UpdateDependentFields(['".implode("','", // * Unbind first to avoid duplicate event handlers in case of reload of the whole (or part of the) form
$aDependencies)."']) } );\n"); // Bind to a custom event: validate // * We were using off/on directly on the node before, but that was causing an issue when adding dynamically new nodes
// indeed the events weren't attached on the of the new nodes !
// So we're adding the handler on a node above, and we're using a selector to catch only the event we're interested in !
$sDependencies = implode("','", $aDependencies);
$oPage->add_ready_script(<<<JS
$('div#field_{$iId}')
.off('change.dependencies', '#$iId')
.on('change.dependencies', '#$iId',
function(evt, sFormId) {
return $sWizardHelperJsVarName.UpdateDependentFields(['$sDependencies']);
}
);
JS
);
} }
} }
$oPage->add_dict_entry('UI:ValueMustBeSet'); $oPage->add_dict_entry('UI:ValueMustBeSet');

View File

@@ -130,45 +130,39 @@ class UILinksWidget
$aRow = array(); $aRow = array();
$aFieldsMap = array(); $aFieldsMap = array();
$iKey = 0; $iKey = 0;
if(is_object($linkObjOrId) && (!$linkObjOrId->IsNew()))
if (is_object($linkObjOrId) && (!$linkObjOrId->IsNew()))
{ {
$iKey = $linkObjOrId->GetKey(); $iKey = $linkObjOrId->GetKey();
$iRemoteObjKey = $linkObjOrId->Get($this->m_sExtKeyToRemote); $iRemoteObjKey = $linkObjOrId->Get($this->m_sExtKeyToRemote);
$sPrefix .= "[$iKey]["; $sPrefix .= "[$iKey][";
$sNameSuffix = "]"; // To make a tabular form $sNameSuffix = "]"; // To make a tabular form
$aArgs['prefix'] = $sPrefix; $aArgs['prefix'] = $sPrefix;
$aArgs['wizHelper'] = "oWizardHelper{$this->m_iInputId}{$iKey}"; $aArgs['wizHelper'] = "oWizardHelper{$this->m_iInputId}{$iKey}";
$aArgs['this'] = $linkObjOrId; $aArgs['this'] = $linkObjOrId;
if($bReadOnly) if ($bReadOnly)
{ {
$aRow['form::checkbox'] = ""; $aRow['form::checkbox'] = "";
foreach($this->m_aEditableFields as $sFieldCode) foreach ($this->m_aEditableFields as $sFieldCode)
{ {
$sDisplayValue = $linkObjOrId->GetEditValue($sFieldCode); $sDisplayValue = $linkObjOrId->GetEditValue($sFieldCode);
$aRow[$sFieldCode] = $sDisplayValue; $aRow[$sFieldCode] = $sDisplayValue;
} }
} }
else else
{ {
$aRow['form::checkbox'] = "<input class=\"selection\" data-remote-id=\"$iRemoteObjKey\" data-link-id=\"$iKey\" data-unique-id=\"$iUniqueId\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$iKey\">"; $aRow['form::checkbox'] = "<input class=\"selection\" data-remote-id=\"$iRemoteObjKey\" data-link-id=\"$iKey\" data-unique-id=\"$iUniqueId\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$iKey\">";
foreach($this->m_aEditableFields as $sFieldCode) foreach ($this->m_aEditableFields as $sFieldCode)
{ {
$sRowFieldCode = ($sFieldCode === $this->m_sExtKeyToRemote) ? 'static::key' : $sFieldCode; $sSafeFieldId = $this->GetFieldId($linkObjOrId->GetKey(), $sFieldCode);
$sFieldId = $this->m_iInputId.'_'.$sFieldCode.'['.$linkObjOrId->GetKey().']'; $this->AddRowForFieldCode($aRow, $sFieldCode, $aArgs, $linkObjOrId, $oP, $sNameSuffix, $sSafeFieldId);
$sSafeId = utils::GetSafeId($sFieldId); $aFieldsMap[$sFieldCode] = $sSafeFieldId;
$sValue = $linkObjOrId->Get($sFieldCode); }
$sDisplayValue = $linkObjOrId->GetEditValue($sFieldCode); }
$oAttDef = MetaModel::GetAttributeDef($this->m_sLinkedClass, $sFieldCode);
$aRow[$sRowFieldCode] = '<div class="field_container" style="border:none;"><div class="field_data"><div class="field_value">'.
cmdbAbstractObject::GetFormElementForField($oP, $this->m_sLinkedClass, $sFieldCode, $oAttDef, $sValue,
$sDisplayValue, $sSafeId, $sNameSuffix, 0, $aArgs).
'</div></div></div>';
$aFieldsMap[$sFieldCode] = $sSafeId;
}
}
$sState = $linkObjOrId->GetState(); $sState = $linkObjOrId->GetState();
$sRemoteKeySafeFieldId = $this->GetFieldId($aArgs['this']->GetKey(), $this->m_sExtKeyToRemote);;
} }
else else
{ {
@@ -178,15 +172,18 @@ class UILinksWidget
// New link existing only in memory // New link existing only in memory
$oNewLinkObj = $linkObjOrId; $oNewLinkObj = $linkObjOrId;
$iRemoteObjKey = $oNewLinkObj->Get($this->m_sExtKeyToRemote); $iRemoteObjKey = $oNewLinkObj->Get($this->m_sExtKeyToRemote);
$oNewLinkObj->Set($this->m_sExtKeyToMe, $oCurrentObj); // Setting the extkey with the object also fills the related external fields $oNewLinkObj->Set($this->m_sExtKeyToMe,
$oCurrentObj); // Setting the extkey with the object also fills the related external fields
} }
else else
{ {
$iRemoteObjKey = $linkObjOrId; $iRemoteObjKey = $linkObjOrId;
$oNewLinkObj = MetaModel::NewObject($this->m_sLinkedClass); $oNewLinkObj = MetaModel::NewObject($this->m_sLinkedClass);
$oRemoteObj = MetaModel::GetObject($this->m_sRemoteClass, $iRemoteObjKey); $oRemoteObj = MetaModel::GetObject($this->m_sRemoteClass, $iRemoteObjKey);
$oNewLinkObj->Set($this->m_sExtKeyToRemote, $oRemoteObj); // Setting the extkey with the object alsoo fills the related external fields $oNewLinkObj->Set($this->m_sExtKeyToRemote,
$oNewLinkObj->Set($this->m_sExtKeyToMe, $oCurrentObj); // Setting the extkey with the object also fills the related external fields $oRemoteObj); // Setting the extkey with the object alsoo fills the related external fields
$oNewLinkObj->Set($this->m_sExtKeyToMe,
$oCurrentObj); // Setting the extkey with the object also fills the related external fields
} }
$sPrefix .= "[-$iUniqueId]["; $sPrefix .= "[-$iUniqueId][";
$sNameSuffix = "]"; // To make a tabular form $sNameSuffix = "]"; // To make a tabular form
@@ -220,59 +217,133 @@ EOF
foreach($this->m_aEditableFields as $sFieldCode) foreach($this->m_aEditableFields as $sFieldCode)
{ {
$sRowFieldCode = ($sFieldCode === $this->m_sExtKeyToRemote) ? 'static::key' : $sFieldCode; $sSafeFieldId = $this->GetFieldId($iUniqueId, $sFieldCode);
$sFieldId = $this->m_iInputId.'_'.$sFieldCode.'['.-$iUniqueId.']'; $this->AddRowForFieldCode($aRow, $sFieldCode, $aArgs, $oNewLinkObj, $oP, $sNameSuffix, $sSafeFieldId);
$sSafeId = utils::GetSafeId($sFieldId); $aFieldsMap[$sFieldCode] = $sSafeFieldId;
$sValue = $oNewLinkObj->Get($sFieldCode); $sValue = $oNewLinkObj->Get($sFieldCode);
$sDisplayValue = $oNewLinkObj->GetEditValue($sFieldCode); $oP->add_ready_script(
$oAttDef = MetaModel::GetAttributeDef($this->m_sLinkedClass, $sFieldCode); <<<JS
$aRow[$sRowFieldCode] = '<div class="field_container" style="border:none;"><div class="field_data"><div class="field_value">'.
cmdbAbstractObject::GetFormElementForField($oP, $this->m_sLinkedClass, $sFieldCode, $oAttDef, $sValue, $sDisplayValue,
$sSafeId /* id */, $sNameSuffix, 0, $aArgs).
'</div></div></div>';
$aFieldsMap[$sFieldCode] = $sSafeId;
$oP->add_ready_script(<<<EOF
oWidget{$this->m_iInputId}.OnValueChange($iKey, $iUniqueId, '$sFieldCode', '$sValue'); oWidget{$this->m_iInputId}.OnValueChange($iKey, $iUniqueId, '$sFieldCode', '$sValue');
EOF JS
); );
} }
$sState = ''; $sState = '';
$sRemoteKeySafeFieldId = $this->GetFieldId($iUniqueId, $this->m_sExtKeyToRemote);
} }
if(!$bReadOnly) if (!$bReadOnly)
{ {
$sExtKeyToMeId = utils::GetSafeId($sPrefix.$this->m_sExtKeyToMe); $sExtKeyToMeId = utils::GetSafeId($sPrefix.$this->m_sExtKeyToMe);
$aFieldsMap[$this->m_sExtKeyToMe] = $sExtKeyToMeId; $aFieldsMap[$this->m_sExtKeyToMe] = $sExtKeyToMeId;
$aRow['form::checkbox'] .= "<input type=\"hidden\" id=\"$sExtKeyToMeId\" value=\"".$oCurrentObj->GetKey()."\">"; $aRow['form::checkbox'] .= "<input type=\"hidden\" id=\"$sExtKeyToMeId\" value=\"".$oCurrentObj->GetKey()."\">";
$sExtKeyToRemoteId = utils::GetSafeId($sPrefix.$this->m_sExtKeyToRemote); $sExtKeyToRemoteId = utils::GetSafeId($sPrefix.$this->m_sExtKeyToRemote);
$aFieldsMap[$this->m_sExtKeyToRemote] = $sExtKeyToRemoteId; $aFieldsMap[$this->m_sExtKeyToRemote] = $sExtKeyToRemoteId;
$aRow['form::checkbox'] .= "<input type=\"hidden\" id=\"$sExtKeyToRemoteId\" value=\"$iRemoteObjKey\">"; $aRow['form::checkbox'] .= "<input type=\"hidden\" id=\"$sExtKeyToRemoteId\" value=\"$iRemoteObjKey\">";
} }
// Adding fields from remote class
// all fields are embedded in a span + added to $aFieldsMap array so that we can refresh them after extkey change
$aRemoteFieldsMap = [];
foreach (MetaModel::GetZListItems($this->m_sRemoteClass, 'list') as $sFieldCode)
{
$sSafeFieldId = $this->GetFieldId($aArgs['this']->GetKey(), $sFieldCode);
$aRow['static::'.$sFieldCode] = "<span id='field_$sSafeFieldId'>".$oLinkedObj->GetAsHTML($sFieldCode).'</span>';
$aRemoteFieldsMap[$sFieldCode] = $sSafeFieldId;
}
// id field is needed so that remote object could be load server side
$aRemoteFieldsMap['id'] = $sRemoteKeySafeFieldId;
// Generate WizardHelper to update dependant fields
$this->AddWizardHelperInit($oP, $aArgs['wizHelper'], $this->m_sLinkedClass, $sState, $aFieldsMap);
//instantiate specific WizarHelper instance for remote class fields refresh
$bHasExtKeyUpdatingRemoteClassFields = (
array_key_exists('replaceDependenciesByRemoteClassFields', $aArgs)
&& ($aArgs['replaceDependenciesByRemoteClassFields'])
);
if ($bHasExtKeyUpdatingRemoteClassFields)
{
$this->AddWizardHelperInit($oP, $aArgs['wizHelperRemote'], $this->m_sRemoteClass, $sState, $aRemoteFieldsMap);
}
return $aRow;
}
private function AddRowForFieldCode(&$aRow, $sFieldCode, &$aArgs, $oLnk, $oP, $sNameSuffix, $sSafeFieldId): void
{
if (($sFieldCode === $this->m_sExtKeyToRemote))
{
// current field is the lnk extkey to the remote class
$aArgs['replaceDependenciesByRemoteClassFields'] = true;
$sRowFieldCode = 'static::key';
$aArgs['wizHelperRemote'] = $aArgs['wizHelper'].'_remote';
$aRemoteAttDefs = MetaModel::GetZListAttDefsFilteredForIndirectRemoteClass($this->m_sRemoteClass);
$aRemoteCodes = array_map(
function ($value) {
return $value->GetCode();
},
$aRemoteAttDefs
);
$aArgs['remoteCodes'] = $aRemoteCodes;
}
else
{
$aArgs['replaceDependenciesByRemoteClassFields'] = false;
$sRowFieldCode = $sFieldCode;
}
$sValue = $oLnk->Get($sFieldCode);
$sDisplayValue = $oLnk->GetEditValue($sFieldCode);
$oAttDef = MetaModel::GetAttributeDef($this->m_sLinkedClass, $sFieldCode);
$aRow[$sRowFieldCode] = '<div class="field_container" style="border:none;"><div class="field_data"><div class="field_value">'
.cmdbAbstractObject::GetFormElementForField(
$oP,
$this->m_sLinkedClass,
$sFieldCode,
$oAttDef,
$sValue,
$sDisplayValue,
$sSafeFieldId,
$sNameSuffix,
0,
$aArgs
)
.'</div></div></div>';
}
private function GetFieldId($iLnkId, $sFieldCode, $bSafe = true)
{
$sFieldId = $this->m_iInputId.'_'.$sFieldCode.'['.$iLnkId.']';
return ($bSafe) ? utils::GetSafeId($sFieldId) : $sFieldId;
}
private function AddWizardHelperInit($oP, $sWizardHelperVarName, $sWizardHelperClass, $sState, $aFieldsMap): void
{
$iFieldsCount = count($aFieldsMap); $iFieldsCount = count($aFieldsMap);
$sJsonFieldsMap = json_encode($aFieldsMap); $sJsonFieldsMap = json_encode($aFieldsMap);
$oP->add_script( $oP->add_script(
<<<EOF <<<JS
var {$aArgs['wizHelper']} = new WizardHelper('{$this->m_sLinkedClass}', '', '$sState'); var $sWizardHelperVarName = new WizardHelper('$sWizardHelperClass', '', '$sState');
{$aArgs['wizHelper']}.SetFieldsMap($sJsonFieldsMap); $sWizardHelperVarName.SetFieldsMap($sJsonFieldsMap);
{$aArgs['wizHelper']}.SetFieldsCount($iFieldsCount); $sWizardHelperVarName.SetFieldsCount($iFieldsCount);
EOF $sWizardHelperVarName.SetReturnNotEditableFields(true);
$sWizardHelperVarName.SetWizHelperJsVarName('$sWizardHelperVarName');
JS
); );
foreach(MetaModel::GetZListItems($this->m_sRemoteClass, 'list') as $sFieldCode)
{
$aRow['static::'.$sFieldCode] = $oLinkedObj->GetAsHTML($sFieldCode);
}
return $aRow;
} }
/** /**
* Display one row of the whole form * Display one row of the whole form
*
* @param WebPage $oP * @param WebPage $oP
* @param array $aConfig * @param array $aConfig
* @param array $aRow * @param array $aRow
* @param int $iRowId * @param int $iRowId
*
* @return string * @return string
*/ */
protected function DisplayFormRow(WebPage $oP, $aConfig, $aRow, $iRowId) protected function DisplayFormRow(WebPage $oP, $aConfig, $aRow, $iRowId)

View File

@@ -335,20 +335,41 @@ class WizardHelper
{ {
$sResult = $this->m_aData['m_oFieldsMap'][$sFieldName]; $sResult = $this->m_aData['m_oFieldsMap'][$sFieldName];
} }
return $sResult; return $sResult;
} }
public function GetReturnNotEditableFields()
{
return $this->m_aData['m_bReturnNotEditableFields'] ?? false;
}
/**
* @return string JS code to be executed for fields update
* @since 2.8.0 N°3198
*/
public function GetJsForUpdateFields()
{
$sWizardHelperJsVar = ($this->m_aData['m_sWizHelperJsVarName']) ?? 'oWizardHelper'.$this->GetFormPrefix();
$sWizardHelperJson = $this->ToJSON();
return <<<JS
{$sWizardHelperJsVar}.m_oData = {$sWizardHelperJson};
{$sWizardHelperJsVar}.UpdateFields();
JS;
}
static function ParseJsonSet($oMe, $sLinkClass, $sExtKeyToMe, $sJsonSet) static function ParseJsonSet($oMe, $sLinkClass, $sExtKeyToMe, $sJsonSet)
{ {
$aSet = json_decode($sJsonSet, true); // true means hash array instead of object $aSet = json_decode($sJsonSet, true); // true means hash array instead of object
$oSet = CMDBObjectSet::FromScratch($sLinkClass); $oSet = CMDBObjectSet::FromScratch($sLinkClass);
foreach($aSet as $aLinkObj) foreach ($aSet as $aLinkObj)
{ {
$oLink = MetaModel::NewObject($sLinkClass); $oLink = MetaModel::NewObject($sLinkClass);
foreach($aLinkObj as $sAttCode => $value) foreach ($aLinkObj as $sAttCode => $value)
{ {
$oAttDef = MetaModel::GetAttributeDef($sLinkClass, $sAttCode); $oAttDef = MetaModel::GetAttributeDef($sLinkClass, $sAttCode);
if (($oAttDef->IsExternalKey()) && ($value != '') && ($value > 0)) if (($oAttDef->IsExternalKey()) && ($value != '') && ($value > 0))
{ {
// For external keys: load the target object so that external fields // For external keys: load the target object so that external fields
// get filled too // get filled too

View File

@@ -377,6 +377,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
$('#'+me.id).val(iObjectId); $('#'+me.id).val(iObjectId);
if (prevValue != iObjectId) if (prevValue != iObjectId)
{ {
// dependent fields will be updated using the WizardHelper JS object
$('#'+me.id).trigger('validate'); $('#'+me.id).trigger('validate');
$('#'+me.id).trigger('extkeychange'); $('#'+me.id).trigger('extkeychange');
$('#'+me.id).trigger('change'); $('#'+me.id).trigger('change');

View File

@@ -67,7 +67,9 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
'm_oAllowedValues': {}, 'm_oAllowedValues': {},
'm_iFieldsCount': 0, 'm_iFieldsCount': 0,
'm_sFormPrefix': sFormPrefix, 'm_sFormPrefix': sFormPrefix,
'm_sState': sState 'm_sState': sState,
'm_bReturnNotEditableFields': false, // if true then will return values and not editable fields
'm_sWizHelperJsVarName': null // if set will use this name when server returns JS code in \WizardHelper::GetJsForUpdateFields
}; };
this.m_oData.m_sClass = sClass; this.m_oData.m_sClass = sClass;
@@ -111,6 +113,14 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
this.m_oData.m_oCurrentValues[sFieldName] = currentValue; this.m_oData.m_oCurrentValues[sFieldName] = currentValue;
}; };
this.SetReturnNotEditableFields = function (bReturnNotEditableFields) {
this.m_oData.m_bReturnNotEditableFields = bReturnNotEditableFields;
};
this.SetWizHelperJsVarName = function (sWizHelperJsVarName) {
this.m_oData.m_sWizHelperJsVarName = sWizHelperJsVarName;
};
this.ToJSON = function () { this.ToJSON = function () {
return JSON.stringify(this.m_oData); return JSON.stringify(this.m_oData);
}; };
@@ -167,9 +177,9 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
this.UpdateWizard = function () { this.UpdateWizard = function () {
//console.log('** UpdateWizard **') //console.log('** UpdateWizard **')
for(sFieldCode in this.m_oData.m_oFieldsMap) for (let sFieldCode in this.m_oData.m_oFieldsMap)
{ {
sCleanFieldCode = sFieldCode.replace('"', ''); let sCleanFieldCode = sFieldCode.replace('"', '');
//console.log(sFieldCode); //console.log(sFieldCode);
this.UpdateCurrentValue(sCleanFieldCode); this.UpdateCurrentValue(sCleanFieldCode);
} }
@@ -202,16 +212,16 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
}); });
}; };
this.UpdateCurrentValue = function (sFieldCode) this.UpdateCurrentValue = function (sFieldCode) {
{ var $oField = $('#'+this.m_oData.m_oFieldsMap[sFieldCode]);
$('#'+this.m_oData.m_oFieldsMap[sFieldCode]).trigger('update_value'); // Give the widget a chance to update its value (if it is aware of this event) $oField.trigger('update_value'); // Give the widget a chance to update its value (if it is aware of this event)
value = $('#'+this.m_oData.m_oFieldsMap[sFieldCode]).val(); var value = $oField.val();
if (value == '') if (value == '')
{ {
value = null; value = null;
} }
this.m_oData.m_oCurrentValues[sFieldCode] = value; this.m_oData.m_oCurrentValues[sFieldCode] = value;
return value; return value;
}; };
this.UpdateDependentFields = function (aFieldNames) { this.UpdateDependentFields = function (aFieldNames) {

View File

@@ -757,14 +757,15 @@ try
$value = $oObj->Get($sAttCode); $value = $oObj->Get($sAttCode);
$displayValue = $oObj->GetEditValue($sAttCode); $displayValue = $oObj->GetEditValue($sAttCode);
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode); $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if (!$oAttDef->IsWritable()) if (!$oAttDef->IsWritable() || ($oWizardHelper->GetReturnNotEditableFields()))
{ {
// Even non-writable fields (like AttributeExternal) can be refreshed // Even non-writable fields (like AttributeExternal) can be refreshed
$sHTMLValue = $oObj->GetAsHTML($sAttCode); $sHTMLValue = $oObj->GetAsHTML($sAttCode);
} }
else else
{ {
$sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $value, $displayValue, $sId, '', $iFlags, array('this' => $oObj, 'formPrefix' => $sFormPrefix), false); $sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $value,
$displayValue, $sId, '', $iFlags, array('this' => $oObj, 'formPrefix' => $sFormPrefix), false);
// Make sure that we immediately validate the field when we reload it // Make sure that we immediately validate the field when we reload it
$oPage->add_ready_script("$('#$sId').trigger('validate');"); $oPage->add_ready_script("$('#$sId').trigger('validate');");
} }
@@ -772,7 +773,7 @@ try
} }
} }
} }
$oPage->add_script("oWizardHelper{$sFormPrefix}.m_oData=".$oWizardHelper->ToJSON().";\noWizardHelper{$sFormPrefix}.UpdateFields();\n"); $oPage->add_script($oWizardHelper->GetJsForUpdateFields());
break; break;
case 'obj_creation_form': case 'obj_creation_form':