Merge remote-tracking branch 'origin/itop-carbon' into develop

# Conflicts:
#	application/utils.inc.php
#	setup/ajax.dataloader.php
This commit is contained in:
Pierre Goiffon
2019-10-22 18:27:13 +02:00
6 changed files with 204 additions and 38 deletions

View File

@@ -395,6 +395,7 @@ EOF
{
foreach($aFields as $oField)
{
/** @var \DesignerFormField $oField */
$oField->ReadParam($aValues);
}
}
@@ -679,18 +680,34 @@ class DesignerTabularForm extends DesignerForm
class DesignerFormField
{
/** @var string $sLabel */
protected $sLabel;
/** @var string $sCode */
protected $sCode;
/** @var mixed $defaultValue */
protected $defaultValue;
/** @var \DesignerForm $oForm */
protected $oForm;
/** @var bool $bMandatory */
protected $bMandatory;
/** @var bool $bReadOnly */
protected $bReadOnly;
/** @var bool $bAutoApply */
protected $bAutoApply;
/** @var array $aCSSClasses */
protected $aCSSClasses;
/** @var bool $bDisplayed */
protected $bDisplayed;
/** @var array $aWidgetExtraParams */
protected $aWidgetExtraParams;
/**
* DesignerFormField constructor.
*
* @param string $sCode
* @param string $sLabel
* @param mixed $defaultValue
*/
public function __construct($sCode, $sLabel, $defaultValue)
{
$this->sLabel = $sLabel;
@@ -703,7 +720,10 @@ class DesignerFormField
$this->bDisplayed = true;
$this->aWidgetExtraParams = array();
}
/**
* @return string
*/
public function GetCode()
{
return $this->sCode;
@@ -712,69 +732,108 @@ class DesignerFormField
/**
* @param \DesignerForm $oForm
*/
public function SetForm(\DesignerForm $oForm)
public function SetForm(DesignerForm $oForm)
{
$this->oForm = $oForm;
}
/**
* @param bool $bMandatory
*/
public function SetMandatory($bMandatory = true)
{
$this->bMandatory = $bMandatory;
}
/**
* @param bool $bReadOnly
*/
public function SetReadOnly($bReadOnly = true)
{
$this->bReadOnly = $bReadOnly;
}
/**
* @return bool
*/
public function IsReadOnly()
{
return ($this->oForm->IsReadOnly() || $this->bReadOnly);
}
/**
* @param bool $bAutoApply
*/
public function SetAutoApply($bAutoApply)
{
$this->bAutoApply = $bAutoApply;
}
/**
* @return bool
*/
public function IsAutoApply()
{
return $this->bAutoApply;
}
/**
* @param bool $bDisplayed
*/
public function SetDisplayed($bDisplayed)
{
$this->bDisplayed = $bDisplayed;
}
/**
* @return bool
*/
public function IsDisplayed()
{
return $this->bDisplayed;
}
/**
* @return string
*/
public function GetFieldId()
{
return $this->oForm->GetFieldId($this->sCode);
}
/**
* @return string
*/
public function GetWidgetClass()
{
return 'property_field';
}
/**
* @return array
*/
public function GetWidgetExtraParams()
{
return $this->aWidgetExtraParams;
}
/**
* @param \WebPage $oP
* @param string $sFormId
* @param string $sRenderMode
*
* @return array
*/
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
$sId = $this->oForm->GetFieldId($this->sCode);
$sName = $this->oForm->GetFieldName($this->sCode);
return array('label' => $this->sLabel, 'value' => "<input type=\"text\" id=\"$sId\" name=\"$sName\" value=\"".htmlentities($this->defaultValue, ENT_QUOTES, 'UTF-8')."\">");
}
/**
* @param array $aValues
*/
public function ReadParam(&$aValues)
{
if ($this->IsReadOnly())
@@ -801,12 +860,18 @@ class DesignerFormField
}
}
}
/**
* @return bool
*/
public function IsVisible()
{
return true;
}
/**
* @param string $sCSSClass
*/
public function AddCSSClass($sCSSClass)
{
$this->aCSSClasses[] = $sCSSClass;
@@ -814,6 +879,8 @@ class DesignerFormField
/**
* A way to set/change the default value after constructing the field
*
* @param array $aAllDefaultValue
*/
public function SetDefaultValueFrom($aAllDefaultValue)
{
@@ -822,7 +889,12 @@ class DesignerFormField
$this->defaultValue = $aAllDefaultValue[$this->GetCode()];
}
}
/**
* @param $sFieldCode
*
* @return \DesignerFormField|false
*/
public function FindField($sFieldCode)
{
if ($this->sCode == $sFieldCode)
@@ -832,11 +904,17 @@ class DesignerFormField
return false;
}
/**
* @return string
*/
public function GetHandlerEquals()
{
return 'null';
}
/**
* @return string
*/
public function GetHandlerGetValue()
{
return 'null';
@@ -845,25 +923,43 @@ class DesignerFormField
class DesignerLabelField extends DesignerFormField
{
/** @var int $iCount A counter to automatically make the field code */
protected static $iCount = 0;
/** @var string $sDescription */
protected $sDescription;
/**
* @inheritdoc
*/
public function __construct($sLabel, $sDescription)
{
parent::__construct('', $sLabel, '');
// Increase counter
static::$iCount++;
parent::__construct('label_number_' . static::$iCount, $sLabel, '');
$this->sDescription = $sDescription;
}
/**
* @inheritdoc
*/
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
$sId = $this->oForm->GetFieldId($this->sCode);
$sName = $this->oForm->GetFieldName($this->sCode);
return array('label' => $this->sLabel, 'value' => $this->sDescription);
}
/**
* @inheritdoc
*/
public function ReadParam(&$aValues)
{
}
/**
* @inheritdoc
*/
public function IsVisible()
{
return true;
@@ -1334,7 +1430,8 @@ class DesignerIconSelectionField extends DesignerFormField
$sPostUploadTo = ($this->sUploadUrl == null) ? 'null' : "'{$this->sUploadUrl}'";
if (!$this->IsReadOnly())
{
$sValue = "<input type=\"hidden\" id=\"$sId\" name=\"$sName\" value=\"{$this->defaultValue}\"/>";
$sDefaultValue = ($this->defaultValue !== '') ? : $this->aAllowedValues[$idx]['value'];
$sValue = "<input type=\"hidden\" id=\"$sId\" name=\"$sName\" value=\"{$sDefaultValue}\"/>";
$oP->add_ready_script(
<<<EOF
$('#$sId').icon_select({current_idx: $idx, items: $sJSItems, post_upload_to: $sPostUploadTo});

View File

@@ -596,11 +596,13 @@ class utils
public static function BytesToFriendlyFormat($value)
{
$sReturn = '';
$iPrecision = 0;
// Kilobytes
if ($value >= 1024)
{
$sReturn = 'K';
$value = $value / 1024;
$iPrecision = 1;
}
// Megabytes
if ($value >= 1024)
@@ -621,7 +623,7 @@ class utils
$value = $value / 1024;
}
$value = round($value, 1);
$value = round($value, $iPrecision);
return $value . '' . $sReturn . 'B';
}

View File

@@ -2411,6 +2411,12 @@ a.summary, a.summary:hover {
background: url(../images/ok.png?v=v2.7.0-dev) 1em 1em no-repeat #cfc;
padding-left: 3em;
}
.message_warning {
border: 1px solid #ec9800;
background: url(../images/error.png?v=v2.6.1) 1em 1em no-repeat #ffd78d;
color: #000;
padding-left: 3em;
}
.message_error {
border: 1px solid #933;
background: url(../images/error.png?v=v2.7.0-dev) 1em 1em no-repeat #fcc;
@@ -2943,6 +2949,17 @@ table.listResults .originColor {
.menu-icon-select > .ui-menu-item {
padding: 0.3em 3%;
}
.menu-icon-select > .ui-menu-item > * {
width: 100%;
white-space: nowrap;
overflow-x: hidden;
text-overflow: ellipsis;
}
.menu-icon-select > .ui-menu-item > * > img {
max-width: 80px;
max-height: 45px;
margin-right: 10px;
}
.attribute.attribute-set .attribute-set-item::after {
content: ",";
margin-right: 0.5em;

View File

@@ -2791,6 +2791,12 @@ a.summary, a.summary:hover {
background: url(../images/ok.png?v=#{$version}) 1em 1em no-repeat #cfc;
padding-left: 3em;
}
.message_warning {
border: 1px solid #ec9800;
background: url(../images/error.png?v=#{$version}) 1em 1em no-repeat #ffd78d;
color: #000;
padding-left: 3em;
}
.message_error {
border: 1px solid #933;
background: url(../images/error.png?v=#{$version}) 1em 1em no-repeat #fcc;
@@ -3392,6 +3398,19 @@ table.listResults .originColor{
}
.menu-icon-select > .ui-menu-item{
padding: .3em 3%;
> *{
width: 100%;
white-space: nowrap;
overflow-x: hidden;
text-overflow: ellipsis;
> img{
max-width: 80px;
max-height: 45px;
margin-right: 10px;
}
}
}
//////////////////////

View File

@@ -256,14 +256,14 @@ $(function()
if (oWidget && oWidget._is_visible())
{
var oVal = oWidget._get_committed_value();
oData[oVal.name] = oVal.value;
oData[oVal.name] = me._get_value_for_post(oVal.value);
}
});
oPostedData = this.options.submit_parameters;
var oPostedData = this.options.submit_parameters;
oPostedData.params = oData;
oPostedData.params.updated = [ $('#'+this.options.field_id, this.element).attr('name') ]; // only one field updated in this case
oPostedData.params.previous_values = {};
oPostedData.params.previous_values[oPostedData.params.updated] = this.previous_value; // pass also the previous value(s)
oPostedData.params.previous_values[$('#'+this.options.field_id, this.element).attr('name')] = me._get_value_for_post(this.previous_value); // pass also the previous value(s)
$.post(this.options.submit_to, oPostedData, function(data)
{
$('#prop_submit_result').html(data);
@@ -293,6 +293,14 @@ $(function()
oWidget = element.data('itopSelector_property_field');
}
return oWidget;
},
_get_value_for_post: function(value)
{
if ((typeof value == "object") && (Object.keys(value).length === 0))
{
return "";
}
return value;
}
});
});

View File

@@ -615,8 +615,8 @@ class ModelFactory
if (!$oTargetParentNode)
{
echo "Dumping target doc - looking for '$sParentId'<br/>\n";
$this->oDOMDocument->firstChild->Dump();
// echo "Dumping target doc - looking for '$sParentId'<br/>\n";
// $this->oDOMDocument->firstChild->Dump();
$sPath = MFDocument::GetItopNodePath($oSourceNode);
$iLine = $oSourceNode->getLineNo();
throw new MFException($sPath.' at line '.$iLine.": parent class '$sParentId' could not be found", MFException::PARENT_NOT_FOUND, $iLine, $sPath, $sParentId);
@@ -633,8 +633,8 @@ class ModelFactory
}
else
{
echo "Dumping target doc - looking for '".$oSourceNode->getAttribute('id')."'<br/>\n";
$this->oDOMDocument->firstChild->Dump();
// echo "Dumping target doc - looking for '".$oSourceNode->getAttribute('id')."'<br/>\n";
// $this->oDOMDocument->firstChild->Dump();
$sPath = MFDocument::GetItopNodePath($oSourceNode);
$iLine = $oSourceNode->getLineNo();
throw new MFException($sPath.' at line '.$iLine.": could not be found", MFException::NOT_FOUND, $iLine, $sPath);
@@ -1078,13 +1078,17 @@ class ModelFactory
/**
* Check if the class specified by the given name already exists in the loaded DOM
*
* @param string $sClassName The node corresponding to the class to load
* @throws Exception
* @param bool $bIncludeMetas Look for $sClassName also in meta declaration (PHP classes) if not found in XML classes
*
* @throws \Exception
*
* @return bool True if the class exists, false otherwise
*/
protected function ClassNameExists($sClassName)
protected function ClassNameExists($sClassName, $bIncludeMetas = false)
{
return !is_null($this->GetClass($sClassName));
return !is_null($this->GetClass($sClassName, $bIncludeMetas));
}
/**
@@ -1190,14 +1194,22 @@ EOF
{
return $this->GetNodes("/itop_design/classes//class[@id][@_created_in='$sModuleName']");
}
/**
* List all classes from the DOM
* @throws Exception
*
* @param bool $bIncludeMetas Also look for meta declaration (PHP classes) in addition to XML classes
*
* @return \DOMNodeList
*/
public function ListAllClasses()
public function ListAllClasses($bIncludeMetas = false)
{
return $this->GetNodes("/itop_design/classes//class[@id]");
$sXPath = "/itop_design/classes//class[@id]";
if($bIncludeMetas === true)
{
$sXPath .= "|/itop_design/meta/classes/class[@id]";
}
return $this->GetNodes($sXPath);
}
/**
@@ -1210,13 +1222,22 @@ EOF
}
/**
* @param $sClassName
* @param string $sClassName
* @param bool $bIncludeMetas Look for $sClassName also in meta declaration (PHP classes) if not found in XML classes
*
* @return \DOMElement
* @return null|\DOMElement
*/
public function GetClass($sClassName)
public function GetClass($sClassName, $bIncludeMetas = false)
{
// Check if class among XML classes
$oClassNode = $this->GetNodes("/itop_design/classes//class[@id='$sClassName']")->item(0);
// If not, check if class among exposed meta classes (PHP classes)
if(is_null($oClassNode) && ($bIncludeMetas === true))
{
$oClassNode = $this->GetNodes("/itop_design/meta/classes/class[@id='$sClassName']")->item(0);
}
return $oClassNode;
}
@@ -1764,6 +1785,7 @@ EOF;
/**
* MFElement: helper to read/change the DOM
* @package ModelFactory
* @property \MFDocument $ownerDocument This is only here for type hinting as iTop replaces \DOMDocument with \MFDocument
*/
class MFElement extends Combodo\iTop\DesignElement
{
@@ -2286,8 +2308,8 @@ class MFElement extends Combodo\iTop\DesignElement
{
if ($bMustExist)
{
echo "Dumping parent node<br/>\n";
$oContainer->Dump();
//echo "Dumping parent node<br/>\n";
//$oContainer->Dump();
throw new Exception(MFDocument::GetItopNodePath($this).' at line '.$this->getLineNo().": could not be found");
}
if (!$bIfExists)
@@ -2358,6 +2380,7 @@ class MFElement extends Combodo\iTop\DesignElement
case 'added':
case 'replaced':
case 'needed':
case 'forced':
// marked as added or modified, just reset the flag
$oNode->removeAttribute('_alteration');
break;