N°3882 - Move DataModel classes fields' style to theme instead of (duplicated) inline CSS

This commit is contained in:
Molkobain
2021-09-21 22:49:41 +02:00
parent 24cedbdebd
commit e2b73995e1
4 changed files with 185 additions and 89 deletions

View File

@@ -906,7 +906,8 @@ CSS;
foreach($aImportsPaths as $sPath) foreach($aImportsPaths as $sPath)
{ {
$sFilePath = $sPath.'/'.$sFileURI; $sAlterableFileURI = $sFileURI;
$sFilePath = $sPath.'/'.$sAlterableFileURI;
$sImportedFile = realpath($sFilePath); $sImportedFile = realpath($sFilePath);
if ($sImportedFile === false){ if ($sImportedFile === false){
// Handle shortcut syntax : @import "typo" ; // Handle shortcut syntax : @import "typo" ;
@@ -914,7 +915,7 @@ CSS;
$sFilePath2 = "$sFilePath.scss"; $sFilePath2 = "$sFilePath.scss";
$sImportedFile = realpath($sFilePath2); $sImportedFile = realpath($sFilePath2);
if ($sImportedFile){ if ($sImportedFile){
self::FindStylesheetFile("$sFileURI.scss", [ $sPath ], $oFindStylesheetObject, $bImports); self::FindStylesheetFile("$sAlterableFileURI.scss", [ $sPath ], $oFindStylesheetObject, $bImports);
$sImportedFile = false; $sImportedFile = false;
} }
} }
@@ -924,7 +925,7 @@ CSS;
// file matched: _typo.scss // file matched: _typo.scss
$sShortCut = substr($sFilePath, strrpos($sFilePath, '/') + 1); $sShortCut = substr($sFilePath, strrpos($sFilePath, '/') + 1);
$sFilePath = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sFilePath); $sFilePath = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sFilePath);
$sFileURI = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sFileURI); $sAlterableFileURI = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sAlterableFileURI);
$sImportedFile = realpath($sFilePath); $sImportedFile = realpath($sFilePath);
} }
@@ -932,14 +933,14 @@ CSS;
&& (!$oFindStylesheetObject->AlreadyFetched($sImportedFile))) && (!$oFindStylesheetObject->AlreadyFetched($sImportedFile)))
{ {
if ($bImports){ if ($bImports){
$oFindStylesheetObject->AddImport($sFileURI, $sImportedFile); $oFindStylesheetObject->AddImport($sAlterableFileURI, $sImportedFile);
}else{ }else{
$oFindStylesheetObject->AddStylesheet($sFileURI, $sImportedFile); $oFindStylesheetObject->AddStylesheet($sAlterableFileURI, $sImportedFile);
} }
$oFindStylesheetObject->UpdateLastModified($sImportedFile); $oFindStylesheetObject->UpdateLastModified($sImportedFile);
//Regexp matching on all included scss files : @import 'XXX.scss'; //Regexp matching on all included scss files : @import 'XXX.scss';
$sDirUri = dirname($sFileURI); $sDirUri = dirname($sAlterableFileURI);
preg_match_all('/@import \s*[\"\']([^\"\']*)\s*[\"\']\s*;/', file_get_contents($sImportedFile), $aMatches); preg_match_all('/@import \s*[\"\']([^\"\']*)\s*[\"\']\s*;/', file_get_contents($sImportedFile), $aMatches);
if ( (is_array($aMatches)) && (count($aMatches)!==0) ){ if ( (is_array($aMatches)) && (count($aMatches)!==0) ){
foreach ($aMatches[1] as $sImportedFile){ foreach ($aMatches[1] as $sImportedFile){

View File

@@ -7,7 +7,7 @@
/** /**
* Class ormStyle * Class ormStyle
* *
* @since 3.0.0 * @since 3.0
*/ */
class ormStyle class ormStyle
{ {

View File

@@ -84,6 +84,11 @@ class MFCompiler
protected $sMainPHPCode; // Code that goes into core/main.php protected $sMainPHPCode; // Code that goes into core/main.php
protected $aSnippets; protected $aSnippets;
protected $aRelations; protected $aRelations;
/**
* @var array Strings containing dynamic CSS definitions for DM classes
* @since 3.0.0
*/
protected $aClassesCSSRules;
protected $sEnvironment; protected $sEnvironment;
protected $sCompilationTimeStamp; protected $sCompilationTimeStamp;
@@ -104,6 +109,7 @@ class MFCompiler
$this->sMainPHPCode .= "define('COMPILATION_TIMESTAMP', '".$this->sCompilationTimeStamp."');\n"; $this->sMainPHPCode .= "define('COMPILATION_TIMESTAMP', '".$this->sCompilationTimeStamp."');\n";
$this->aSnippets = array(); $this->aSnippets = array();
$this->aRelations = array(); $this->aRelations = array();
$this->aClassesCSSRules = [];
} }
protected function Log($sText) protected function Log($sText)
@@ -411,9 +417,6 @@ class MFCompiler
} }
/** array of strings containing dynamic CSS class definitions */
$aClassesCss = [];
$oClasses = $this->oFactory->ListClasses($sModuleName); $oClasses = $this->oFactory->ListClasses($sModuleName);
$iClassCount = $oClasses->length; $iClassCount = $oClasses->length;
if ($iClassCount == 0) if ($iClassCount == 0)
@@ -429,7 +432,7 @@ class MFCompiler
$aAllClasses[] = $sClass; $aAllClasses[] = $sClass;
try try
{ {
$sCompiledCode .= $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $aClassesCss); $sCompiledCode .= $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir);
} }
catch (DOMFormatException $e) catch (DOMFormatException $e)
{ {
@@ -868,7 +871,17 @@ EOF
return $sPHP; return $sPHP;
} }
protected function GetPropString($oNode, $sTag, $sDefault = null) /**
* @param $oNode
* @param string $sTag
* @param string|null $sDefault
* @param bool $bAddQuotes If true, surrounds property value with single quotes and escapes existing single quotes
*
* @return string|null
*
* @since 3.0.0 Add param. $bAddQuotes to be equivalent to {@see self::GetMandatoryPropString} and allow retrieving property without surrounding single quotes
*/
protected function GetPropString($oNode, string $sTag, string $sDefault = null, bool $bAddQuotes = true)
{ {
$val = $oNode->GetChildText($sTag); $val = $oNode->GetChildText($sTag);
if (is_null($val)) if (is_null($val))
@@ -882,18 +895,23 @@ EOF
$val = $sDefault; $val = $sDefault;
} }
} }
return "'".str_replace("'", "\\'", $val)."'";
if ($bAddQuotes) {
$val = "'".str_replace("'", "\\'", $val)."'";
}
return $val;
} }
/** /**
* @param $oNode * @param $oNode
* @param $sTag * @param string $sTag
* @param bool $bAddQuotes * @param bool $bAddQuotes
* *
* @return string * @return string
* @throws \DOMFormatException * @throws \DOMFormatException
*/ */
protected function GetMandatoryPropString($oNode, $sTag, $bAddQuotes = true) protected function GetMandatoryPropString($oNode, string $sTag, bool $bAddQuotes = true)
{ {
$val = $oNode->GetChildText($sTag); $val = $oNode->GetChildText($sTag);
if (!is_null($val) && ($val !== '')) if (!is_null($val) && ($val !== ''))
@@ -1084,17 +1102,17 @@ EOF
* @param string $sTempTargetDir * @param string $sTempTargetDir
* @param string $sFinalTargetDir * @param string $sFinalTargetDir
* @param string $sModuleRelativeDir * @param string $sModuleRelativeDir
* @param array $aClassesCss Contains dynamic CSS class definitions
* *
* @return string * @return string
* @throws \DOMFormatException * @throws \DOMFormatException
*/ */
protected function CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, &$aClassesCss) protected function CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir)
{ {
$sClass = $oClass->getAttribute('id'); $sClass = $oClass->getAttribute('id');
$oProperties = $oClass->GetUniqueElement('properties'); $oProperties = $oClass->GetUniqueElement('properties');
$sPHP = ''; $sPHP = '';
$sCss = ''; // Contains dynamic CSS class definitions /** @var Contains dynamic CSS class definitions $sCss */
$sCss = '';
// Class caracteristics // Class caracteristics
// //
@@ -1426,20 +1444,37 @@ EOF
$aValues[] = $sCode; $aValues[] = $sCode;
$oStyleNode = $oValue->GetOptionalElement('style'); $oStyleNode = $oValue->GetOptionalElement('style');
if ($oStyleNode) { if ($oStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sSafeCode = utils::GetSafeId($sCode); $sSafeCode = utils::GetSafeId($sCode);
$sEnumClass = "ibo-enum--$sClass-$sAttCode-$sSafeCode"; $sEnumClass = "ibo-enum--$sClass-$sAttCode-$sSafeCode";
$sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode-$sSafeCode"; $sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode-$sSafeCode";
$sComplementaryColor = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sMainColorForOrm = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sMainColorForCss = $this->GetMandatoryPropString($oStyleNode, 'main_color', false);
$sMainColorScssVariableName = "\$$sEnumClass--main-color";
$sMainColorCssVariableName = "--$sEnumClass--main-color";
$sComplementaryColorForOrm = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sComplementaryColorForCss = $this->GetMandatoryPropString($oStyleNode, 'complementary_color', false);
$sComplementaryColorScssVariableName = "\$$sEnumClass--complementary-color";
$sComplementaryColorCssVariableName = "--$sEnumClass--complementary-color";
$sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', ''); $sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', '');
$aStyledValues[] = "'$sCode' => new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColor, $sComplementaryColor, $sDecorationClasses)";
$aStyledValues[] = "'$sCode' => new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColorForOrm, $sComplementaryColorForOrm, $sDecorationClasses)";
$sCss .= <<<CSS $sCss .= <<<CSS
$sMainColorScssVariableName: $sMainColorForCss !default;
$sComplementaryColorScssVariableName: $sComplementaryColorForCss !default;
:root {
$sMainColorCssVariableName: #{{$sMainColorScssVariableName}};
$sComplementaryColorCssVariableName: #{{$sComplementaryColorScssVariableName}};
}
.$sEnumClass { .$sEnumClass {
color: $sComplementaryColor; --ibo-main-color: $sMainColorScssVariableName;
background-color: $sMainColor; --ibo-complementary-color: $sComplementaryColorScssVariableName;
} }
.$sEnumClassAlt { .$sEnumClassAlt {
color: $sMainColor; --ibo-main-color: $sComplementaryColorScssVariableName;
--ibo-complementary-color: $sMainColorScssVariableName;
} }
CSS; CSS;
@@ -1451,21 +1486,38 @@ CSS;
$sStyledValues = "[".implode(',', $aStyledValues)."]"; $sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues"; $aParameters['styled_values'] = "$sStyledValues";
} }
$oStyleNode = $oField->GetOptionalElement('default_style'); $oDefaultStyleNode = $oField->GetOptionalElement('default_style');
if ($oStyleNode) { if ($oDefaultStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sEnumClass = "ibo-enum--$sClass-$sAttCode"; $sEnumClass = "ibo-enum--$sClass-$sAttCode";
$sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode"; $sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode";
$sComplementaryColor = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', ''); $sMainColorForOrm = $this->GetMandatoryPropString($oDefaultStyleNode, 'main_color');
$aParameters['default_style'] = "new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColor, $sComplementaryColor, $sDecorationClasses)"; $sMainColorForCss = $this->GetMandatoryPropString($oDefaultStyleNode, 'main_color', false);
$sMainColorScssVariableName = "\$$sEnumClass--main-color";
$sMainColorCssVariableName = "--$sEnumClass--main-color";
$sComplementaryColorForOrm = $this->GetMandatoryPropString($oDefaultStyleNode, 'complementary_color');
$sComplementaryColorForCss = $this->GetMandatoryPropString($oDefaultStyleNode, 'complementary_color', false);
$sComplementaryColorScssVariableName = "\$$sEnumClass--complementary-color";
$sComplementaryColorCssVariableName = "--$sEnumClass--complementary-color";
$sDecorationClasses = $this->GetPropString($oDefaultStyleNode, 'decoration_classes', '');
$aParameters['default_style'] = "new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColorForOrm, $sComplementaryColorForOrm, $sDecorationClasses)";
$sCss .= <<<CSS $sCss .= <<<CSS
$sMainColorScssVariableName: $sMainColorForCss !default;
$sComplementaryColorScssVariableName: $sComplementaryColorForCss !default;
:root {
$sMainColorCssVariableName: #{{$sMainColorScssVariableName}};
$sComplementaryColorCssVariableName: #{{$sComplementaryColorScssVariableName}};
}
.$sEnumClass { .$sEnumClass {
color: $sComplementaryColor; --ibo-main-color: $sMainColorScssVariableName;
background-color: $sMainColor; --ibo-complementary-color: $sComplementaryColorScssVariableName;
} }
.$sEnumClassAlt { .$sEnumClassAlt {
color: $sMainColor; --ibo-main-color: $sComplementaryColorScssVariableName;
--ibo-complementary-color: $sMainColorScssVariableName;
} }
CSS; CSS;
@@ -1488,20 +1540,37 @@ CSS;
$aValues[] = $sCode; $aValues[] = $sCode;
$oStyleNode = $oValue->GetOptionalElement('style'); $oStyleNode = $oValue->GetOptionalElement('style');
if ($oStyleNode) { if ($oStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sSafeCode = utils::GetSafeId($sCode); $sSafeCode = utils::GetSafeId($sCode);
$sEnumClass = "ibo-enum--$sClass-$sAttCode-$sSafeCode"; $sEnumClass = "ibo-enum--$sClass-$sAttCode-$sSafeCode";
$sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode-$sSafeCode"; $sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode-$sSafeCode";
$sComplementaryColor = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sMainColorForOrm = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sMainColorForCss = $this->GetMandatoryPropString($oStyleNode, 'main_color', false);
$sMainColorScssVariableName = "\$$sEnumClass--main-color";
$sMainColorCssVariableName = "--$sEnumClass--main-color";
$sComplementaryColorForOrm = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sComplementaryColorForCss = $this->GetMandatoryPropString($oStyleNode, 'complementary_color', false);
$sComplementaryColorScssVariableName = "\$$sEnumClass--complementary-color";
$sComplementaryColorCssVariableName = "--$sEnumClass--complementary-color";
$sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', ''); $sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', '');
$aStyledValues[] = "'$sCode' => new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColor, $sComplementaryColor, $sDecorationClasses)";
$aStyledValues[] = "'$sCode' => new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColorForOrm, $sComplementaryColorForOrm, $sDecorationClasses)";
$sCss .= <<<CSS $sCss .= <<<CSS
$sMainColorScssVariableName: $sMainColorForCss !default;
$sComplementaryColorScssVariableName: $sComplementaryColorForCss !default;
:root {
$sMainColorCssVariableName: #{{$sMainColorScssVariableName}};
$sComplementaryColorCssVariableName: #{{$sComplementaryColorScssVariableName}};
}
.$sEnumClass { .$sEnumClass {
color: $sComplementaryColor; --ibo-main-color: $sMainColorScssVariableName;
background-color: $sMainColor; --ibo-complementary-color: $sComplementaryColorScssVariableName;
} }
.$sEnumClassAlt { .$sEnumClassAlt {
color: $sMainColor; --ibo-main-color: $sComplementaryColorScssVariableName;
--ibo-complementary-color: $sMainColorScssVariableName;
} }
CSS; CSS;
@@ -1513,21 +1582,38 @@ CSS;
$sStyledValues = "[".implode(',', $aStyledValues)."]"; $sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues"; $aParameters['styled_values'] = "$sStyledValues";
} }
$oStyleNode = $oField->GetOptionalElement('default_style'); $oDefaultStyleNode = $oField->GetOptionalElement('default_style');
if ($oStyleNode) { if ($oDefaultStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');
$sEnumClass = "ibo-enum--$sClass-$sAttCode"; $sEnumClass = "ibo-enum--$sClass-$sAttCode";
$sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode"; $sEnumClassAlt = "ibo-enum-alt--$sClass-$sAttCode";
$sComplementaryColor = $this->GetMandatoryPropString($oStyleNode, 'complementary_color');
$sDecorationClasses = $this->GetPropString($oStyleNode, 'decoration_classes', ''); $sMainColorForOrm = $this->GetMandatoryPropString($oDefaultStyleNode, 'main_color');
$aParameters['default_style'] = "new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColor, $sComplementaryColor, $sDecorationClasses)"; $sMainColorForCss = $this->GetMandatoryPropString($oDefaultStyleNode, 'main_color', false);
$sMainColorScssVariableName = "\$$sEnumClass--main-color";
$sMainColorCssVariableName = "--$sEnumClass--main-color";
$sComplementaryColorForOrm = $this->GetMandatoryPropString($oDefaultStyleNode, 'complementary_color');
$sComplementaryColorForCss = $this->GetMandatoryPropString($oDefaultStyleNode, 'complementary_color', false);
$sComplementaryColorScssVariableName = "\$$sEnumClass--complementary-color";
$sComplementaryColorCssVariableName = "--$sEnumClass--complementary-color";
$sDecorationClasses = $this->GetPropString($oDefaultStyleNode, 'decoration_classes', '');
$aParameters['default_style'] = "new ormStyle('$sEnumClass', '$sEnumClassAlt', $sMainColorForOrm, $sComplementaryColorForOrm, $sDecorationClasses)";
$sCss .= <<<CSS $sCss .= <<<CSS
$sMainColorScssVariableName: $sMainColorForCss !default;
$sComplementaryColorScssVariableName: $sComplementaryColorForCss !default;
:root {
$sMainColorCssVariableName: #{{$sMainColorScssVariableName}};
$sComplementaryColorCssVariableName: #{{$sComplementaryColorScssVariableName}};
}
.$sEnumClass { .$sEnumClass {
color: $sComplementaryColor; --ibo-main-color: $sMainColorScssVariableName;
background-color: $sMainColor; --ibo-complementary-color: $sComplementaryColorScssVariableName;
} }
.$sEnumClassAlt { .$sEnumClassAlt {
color: $sMainColor; --ibo-main-color: $sComplementaryColorScssVariableName;
--ibo-complementary-color: $sMainColorScssVariableName;
} }
CSS; CSS;
@@ -1593,17 +1679,17 @@ CSS;
$aStates[] = '"'.$oState->GetAttribute('id').'"'; $aStates[] = '"'.$oState->GetAttribute('id').'"';
} }
$aParameters['states'] = 'array('.implode(', ', $aStates).')'; $aParameters['states'] = 'array('.implode(', ', $aStates).')';
$aParameters['goal_computing'] = $this->GetPropString($oField, 'goal', 'DefaultMetricComputer'); // Optional, no deadline by default $aParameters['goal_computing'] = $this->GetPropString($oField, 'goal', 'DefaultMetricComputer'); // Optional, no deadline by default
$aParameters['working_time_computing'] = $this->GetPropString($oField, 'working_time', ''); // Blank (different than DefaultWorkingTimeComputer) $aParameters['working_time_computing'] = $this->GetPropString($oField, 'working_time', ''); // Blank (different than DefaultWorkingTimeComputer)
$oThresholds = $oField->GetUniqueElement('thresholds'); $oThresholds = $oField->GetUniqueElement('thresholds');
$oThresholdNodes = $oThresholds->getElementsByTagName('threshold'); $oThresholdNodes = $oThresholds->getElementsByTagName('threshold');
$aThresholds = array(); $aThresholds = array();
foreach($oThresholdNodes as $oThreshold) foreach($oThresholdNodes as $oThreshold)
{ {
$iPercent = (int)$oThreshold->getAttribute('id'); $iPercent = (int)$oThreshold->getAttribute('id');
$oHighlight = $oThreshold->GetUniqueElement('highlight', false); $oHighlight = $oThreshold->GetUniqueElement('highlight', false);
$sHighlight = ''; $sHighlight = '';
if($oHighlight) if($oHighlight)
@@ -1612,7 +1698,7 @@ CSS;
$sPersistent = $this->GetPropBoolean($oHighlight, 'persistent', false); $sPersistent = $this->GetPropBoolean($oHighlight, 'persistent', false);
$sHighlight = "'highlight' => array('code' => '$sCode', 'persistent' => $sPersistent), "; $sHighlight = "'highlight' => array('code' => '$sCode', 'persistent' => $sPersistent), ";
} }
$oActions = $oThreshold->GetUniqueElement('actions'); $oActions = $oThreshold->GetUniqueElement('actions');
$oActionNodes = $oActions->getElementsByTagName('action'); $oActionNodes = $oActions->getElementsByTagName('action');
$aActions = array(); $aActions = array();
@@ -1781,7 +1867,7 @@ CSS;
{ {
$aParameters['tracking_level'] = $this->TrackingLevelToPHP($sAttType, $sTrackingLevel); $aParameters['tracking_level'] = $this->TrackingLevelToPHP($sAttType, $sTrackingLevel);
} }
$aParams = array(); $aParams = array();
foreach($aParameters as $sKey => $sValue) foreach($aParameters as $sKey => $sValue)
{ {
@@ -1795,10 +1881,10 @@ CSS;
} }
catch(Exception $e) catch(Exception $e)
{ {
throw new DOMFormatException("Field: '$sAttCode', (type: $sAttType), ".$e->getMessage()); throw new DOMFormatException("Field: '$sAttCode', (type: $sAttType), ".$e->getMessage());
} }
} }
// Lifecycle // Lifecycle
// //
$sLifecycle = ''; $sLifecycle = '';
@@ -1807,13 +1893,13 @@ CSS;
if ($oLifecycle) { if ($oLifecycle) {
$sLifecycle .= "\t\t// Lifecycle (status attribute: $sStateAttCode)\n"; $sLifecycle .= "\t\t// Lifecycle (status attribute: $sStateAttCode)\n";
$sLifecycle .= "\t\t//\n"; $sLifecycle .= "\t\t//\n";
$oStimuli = $oLifecycle->GetUniqueElement('stimuli'); $oStimuli = $oLifecycle->GetUniqueElement('stimuli');
foreach ($oStimuli->getElementsByTagName('stimulus') as $oStimulus) foreach ($oStimuli->getElementsByTagName('stimulus') as $oStimulus)
{ {
$sStimulus = $oStimulus->getAttribute('id'); $sStimulus = $oStimulus->getAttribute('id');
$sStimulusClass = $oStimulus->getAttribute('xsi:type'); $sStimulusClass = $oStimulus->getAttribute('xsi:type');
$sLifecycle .= " MetaModel::Init_DefineStimulus(new ".$sStimulusClass."(\"".$sStimulus."\", array()));\n"; $sLifecycle .= " MetaModel::Init_DefineStimulus(new ".$sStimulusClass."(\"".$sStimulus."\", array()));\n";
} }
$oHighlightScale = $oLifecycle->GetUniqueElement('highlight_scale', false); $oHighlightScale = $oLifecycle->GetUniqueElement('highlight_scale', false);
@@ -1821,9 +1907,9 @@ CSS;
{ {
$sHighlightScale = "\t\t// Higlight Scale\n"; $sHighlightScale = "\t\t// Higlight Scale\n";
$sHighlightScale .= " MetaModel::Init_DefineHighlightScale( array(\n"; $sHighlightScale .= " MetaModel::Init_DefineHighlightScale( array(\n";
$this->CompileFiles($oHighlightScale, $sTempTargetDir.'/'.$sModuleRelativeDir, $sFinalTargetDir.'/'.$sModuleRelativeDir, ''); $this->CompileFiles($oHighlightScale, $sTempTargetDir.'/'.$sModuleRelativeDir, $sFinalTargetDir.'/'.$sModuleRelativeDir, '');
foreach ($oHighlightScale->getElementsByTagName('item') as $oItem) foreach ($oHighlightScale->getElementsByTagName('item') as $oItem)
{ {
$sItemCode = $oItem->getAttribute('id'); $sItemCode = $oItem->getAttribute('id');
@@ -1845,32 +1931,32 @@ CSS;
case 'HIGHLIGHT_CLASS_CRITICAL': case 'HIGHLIGHT_CLASS_CRITICAL':
$sColor = 'HILIGHT_CLASS_CRITICAL'; $sColor = 'HILIGHT_CLASS_CRITICAL';
break; break;
case 'HILIGHT_CLASS_OK': case 'HILIGHT_CLASS_OK':
case 'HIGHLIGHT_CLASS_OK': case 'HIGHLIGHT_CLASS_OK':
$sColor = 'HILIGHT_CLASS_OK'; $sColor = 'HILIGHT_CLASS_OK';
break; break;
case 'HIGHLIGHT_CLASS_WARNING': case 'HIGHLIGHT_CLASS_WARNING':
case 'HILIGHT_CLASS_WARNING': case 'HILIGHT_CLASS_WARNING':
$sColor = 'HILIGHT_CLASS_WARNING'; $sColor = 'HILIGHT_CLASS_WARNING';
break; break;
case 'HIGHLIGHT_CLASS_NONE': case 'HIGHLIGHT_CLASS_NONE':
case 'HILIGHT_CLASS_NONE': case 'HILIGHT_CLASS_NONE':
$sColor = 'HILIGHT_CLASS_NONE'; $sColor = 'HILIGHT_CLASS_NONE';
break; break;
default: default:
// Future extension, specify your own color?? // Future extension, specify your own color??
$sColor = "'".addslashes($sColor)."'"; $sColor = "'".addslashes($sColor)."'";
} }
$sHighlightScale .= " '$sItemCode' => array('rank' => $fRank, 'color' => $sColor, 'icon' => $sIcon),\n"; $sHighlightScale .= " '$sItemCode' => array('rank' => $fRank, 'color' => $sColor, 'icon' => $sIcon),\n";
} }
$sHighlightScale .= " ));\n"; $sHighlightScale .= " ));\n";
} }
$oStates = $oLifecycle->GetUniqueElement('states'); $oStates = $oLifecycle->GetUniqueElement('states');
$aStatesDependencies = array(); $aStatesDependencies = array();
$aStates = array(); $aStates = array();
@@ -1946,9 +2032,9 @@ CSS;
{ {
$sLifecycle .= " 'highlight' => array('code' => '$sCode'),\n"; $sLifecycle .= " 'highlight' => array('code' => '$sCode'),\n";
} }
} }
$sLifecycle .= " \"attribute_list\" => array(\n"; $sLifecycle .= " \"attribute_list\" => array(\n";
$oFlags = $oState->GetUniqueElement('flags'); $oFlags = $oState->GetUniqueElement('flags');
@@ -1969,13 +2055,13 @@ CSS;
} }
$sLifecycle .= " )\n"; $sLifecycle .= " )\n";
$sLifecycle .= " );\n"; $sLifecycle .= " );\n";
$oTransitions = $oState->GetUniqueElement('transitions'); $oTransitions = $oState->GetUniqueElement('transitions');
foreach ($oTransitions->getElementsByTagName('transition') as $oTransition) foreach ($oTransitions->getElementsByTagName('transition') as $oTransition)
{ {
$sStimulus = $oTransition->getAttribute('id'); $sStimulus = $oTransition->getAttribute('id');
$sTargetState = $oTransition->GetChildText('target'); $sTargetState = $oTransition->GetChildText('target');
$oActions = $oTransition->GetUniqueElement('actions'); $oActions = $oTransition->GetUniqueElement('actions');
$aVerbs = array(); $aVerbs = array();
foreach ($oActions->getElementsByTagName('action') as $oAction) foreach ($oActions->getElementsByTagName('action') as $oAction)
@@ -2051,7 +2137,7 @@ CSS;
$sLifecycle .= " );\n"; $sLifecycle .= " );\n";
} }
} }
// ZLists // ZLists
// //
$aListRef = array( $aListRef = array(
@@ -2060,7 +2146,7 @@ CSS;
'default_search' => 'default_search', 'default_search' => 'default_search',
'list' => 'list', 'list' => 'list',
); );
$oPresentation = $oClass->GetUniqueElement('presentation'); $oPresentation = $oClass->GetUniqueElement('presentation');
$sZlists = ''; $sZlists = '';
foreach ($aListRef as $sListCode => $sListTag) foreach ($aListRef as $sListCode => $sListTag)
@@ -2074,12 +2160,12 @@ CSS;
$aAttributes = array(); $aAttributes = array();
} }
$this->ArrayOfItemsToZList($aAttributes); $this->ArrayOfItemsToZList($aAttributes);
$sZAttributes = var_export($aAttributes, true); $sZAttributes = var_export($aAttributes, true);
$sZlists .= " MetaModel::Init_SetZListItems('$sListCode', $sZAttributes);\n"; $sZlists .= " MetaModel::Init_SetZListItems('$sListCode', $sZAttributes);\n";
} }
} }
// Methods // Methods
$sMethods = ""; $sMethods = "";
$oMethods = $oClass->GetUniqueElement('methods'); $oMethods = $oClass->GetUniqueElement('methods');
@@ -2093,7 +2179,7 @@ CSS;
else else
{ {
$sMethods .= "\n\n".$sMethodCode."\n"; $sMethods .= "\n\n".$sMethodCode."\n";
} }
} }
// Relations // Relations
@@ -2247,7 +2333,12 @@ EOF
} }
} }
$aClassesCss[] = $sCss; if (strlen($sCss) > 0) {
if (array_key_exists($sClass, $this->aClassesCSSRules) === false) {
$this->aClassesCSSRules[$sClass] = '';
}
$this->aClassesCSSRules[$sClass] .= $sCss;
}
return $sPHP; return $sPHP;
} }
@@ -2884,12 +2975,20 @@ EOF;
); );
// Build compiled themes folder // Build compiled themes folder
$sThemesDir = $sTempTargetDir.'branding/themes/'; $sThemesRelDirPath = 'branding/themes/';
if(!is_dir($sThemesDir)) $sThemesAbsDirPath = $sTempTargetDir.$sThemesRelDirPath;
if(!is_dir($sThemesAbsDirPath))
{ {
SetupUtils::builddir($sThemesDir); SetupUtils::builddir($sThemesAbsDirPath);
} }
// Prepare DM CSS rules for inclusion
$sDmStylesheetFilename = 'datamodel-scss-rules.scss';
$sDmStylesheetContent = implode("\n", $this->aClassesCSSRules);
// Here we use a hash instead of the current timestamp because the former changes when running unit tests
$sDmStylesheetId = 'datamodel-scss-rules-'.md5($sDmStylesheetContent);
$this->WriteFile($sThemesAbsDirPath.$sDmStylesheetFilename, $sDmStylesheetContent);
// Parsing themes from DM // Parsing themes from DM
$aThemes = array(); $aThemes = array();
/** @var \DOMNodeList $oThemeNodes */ /** @var \DOMNodeList $oThemeNodes */
@@ -2925,6 +3024,8 @@ EOF;
} }
} }
// Stylesheets
// - Manually added in the XML
/** @var \DOMNodeList $oStylesheets */ /** @var \DOMNodeList $oStylesheets */
$oStylesheets = $oTheme->GetNodes('stylesheets/stylesheet'); $oStylesheets = $oTheme->GetNodes('stylesheets/stylesheet');
foreach($oStylesheets as $oStylesheet) foreach($oStylesheets as $oStylesheet)
@@ -2933,6 +3034,9 @@ EOF;
$aThemeParameters['stylesheets'][$sStylesheetId] = $oStylesheet->GetText(); $aThemeParameters['stylesheets'][$sStylesheetId] = $oStylesheet->GetText();
} }
// - Computed from the DM
$aThemeParameters['stylesheets'][$sDmStylesheetId] = $sThemesRelDirPath.$sDmStylesheetFilename;
$aThemes[$sThemeId] = [ $aThemes[$sThemeId] = [
'theme_parameters' => $aThemeParameters, 'theme_parameters' => $aThemeParameters,
'precompiled_stylesheet' => $oTheme->GetChildText('precompiled_stylesheet', '') 'precompiled_stylesheet' => $oTheme->GetChildText('precompiled_stylesheet', '')
@@ -2943,6 +3047,7 @@ EOF;
if(empty($aThemes)) if(empty($aThemes))
{ {
$aDefaultThemeInfo = ThemeHandler::GetDefaultThemeInformation(); $aDefaultThemeInfo = ThemeHandler::GetDefaultThemeInformation();
$aDefaultThemeInfo['parameters']['stylesheets'][$sDmStylesheetId] = $sThemesRelDirPath.$sDmStylesheetFilename;
$aThemes[$aDefaultThemeInfo['name']] = $aDefaultThemeInfo['parameters']; $aThemes[$aDefaultThemeInfo['name']] = $aDefaultThemeInfo['parameters'];
} }
@@ -2958,7 +3063,7 @@ EOF;
$aThemeParameters = $aThemeInfos['theme_parameters']; $aThemeParameters = $aThemeInfos['theme_parameters'];
$sPrecompiledStylesheet = $aThemeInfos['precompiled_stylesheet']; $sPrecompiledStylesheet = $aThemeInfos['precompiled_stylesheet'];
$sThemeDir = $sThemesDir.$sThemeId; $sThemeDir = $sThemesAbsDirPath.$sThemeId;
if(!is_dir($sThemeDir)) if(!is_dir($sThemeDir))
{ {
SetupUtils::builddir($sThemeDir); SetupUtils::builddir($sThemeDir);

View File

@@ -38,16 +38,6 @@ class FieldBadgeUIBlockFactory extends AbstractUIBlockFactory
$sHtml .= "<span class=\"ibo-field-badge--decoration\"><i class=\"$sDecorationClasses\"></i></span>"; $sHtml .= "<span class=\"ibo-field-badge--decoration\"><i class=\"$sDecorationClasses\"></i></span>";
} }
$sHtml .= "<span class=\"ibo-field-badge--label\">$sValue</span>"; $sHtml .= "<span class=\"ibo-field-badge--label\">$sValue</span>";
// Add custom style
// TODO 3.0 To be removed when compilation supports generated CSS
$sHtml .= <<<HTML
<style>
.$sStyleClass {
color: $sComplementaryColor;
background-color: $sPrimaryColor;
}
</style>
HTML;
} }
} }
if (!$oBadge) { if (!$oBadge) {