From b5d9e5a8b6608672e2c6750cd56f43b14b2b5215 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Mon, 14 Oct 2013 13:22:52 +0000 Subject: [PATCH] #773 Display boolean values from the stop watches as yes/no (localized, like enums) + took the opportunity to enable the export in spreadsheet format SVN:trunk[2899] --- core/attributedef.class.inc.php | 165 ++++++++++++++++++++-- dictionaries/de.dictionary.itop.ui.php | 2 + dictionaries/dictionary.itop.ui.php | 2 + dictionaries/es_cr.dictionary.itop.ui.php | 2 + dictionaries/fr.dictionary.itop.ui.php | 10 +- dictionaries/hu.dictionary.itop.ui.php | 2 + dictionaries/it.dictionary.itop.ui.php | 2 + dictionaries/ja.dictionary.itop.ui.php | 2 + dictionaries/pt_br.dictionary.itop.ui.php | 2 + dictionaries/ru.dictionary.itop.ui.php | 2 + dictionaries/tr.dictionary.itop.ui.php | 2 + dictionaries/zh.dictionary.itop.ui.php | 2 + 12 files changed, 180 insertions(+), 15 deletions(-) diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index 178ba862e..796c9a7ae 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -2568,7 +2568,7 @@ class AttributeDateTime extends AttributeDBField $sFrom = array("\r\n", $sTextQualifier); $sTo = array("\n", $sTextQualifier.$sTextQualifier); $sEscaped = str_replace($sFrom, $sTo, (string)$sValue); - return '"'.$sEscaped.'"'; + return $sTextQualifier.$sEscaped.$sTextQualifier; } /** @@ -3833,6 +3833,12 @@ class AttributeStopWatch extends AttributeDefinition throw new CoreException("Unknown item code '$sItemCode' for attribute ".$this->GetHostClass().'::'.$this->GetCode()); } + protected function GetBooleanLabel($bValue) + { + $sDictKey = $bValue ? 'yes' : 'no'; + return Dict::S('BooleanLabel:'.$sDictKey, 'def:'.$sDictKey); + } + public function GetSubItemAsHTMLForHistory($sItemCode, $sOldValue, $sNewValue, $sLabel) { switch($sItemCode) @@ -3863,12 +3869,12 @@ class AttributeStopWatch extends AttributeDefinition $sHtmlNew = (int)$sNewValue ? date(self::GetDateFormat(true /*full*/), (int)$sNewValue) : null; break; case 'passed': - $sHtmlOld = (int)$sOldValue ? '1' : '0'; - $sHtmlNew = (int)$sNewValue ? '1' : '0'; + $sHtmlOld = $this->GetBooleanLabel((int)$sOldValue); + $sHtmlNew = $this->GetBooleanLabel((int)$sNewValue); break; case 'triggered': - $sHtmlOld = (int)$sOldValue ? '1' : '0'; - $sHtmlNew = (int)$sNewValue ? '1' : '0'; + $sHtmlOld = $this->GetBooleanLabel((int)$sOldValue); + $sHtmlNew = $this->GetBooleanLabel((int)$sNewValue); break; case 'overrun': $sHtmlOld = (int)$sOldValue > 0 ? AttributeDuration::FormatDuration((int)$sOldValue) : ''; @@ -3937,10 +3943,8 @@ class AttributeStopWatch extends AttributeDefinition } break; case 'passed': - $sHtml = $value ? '1' : '0'; - break; case 'triggered': - $sHtml = $value ? '1' : '0'; + $sHtml = $this->GetBooleanLabel($value); break; case 'overrun': $sHtml = Str::pure2html(AttributeDuration::FormatDuration($value)); @@ -3954,12 +3958,141 @@ class AttributeStopWatch extends AttributeDefinition public function GetSubItemAsCSV($sItemCode, $value, $sSeparator = ',', $sTextQualifier = '"') { - return $value; + $sFrom = array("\r\n", $sTextQualifier); + $sTo = array("\n", $sTextQualifier.$sTextQualifier); + $sEscaped = str_replace($sFrom, $sTo, (string)$value); + $sRet = $sTextQualifier.$sEscaped.$sTextQualifier; + + switch($sItemCode) + { + case 'timespent': + case 'started': + case 'laststart': + case 'stopped': + break; + + default: + foreach ($this->ListThresholds() as $iThreshold => $aFoo) + { + $sThPrefix = $iThreshold.'_'; + if (substr($sItemCode, 0, strlen($sThPrefix)) == $sThPrefix) + { + // The current threshold is concerned + $sThresholdCode = substr($sItemCode, strlen($sThPrefix)); + switch($sThresholdCode) + { + case 'deadline': + break; + + case 'passed': + case 'triggered': + $sRet = $sTextQualifier.$this->GetBooleanLabel($value).$sTextQualifier; + break; + + case 'overrun': + break; + } + } + } + } + return $sRet; } public function GetSubItemAsXML($sItemCode, $value) { - return Str::pure2xml((string)$value); + $sRet = Str::pure2xml((string)$value); + + switch($sItemCode) + { + case 'timespent': + case 'started': + case 'laststart': + case 'stopped': + break; + + default: + foreach ($this->ListThresholds() as $iThreshold => $aFoo) + { + $sThPrefix = $iThreshold.'_'; + if (substr($sItemCode, 0, strlen($sThPrefix)) == $sThPrefix) + { + // The current threshold is concerned + $sThresholdCode = substr($sItemCode, strlen($sThPrefix)); + switch($sThresholdCode) + { + case 'deadline': + break; + + case 'passed': + case 'triggered': + $sRet = $this->GetBooleanLabel($value); + break; + + case 'overrun': + break; + } + } + } + } + return $sRet; + } + + /** + * Implemented for the HTML spreadsheet format! + */ + public function GetSubItemAsEditValue($sItemCode, $value) + { + $sRet = $value; + + switch($sItemCode) + { + case 'timespent': + break; + + case 'started': + case 'laststart': + case 'stopped': + if (is_null($value)) + { + $sRet = ''; // Undefined + } + else + { + $sRet = date(self::GetDateFormat(), $value); + } + break; + + default: + foreach ($this->ListThresholds() as $iThreshold => $aFoo) + { + $sThPrefix = $iThreshold.'_'; + if (substr($sItemCode, 0, strlen($sThPrefix)) == $sThPrefix) + { + // The current threshold is concerned + $sThresholdCode = substr($sItemCode, strlen($sThPrefix)); + switch($sThresholdCode) + { + case 'deadline': + if ($value) + { + $sRet = date(self::GetDateFormat(true /*full*/), $value); + } + else + { + $sRet = ''; + } + break; + case 'passed': + case 'triggered': + $sRet = $this->GetBooleanLabel($value); + break; + case 'overrun': + break; + } + } + } + } + return $sRet; } } @@ -4069,7 +4202,7 @@ class AttributeSubItem extends AttributeDefinition public function GetAsCSV($value, $sSeparator = ',', $sTextQualifier = '"', $oHostObject = null, $bLocalize = true) { $oParent = $this->GetTargetAttDef(); - $res = $oParent->GetSubItemAsCSV($this->Get('item_code'), $value, $sSeparator = ',', $sTextQualifier = '"'); + $res = $oParent->GetSubItemAsCSV($this->Get('item_code'), $value, $sSeparator, $sTextQualifier); return $res; } @@ -4088,6 +4221,16 @@ class AttributeSubItem extends AttributeDefinition $sValue = $oParent->GetSubItemAsHTMLForHistory($this->Get('item_code'), $sOldValue, $sNewValue, $sLabel); return $sValue; } + + /** + * As of now, this function must be implemented to have the value in spreadsheet format + */ + public function GetEditValue($value, $oHostObj = null) + { + $oParent = $this->GetTargetAttDef(); + $res = $oParent->GetSubItemAsEditValue($this->Get('item_code'), $value); + return $res; + } } /** diff --git a/dictionaries/de.dictionary.itop.ui.php b/dictionaries/de.dictionary.itop.ui.php index 33168c6bf..e5331438c 100644 --- a/dictionaries/de.dictionary.itop.ui.php +++ b/dictionaries/de.dictionary.itop.ui.php @@ -194,6 +194,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array( 'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'Aktion gewähren', 'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribut', 'Class:URP_AttributeGrant/Attribute:attcode+' => 'Attribut-Code', + 'BooleanLabel:yes' => 'Ja', + 'BooleanLabel:no' => 'Nein', 'Menu:WelcomeMenu' => 'Willkommen', 'Menu:WelcomeMenu+' => 'Willkommen bei iTop', 'Menu:WelcomeMenuPage' => 'Willkommen', diff --git a/dictionaries/dictionary.itop.ui.php b/dictionaries/dictionary.itop.ui.php index 55af72996..c210ff77b 100644 --- a/dictionaries/dictionary.itop.ui.php +++ b/dictionaries/dictionary.itop.ui.php @@ -309,6 +309,8 @@ Dict::Add('EN US', 'English', 'English', array( // Dict::Add('EN US', 'English', 'English', array( + 'BooleanLabel:yes' => 'yes', + 'BooleanLabel:no' => 'no', 'Menu:WelcomeMenu' => 'Welcome', 'Menu:WelcomeMenu+' => 'Welcome to iTop', 'Menu:WelcomeMenuPage' => 'Welcome', diff --git a/dictionaries/es_cr.dictionary.itop.ui.php b/dictionaries/es_cr.dictionary.itop.ui.php index 57d8b8f9d..9c976ea58 100644 --- a/dictionaries/es_cr.dictionary.itop.ui.php +++ b/dictionaries/es_cr.dictionary.itop.ui.php @@ -309,6 +309,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( // Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( + 'BooleanLabel:yes' => 'si', + 'BooleanLabel:no' => 'no', 'Menu:WelcomeMenu' => 'Bienvenido', 'Menu:WelcomeMenu+' => 'Bienvenido a iTop', 'Menu:WelcomeMenuPage' => 'Bienvenido', diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index 34404fdae..625dc97c6 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -104,10 +104,10 @@ Dict::Add('FR FR', 'French', 'Français', array( 'Class:URP_ActionGrant/Attribute:class+' => 'Target class', 'Class:URP_ActionGrant/Attribute:permission' => 'Permission', 'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?', - 'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no', - 'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no', - 'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes', - 'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes', + 'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'non', + 'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'non', + 'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'oui', + 'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'oui', 'Class:URP_ActionGrant/Attribute:action' => 'Action', 'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class', 'Class:URP_StimulusGrant' => 'stimulus_permission', @@ -192,6 +192,8 @@ Dict::Add('FR FR', 'French', 'Français', array( 'Class:URP_ClassProjection/Attribute:value+' => 'OQL expression (using $this) | constant | | +attribute code', 'Class:URP_ClassProjection/Attribute:attribute' => 'Attribute', 'Class:URP_ClassProjection/Attribute:attribute+' => 'Target attribute code (optional)', + 'BooleanLabel:yes' => 'oui', + 'BooleanLabel:no' => 'non', 'Menu:WelcomeMenu' => 'Bienvenue', 'Menu:WelcomeMenu+' => 'Bienvenue dans iTop', 'Menu:WelcomeMenuPage' => 'Bienvenue', diff --git a/dictionaries/hu.dictionary.itop.ui.php b/dictionaries/hu.dictionary.itop.ui.php index a5ad7de6f..6b68caab5 100755 --- a/dictionaries/hu.dictionary.itop.ui.php +++ b/dictionaries/hu.dictionary.itop.ui.php @@ -182,6 +182,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array( 'Class:URP_ActionGrant/Attribute:profile+' => '', 'Class:URP_StimulusGrant/Attribute:profile' => 'Profil', 'Class:URP_StimulusGrant/Attribute:profile+' => '', + 'BooleanLabel:yes' => 'Igen', + 'BooleanLabel:no' => 'Nem', 'Menu:WelcomeMenu' => 'Üdvözlöm', 'Menu:WelcomeMenu+' => '', 'Menu:WelcomeMenuPage' => 'Üdvözlöm', diff --git a/dictionaries/it.dictionary.itop.ui.php b/dictionaries/it.dictionary.itop.ui.php index 9c024b8ce..430743ed6 100644 --- a/dictionaries/it.dictionary.itop.ui.php +++ b/dictionaries/it.dictionary.itop.ui.php @@ -311,6 +311,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array( // Dict::Add('IT IT', 'Italian', 'Italiano', array( + 'BooleanLabel:yes' => 'si', + 'BooleanLabel:no' => 'no', 'Menu:WelcomeMenu' => 'Benveuto', 'Menu:WelcomeMenu+' => '', 'Menu:WelcomeMenuPage' => 'Benvenuto', diff --git a/dictionaries/ja.dictionary.itop.ui.php b/dictionaries/ja.dictionary.itop.ui.php index ec2c15748..2bfcd3d2f 100644 --- a/dictionaries/ja.dictionary.itop.ui.php +++ b/dictionaries/ja.dictionary.itop.ui.php @@ -196,6 +196,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array( 'Class:URP_AttributeGrant/Attribute:actiongrantid+' => '実行権限', 'Class:URP_AttributeGrant/Attribute:attcode' => '属性', 'Class:URP_AttributeGrant/Attribute:attcode+' => '属性コード', + 'BooleanLabel:yes' => 'はい', + 'BooleanLabel:no' => 'いいえ', 'Menu:WelcomeMenu' => 'ようこそ', 'Menu:WelcomeMenu+' => 'ようこそ、iTopへ', 'Menu:WelcomeMenuPage' => 'ようこそ', diff --git a/dictionaries/pt_br.dictionary.itop.ui.php b/dictionaries/pt_br.dictionary.itop.ui.php index 400eb367d..dace270f8 100644 --- a/dictionaries/pt_br.dictionary.itop.ui.php +++ b/dictionaries/pt_br.dictionary.itop.ui.php @@ -306,6 +306,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( // Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( + 'BooleanLabel:yes' => 'sim', + 'BooleanLabel:no' => 'naõ', 'Menu:WelcomeMenu' => 'Bem-vindo', 'Menu:WelcomeMenu+' => 'Bem-vindo ao iTop', 'Menu:WelcomeMenuPage' => 'Bem-vindo', diff --git a/dictionaries/ru.dictionary.itop.ui.php b/dictionaries/ru.dictionary.itop.ui.php index e634efd66..bb5ee0899 100644 --- a/dictionaries/ru.dictionary.itop.ui.php +++ b/dictionaries/ru.dictionary.itop.ui.php @@ -195,6 +195,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array( 'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'действие предоставления', 'Class:URP_AttributeGrant/Attribute:attcode' => 'Атрибут', 'Class:URP_AttributeGrant/Attribute:attcode+' => 'Код атрибута', + 'BooleanLabel:yes' => 'да', + 'BooleanLabel:no' => 'нет', 'Menu:WelcomeMenu' => 'Добро пожаловать', 'Menu:WelcomeMenu+' => 'Добро пожаловать в iTop', 'Menu:WelcomeMenuPage' => 'Добро пожаловать', diff --git a/dictionaries/tr.dictionary.itop.ui.php b/dictionaries/tr.dictionary.itop.ui.php index 83797a176..d9c9ce2db 100644 --- a/dictionaries/tr.dictionary.itop.ui.php +++ b/dictionaries/tr.dictionary.itop.ui.php @@ -290,6 +290,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array( // Dict::Add('TR TR', 'Turkish', 'Türkçe', array( + 'BooleanLabel:yes' => 'evet', + 'BooleanLabel:no' => 'hayır', 'Menu:WelcomeMenu' => 'Hoşgeldiniz', 'Menu:WelcomeMenu+' => 'iTop\'a Hoşgeldiniz', 'Menu:WelcomeMenuPage' => 'Hoşgeldiniz', diff --git a/dictionaries/zh.dictionary.itop.ui.php b/dictionaries/zh.dictionary.itop.ui.php index 0a16f6bb6..0ea16af7f 100644 --- a/dictionaries/zh.dictionary.itop.ui.php +++ b/dictionaries/zh.dictionary.itop.ui.php @@ -289,6 +289,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( + 'BooleanLabel:yes' => '是', + 'BooleanLabel:no' => '否', 'Menu:WelcomeMenu' => '欢迎', 'Menu:WelcomeMenu+' => '欢迎来到iTop', 'Menu:WelcomeMenuPage' => '欢迎',