N°803 - Allow display & edition of attributes on n:n relations on Portal

- Issue when selecting links rows with checkbox
- Change linked set field validation to prevent checking host id -1
This commit is contained in:
Benjamin Dalsass
2023-06-12 17:25:03 +02:00
parent ad1836d028
commit 465388b5e3
3 changed files with 47 additions and 36 deletions

View File

@@ -358,17 +358,26 @@ class LinkedSetField extends Field
/** @var ormLinkSet $oSet */
$oSet = $this->GetCurrentValue();
// retrieve displayed attributes
$aAttributesToDisplayCodes = $this->GetLnkAttributesToDisplay(true);
// validate each links...
/** @var \DBObject $oItem */
foreach ($oSet as $oItem) {
list($bRes, $aIssues) = $oItem->CheckToWrite();
if ($bRes === false) {
foreach ($aIssues as $sIssue) {
$sItem = $oItem->Get('friendlyname') != '' ? $oItem->Get('friendlyname') : Dict::S('UI:Links:NewItem');
$this->AddErrorMessage('<b>'.$sItem.' : </b>'.$sIssue);
$aChanges = $oItem->ListChanges();
foreach ($aChanges as $sAttCode => $value) {
if (!in_array($sAttCode, $aAttributesToDisplayCodes)) {
continue;
}
$res = $oItem->CheckValue($sAttCode);
if ($res !== true) {
$sAttLabel = $this->GetLabel($sAttCode);
$sItem = $oItem->Get('friendlyname') != '' ? $oItem->Get('friendlyname') : Dict::S('UI:Links:NewItem');
$sIssue = Dict::Format('Core:CheckValueError', $sAttLabel, $sAttCode, $res);
$this->AddErrorMessage('<b>'.$sItem.' : </b>'.$sIssue);
$bValid = false;
}
$bValid = false;
}
}
$oSet->Rewind();

View File

@@ -136,7 +136,7 @@ EOF
$sLabelGeneralCheckbox = utils::EscapeHtml(Dict::S('Core:BulkExport:CheckAll').' / '.Dict::S('Core:BulkExport:UncheckAll'));
$sSelectionOptionHtml = ($this->oField->GetReadOnly()) ? 'false' : '{"style": "multi"}';
$sSelectionInputGlobalHtml = ($this->oField->GetReadOnly()) ? '' : '<span class="row_input"><input type="checkbox" id="'.$this->oField->GetGlobalId().'_check_all" name="'.$this->oField->GetGlobalId().'_check_all" title="'.$sLabelGeneralCheckbox.'" /></span>';
$sSelectionInputHtml = ($this->oField->GetReadOnly()) ? '' : '<span class="row_input"><input type="checkbox" name="'.$this->oField->GetGlobalId().'" /></span>';
$sSelectionInputHtml = ($this->oField->GetReadOnly()) ? '' : '<span class="row_input"><input type="checkbox" data-type="row-selection" name="'.$this->oField->GetGlobalId().'" /></span>';
// - Output
$oOutput->AddJs(
<<<JS
@@ -314,8 +314,10 @@ EOF
// Prevent row selection on input click
$('input,select,textarea,.input-group-addon', oRow).on('click', function(oEvent){
// Prevents row selection
oEvent.stopPropagation();
if($(this).data('type') !== 'row-selection'){
// Prevents row selection
oEvent.stopPropagation();
}
});
// Store attributes inline css and js
@@ -411,7 +413,7 @@ JS
$("[data-field-id='{$this->oField->GetId()}'][data-form-path='{$this->oField->GetFormPath()}']").portal_form_field({
'validators': {$this->GetValidatorsAsJson()},
'on_validation_callback': function(){
const aLinkedSetInputs = $('#{$sFieldWrapperId} input', this.element);
const aLinkedSetInputs = $('#{$sFieldWrapperId} input,select,textarea', this.element);
aLinkedSetInputs.each(function(e){
const oInput = $(this);
const aInputValidity = oInput[0].validity;

View File

@@ -55,6 +55,9 @@ class BsSimpleFieldRenderer extends BsFieldRenderer
$sFieldMandatoryClass = ($this->oField->GetMandatory()) ? 'form_mandatory' : '';
$sFieldDescriptionForHTMLTag = ($this->oField->HasDescription()) ? 'data-tooltip-content="'.utils::HtmlEntities($this->oField->GetDescription()).'"' : '';
// Prepare input validations tags
$sInputTags = $this->ComputeInputValidationTags($this->oField);
// Rendering field in edition mode
if (!$this->oField->GetReadOnly() && !$this->oField->GetHidden()) {
// HTML content
@@ -82,9 +85,6 @@ class BsSimpleFieldRenderer extends BsFieldRenderer
// - Help block
$oOutput->AddHtml('<div class="help-block"></div>');
// Prepare input validations tags
$sInputTags = $this->ComputeInputValidationTags($this->oField);
// - Value regarding the field type
switch ($sFieldClass) {
case 'Combodo\\iTop\\Form\\Field\\DateTimeField':
@@ -111,7 +111,7 @@ EOF
break;
case 'Combodo\\iTop\\Form\\Field\\PasswordField':
$oOutput->AddHtml('<input type="password" id="'.$this->oField->GetGlobalId().'" name="'.$this->oField->GetId().'" value="')->AddHtml($this->oField->GetCurrentValue(), true)->AddHtml('" class="form-control" maxlength="255" autocomplete="off" />');
$oOutput->AddHtml('<input type="password" id="'.$this->oField->GetGlobalId().'" name="'.$this->oField->GetId().'" value="')->AddHtml($this->oField->GetCurrentValue(), true)->AddHtml('" class="form-control" maxlength="255" autocomplete="off" '.$sInputTags.'/>');
break;
case 'Combodo\\iTop\\Form\\Field\\StringField':
@@ -124,7 +124,7 @@ EOF
case 'Combodo\\iTop\\Form\\Field\\SelectField':
case 'Combodo\\iTop\\Form\\Field\\MultipleSelectField':
$oOutput->AddHtml('<select id="'.$this->oField->GetGlobalId().'" name="'.$this->oField->GetId().'" '.(($this->oField->GetMultipleValuesEnabled()) ? 'multiple' : '').' class="form-control">');
$oOutput->AddHtml('<select id="'.$this->oField->GetGlobalId().'" name="'.$this->oField->GetId().'" '.(($this->oField->GetMultipleValuesEnabled()) ? 'multiple' : '').' class="form-control" '.$sInputTags.'>');
foreach ($this->oField->GetChoices() as $sChoice => $sLabel) {
// Note : The test is a double equal on purpose as the type of the value received from the XHR is not always the same as the type of the allowed values. (eg : string vs int)
$sSelectedAtt = ($this->oField->GetCurrentValue() == $sChoice) ? 'selected' : '';
@@ -148,29 +148,29 @@ EOF
// Label
$oOutput->AddHtml('<div class="form_field_label">');
if ($this->oField->GetLabel() !== '') {
$oOutput->AddHtml('<label for="' . $this->oField->GetGlobalId() . '" class="control-label" '.$sFieldDescriptionForHTMLTag.'>')->AddHtml($this->oField->GetLabel(), true)->AddHtml('</label>');
}
$oOutput->AddHtml('</div>');
if ($this->oField->GetLabel() !== '') {
$oOutput->AddHtml('<label for="'.$this->oField->GetGlobalId().'" class="control-label" '.$sFieldDescriptionForHTMLTag.'>')->AddHtml($this->oField->GetLabel(), true)->AddHtml('</label>');
}
$oOutput->AddHtml('</div>');
// Value
$oOutput->AddHtml('<div class="form_field_control">');
// - Help block
$oOutput->AddHtml('<div class="help-block"></div>');
// First the edition area
$oOutput->AddHtml('<div>');
$oOutput->AddHtml('<textarea id="' . $this->oField->GetGlobalId() . '" name="' . $this->oField->GetId() . '" class="form-control" rows="8">' . $this->oField->GetCurrentValue() . '</textarea>');
$oOutput->AddHtml('</div>');
// Then the previous entries if necessary
if ($sFieldClass === 'Combodo\\iTop\\Form\\Field\\CaseLogField') {
$this->PreparingCaseLogEntries($oOutput);
}
$oOutput->AddHtml('</div>');
// Value
$oOutput->AddHtml('<div class="form_field_control">');
// - Help block
$oOutput->AddHtml('<div class="help-block"></div>');
// First the edition area
$oOutput->AddHtml('<div>');
$oOutput->AddHtml('<textarea id="'.$this->oField->GetGlobalId().'" name="'.$this->oField->GetId().'" class="form-control" rows="8" '.$sInputTags.'>'.$this->oField->GetCurrentValue().'</textarea>');
$oOutput->AddHtml('</div>');
// Then the previous entries if necessary
if ($sFieldClass === 'Combodo\\iTop\\Form\\Field\\CaseLogField') {
$this->PreparingCaseLogEntries($oOutput);
}
$oOutput->AddHtml('</div>');
// Closing container
$oOutput->AddHtml('</div>');
// Closing container
$oOutput->AddHtml('</div>');
// Some additional stuff if we are displaying it with a rich editor
// Some additional stuff if we are displaying it with a rich editor
if ($bRichEditor) {
$aConfig = utils::GetCkeditorPref();
$aConfig['extraPlugins'] = 'codesnippet';