From 8de2948cedb5aa6fb98b543d5421816777aa1f6e Mon Sep 17 00:00:00 2001 From: Thierry Bugier Date: Mon, 5 Oct 2020 16:30:34 +0200 Subject: [PATCH] feat(questionparameter): make translatable Signed-off-by: Thierry Bugier --- inc/abstractfield.class.php | 16 ++++ inc/abstractquestionparameter.class.php | 40 ++++++++- inc/abstracttarget.class.php | 14 +++ inc/field/actorfield.class.php | 5 -- inc/field/checkboxesfield.class.php | 4 +- inc/field/datefield.class.php | 4 - inc/field/datetimefield.class.php | 4 - inc/field/descriptionfield.class.php | 5 -- inc/field/emailfield.class.php | 5 -- inc/field/filefield.class.php | 5 -- inc/field/floatfield.class.php | 5 -- inc/field/hostnamefield.class.php | 5 -- inc/field/ipfield.class.php | 5 -- inc/field/ldapselectfield.class.php | 4 - inc/field/radiosfield.class.php | 4 +- inc/field/tagfield.class.php | 5 -- inc/field/textareafield.class.php | 4 +- inc/field/textfield.class.php | 4 +- inc/field/timefield.class.php | 4 - inc/field/urgencyfield.class.php | 5 -- inc/form.class.php | 8 ++ inc/question.class.php | 2 +- inc/questionrange.class.php | 25 ++++++ inc/questionregex.class.php | 17 ++++ inc/targetchange.class.php | 87 ++++++++++++++++++- inc/targetticket.class.php | 6 +- inc/translatable.class.php | 5 +- tests/3-unit/PluginFormcreatorForm.php | 8 +- .../PluginFormcreatorDependentField.php | 7 +- 29 files changed, 235 insertions(+), 77 deletions(-) diff --git a/inc/abstractfield.class.php b/inc/abstractfield.class.php index 25dc1168e..754cdc208 100644 --- a/inc/abstractfield.class.php +++ b/inc/abstractfield.class.php @@ -334,4 +334,20 @@ protected function checkRegex($regex) return $isValid; } + + public function getTranslatableStrings() { + $strings = [ + 'itemlink' => [], + 'string' => [], + 'text' => [], + ]; + + foreach ($this->getParameters() as $fieldName => $parameter) { + foreach ($parameter->getTranslatableStrings() as $type => $subStrings) { + $strings[$type] = array_merge($strings[$type], $subStrings); + } + } + + return $strings; + } } diff --git a/inc/abstractquestionparameter.class.php b/inc/abstractquestionparameter.class.php index a56b2f5f6..57c1a772f 100644 --- a/inc/abstractquestionparameter.class.php +++ b/inc/abstractquestionparameter.class.php @@ -81,7 +81,27 @@ public function prepareInputforAdd($input) { return $input; } - public function deleteObsoleteItems(CommonDBTM $container, array $exclude) : bool { + public function rawSearchOptions() { + $tab = []; + $tab[] = [ + 'id' => 'common', + 'name' => __('Parameter', 'formcreator') + ]; + + $tab[] = [ + 'id' => '3', + 'table' => $this::getTable(), + 'field' => 'fieldname', + 'name' => __('Field name', 'formcreator'), + 'datatype' => 'itemlink', + 'massiveaction' => false, + ]; + + return $tab; + } + + public function deleteObsoleteItems(CommonDBTM $container, array $exclude): bool + { $keepCriteria = [ static::$items_id => $container->getID(), ]; @@ -90,4 +110,22 @@ public function deleteObsoleteItems(CommonDBTM $container, array $exclude) : boo } return $this->deleteByCriteria($keepCriteria); } + + public function getTranslatableStrings() { + $strings = [ + 'itemlink' => [], + 'string' => [], + 'text' => [], + ]; + foreach ($this->getTranslatableSearchOptions() as $searchOption) { + $strings[$searchOption['datatype']][] = $this->fields[$searchOption['field']]; + } + + foreach (array_keys($strings) as $type) { + $strings[$type] = array_unique($strings[$type]); + $strings[$type] = array_filter($strings[$type]); + } + + return $strings; + } } diff --git a/inc/abstracttarget.class.php b/inc/abstracttarget.class.php index 75917e822..fdaa1f52f 100644 --- a/inc/abstracttarget.class.php +++ b/inc/abstracttarget.class.php @@ -42,6 +42,7 @@ abstract class PluginFormcreatorAbstractTarget extends CommonDBChild implements { use PluginFormcreatorConditionnableTrait; use PluginFormcreatorExportableTrait; + use PluginFormcreatorTranslatable; static public $itemtype = PluginFormcreatorForm::class; static public $items_id = 'plugin_formcreator_forms_id'; @@ -2070,4 +2071,17 @@ public function deleteObsoleteItems(CommonDBTM $container, array $exclude) : boo } return $this->deleteByCriteria($keepCriteria); } + + public function getTranslatableStrings() { + $strings = [ + 'itemlink' => [], + 'string' => [], + 'text' => [], + ]; + foreach ($this->getTranslatableSearchOptions() as $searchOption) { + $strings[$searchOption['datatype']][] = $this->fields[$searchOption['field']]; + } + + return $strings; + } } diff --git a/inc/field/actorfield.class.php b/inc/field/actorfield.class.php index 994d6d7d3..e87f434b5 100644 --- a/inc/field/actorfield.class.php +++ b/inc/field/actorfield.class.php @@ -429,9 +429,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/checkboxesfield.class.php b/inc/field/checkboxesfield.class.php index 1043beb2b..e0512d9d9 100644 --- a/inc/field/checkboxesfield.class.php +++ b/inc/field/checkboxesfield.class.php @@ -381,6 +381,8 @@ public function isEditableField(): bool { public function getTranslatableStrings() { - return ['text' => array_values($this->getAvailableValues())]; + $strings = parent::getTranslatableStrings(); + $strings['text'] = array_merge($strings['text'], array_values($this->getAvailableValues())); + return $strings; } } diff --git a/inc/field/datefield.class.php b/inc/field/datefield.class.php index f19e51068..fc34bdb78 100644 --- a/inc/field/datefield.class.php +++ b/inc/field/datefield.class.php @@ -233,8 +233,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() { - return []; - } } diff --git a/inc/field/datetimefield.class.php b/inc/field/datetimefield.class.php index 251cde580..8cd9662b7 100644 --- a/inc/field/datetimefield.class.php +++ b/inc/field/datetimefield.class.php @@ -234,8 +234,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() { - return []; - } } diff --git a/inc/field/descriptionfield.class.php b/inc/field/descriptionfield.class.php index cffe5263d..4ff6975eb 100644 --- a/inc/field/descriptionfield.class.php +++ b/inc/field/descriptionfield.class.php @@ -163,9 +163,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return false; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/emailfield.class.php b/inc/field/emailfield.class.php index 5d35921d1..52f307139 100644 --- a/inc/field/emailfield.class.php +++ b/inc/field/emailfield.class.php @@ -189,9 +189,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/filefield.class.php b/inc/field/filefield.class.php index eef10c29f..e04aa5e9b 100644 --- a/inc/field/filefield.class.php +++ b/inc/field/filefield.class.php @@ -307,9 +307,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/floatfield.class.php b/inc/field/floatfield.class.php index 534c824dd..f377289bc 100644 --- a/inc/field/floatfield.class.php +++ b/inc/field/floatfield.class.php @@ -308,9 +308,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/hostnamefield.class.php b/inc/field/hostnamefield.class.php index 5ecd430f0..90f3e317e 100644 --- a/inc/field/hostnamefield.class.php +++ b/inc/field/hostnamefield.class.php @@ -164,9 +164,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return false; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/ipfield.class.php b/inc/field/ipfield.class.php index bb40daf10..dde4e9d0b 100644 --- a/inc/field/ipfield.class.php +++ b/inc/field/ipfield.class.php @@ -172,9 +172,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return false; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/ldapselectfield.class.php b/inc/field/ldapselectfield.class.php index bcd14226d..095ede70a 100644 --- a/inc/field/ldapselectfield.class.php +++ b/inc/field/ldapselectfield.class.php @@ -311,8 +311,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() { - return []; - } } diff --git a/inc/field/radiosfield.class.php b/inc/field/radiosfield.class.php index e5d40c582..5ade96878 100644 --- a/inc/field/radiosfield.class.php +++ b/inc/field/radiosfield.class.php @@ -301,6 +301,8 @@ public function isEditableField(): bool { public function getTranslatableStrings() { - return ['text' => array_values($this->getAvailableValues())]; + $strings = parent::getTranslatableStrings(); + $strings['text'] = array_merge($strings['text'], array_values($this->getAvailableValues())); + return $strings; } } diff --git a/inc/field/tagfield.class.php b/inc/field/tagfield.class.php index f612cec09..e85a55103 100644 --- a/inc/field/tagfield.class.php +++ b/inc/field/tagfield.class.php @@ -257,9 +257,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/field/textareafield.class.php b/inc/field/textareafield.class.php index c0169af43..de0c21206 100644 --- a/inc/field/textareafield.class.php +++ b/inc/field/textareafield.class.php @@ -255,6 +255,8 @@ public function getHtmlIcon(): string { public function getTranslatableStrings() { - return ['string' => [$this->question->fields['default_values']]]; + $strings = parent::getTranslatableStrings(); + $strings['string'] = array_merge($strings['string'], array_values($this->getAvailableValues())); + return $strings; } } diff --git a/inc/field/textfield.class.php b/inc/field/textfield.class.php index a800c0b44..22a65cccc 100644 --- a/inc/field/textfield.class.php +++ b/inc/field/textfield.class.php @@ -293,6 +293,8 @@ public function isEditableField(): bool { public function getTranslatableStrings() { - return ['text' => [$this->question->fields['default_values']]]; + $strings = parent::getTranslatableStrings(); + $strings['text'][] = $this->question->fields['default_values']; + return $strings; } } diff --git a/inc/field/timefield.class.php b/inc/field/timefield.class.php index 3d589ec8d..4d5c0b1d4 100644 --- a/inc/field/timefield.class.php +++ b/inc/field/timefield.class.php @@ -225,8 +225,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() { - return []; - } } diff --git a/inc/field/urgencyfield.class.php b/inc/field/urgencyfield.class.php index 0e0f49643..73589d776 100644 --- a/inc/field/urgencyfield.class.php +++ b/inc/field/urgencyfield.class.php @@ -244,9 +244,4 @@ public function isVisibleField(): bool { public function isEditableField(): bool { return true; } - - public function getTranslatableStrings() - { - return []; - } } diff --git a/inc/form.class.php b/inc/form.class.php index af0de2025..2632b4320 100644 --- a/inc/form.class.php +++ b/inc/form.class.php @@ -2509,6 +2509,14 @@ public function getTranslatableStrings() { } } + foreach (self::getTargetTypes() as $targetType) { + foreach ((new $targetType())->getTargetsForForm($this->getID()) as $target) { + foreach ($target->getTranslatableStrings() as $type => $subStrings) { + $strings[$type] = array_merge($strings[$type], $subStrings); + } + } + } + // deduplicate strings and remove empty strings foreach (array_keys($strings) as $type) { $strings[$type] = array_unique($strings[$type]); diff --git a/inc/question.class.php b/inc/question.class.php index c849d3712..11787185b 100644 --- a/inc/question.class.php +++ b/inc/question.class.php @@ -1282,7 +1282,7 @@ public function post_getFromDB() { * @return void */ private function loadField($fieldType) { - if (!$this->field === null || $this->isNewItem()) { + if (!$this->field === null) { return; } $this->field = PluginFormcreatorFields::getFieldInstance($fieldType, $this); diff --git a/inc/questionrange.class.php b/inc/questionrange.class.php index d711b0a2e..85ebba19c 100644 --- a/inc/questionrange.class.php +++ b/inc/questionrange.class.php @@ -44,6 +44,7 @@ class PluginFormcreatorQuestionRange extends PluginFormcreatorAbstractQuestionParameter { + use PluginFormcreatorTranslatable; protected $domId = 'plugin_formcreator_questionRange'; @@ -51,6 +52,30 @@ public static function getTypeName($nb = 0) { return _n('Question range', 'Question ranges', $nb, 'formcreator'); } + public function rawSearchOptions() { + $tab = parent::rawSearchOptions(); + + $tab[] = [ + 'id' => '4', + 'table' => $this::getTable(), + 'field' => 'range_min', + 'name' => __('Minimum range', 'formcreator'), + 'datatype' => 'integer', + 'massiveaction' => false, + ]; + + $tab[] = [ + 'id' => '4', + 'table' => $this::getTable(), + 'field' => 'range_max', + 'name' => __('maximum range', 'formcreator'), + 'datatype' => 'integer', + 'massiveaction' => false, + ]; + + return $tab; + } + public function getParameterFormSize() { return 0; } diff --git a/inc/questionregex.class.php b/inc/questionregex.class.php index ac2de88b3..d3821d949 100644 --- a/inc/questionregex.class.php +++ b/inc/questionregex.class.php @@ -44,6 +44,7 @@ class PluginFormcreatorQuestionRegex extends PluginFormcreatorAbstractQuestionParameter { + use PluginFormcreatorTranslatable; protected $domId = 'plugin_formcreator_questionRegex'; @@ -51,6 +52,22 @@ public static function getTypeName($nb = 0) { return _n('Question regular expression', 'Question regular expressions', $nb, 'formcreator'); } + public function rawSearchOptions() { + $tab = parent::rawSearchOptions(); + + $tab[] = [ + 'id' => '4', + 'table' => $this::getTable(), + 'field' => 'regex', + 'name' => __('Regular expression', 'formcreator'), + 'datatype' => 'text', + 'massiveaction' => false, + ]; + + return $tab; + } + + public function getParameterFormSize() { return 1; } diff --git a/inc/targetchange.class.php b/inc/targetchange.class.php index 5f25ba775..27845e604 100644 --- a/inc/targetchange.class.php +++ b/inc/targetchange.class.php @@ -268,6 +268,91 @@ public static function countItemsToImport(array $input) : int { return 1 + self::countChildren($subItems, $input); } + public function rawSearchOptions() { + $tab = parent::rawSearchOptions(); + + $tab[] = [ + 'id' => '2', + 'table' => $this::getTable(), + 'field' => 'id', + 'name' => __('ID'), + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '4', + 'table' => $this::getTable(), + 'field' => 'target_name', + 'name' => __('Change title', 'formcreator'), + 'datatype' => 'text', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '5', + 'table' => $this::getTable(), + 'field' => 'content', + 'name' => __('Content', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '6', + 'table' => $this::getTable(), + 'field' => 'impactcontent', + 'name' => __('Impact', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '7', + 'table' => $this::getTable(), + 'field' => 'controlistcontent', + 'name' => __('Control list', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '8', + 'table' => $this::getTable(), + 'field' => 'rolloutplancontent', + 'name' => __('Rollout plan', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + $tab[] = [ + 'id' => '9', + 'table' => $this::getTable(), + 'field' => 'backoutplancontent', + 'name' => __('Backup plan', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + + $tab[] = [ + 'id' => '10', + 'table' => $this::getTable(), + 'field' => 'checklistcontent', + 'name' => __('Check list', 'formcreator'), + 'datatype' => 'string', + 'searchtype' => 'contains', + 'massiveaction' => false + ]; + + return $tab; + } public function showForm($ID, $options = []) { if ($ID == 0) { @@ -723,7 +808,7 @@ public function save(PluginFormcreatorFormAnswer $formanswer) { * @param int $formId * @return array */ - public function getTargetChangesForForm($formId) { + public function getTargetsForForm($formId) { global $DB; $targets = []; diff --git a/inc/targetticket.class.php b/inc/targetticket.class.php index e9a0cfc55..729cecdf6 100644 --- a/inc/targetticket.class.php +++ b/inc/targetticket.class.php @@ -112,7 +112,7 @@ public function rawSearchOptions() { $tab[] = [ 'id' => '4', 'table' => $this::getTable(), - 'field' => 'Target_name', + 'field' => 'target_name', 'name' => __('Ticket title', 'formcreator'), 'datatype' => 'text', 'searchtype' => 'contains', @@ -123,7 +123,7 @@ public function rawSearchOptions() { 'id' => '5', 'table' => $this::getTable(), 'field' => 'content', - 'name' => __('Ticket title', 'formcreator'), + 'name' => __('Content', 'formcreator'), 'datatype' => 'string', 'searchtype' => 'contains', 'massiveaction' => false @@ -1394,7 +1394,7 @@ private function saveAssociatedItems($input) { * @param int $formId * @return array */ - public function getTargetTicketsForForm($formId) { + public function getTargetsForForm($formId) { global $DB; $targets = []; diff --git a/inc/translatable.class.php b/inc/translatable.class.php index db2f01153..45819a4a7 100644 --- a/inc/translatable.class.php +++ b/inc/translatable.class.php @@ -39,7 +39,7 @@ public function getTranslatableSearchOptions() { $searchOptions = $this->searchOptions(); $translatable = []; $table = $this::getTable(); - foreach ($searchOptions as $searchOption) { + foreach ($searchOptions as $id => $searchOption) { if (!isset($searchOption['field'])) { continue; } @@ -52,6 +52,9 @@ public function getTranslatableSearchOptions() { if (!in_array($searchOption['datatype'], ['itemlink', 'text', 'string'])) { continue; } + if ($searchOption['datatype'] == 'itemlink' && $id != '1') { + continue; + } $translatable[] = $searchOption; } diff --git a/tests/3-unit/PluginFormcreatorForm.php b/tests/3-unit/PluginFormcreatorForm.php index 2e1354c77..e62fe61ef 100644 --- a/tests/3-unit/PluginFormcreatorForm.php +++ b/tests/3-unit/PluginFormcreatorForm.php @@ -870,9 +870,9 @@ public function testDuplicate() { $this->integer(count(array_diff($new_uuids, $uuids)))->isEqualTo(count($new_uuids)); // check target tickets - $all_targetTickets = (new \PluginFormcreatorTargetTicket())->getTargetTicketsForForm($form->getID()); + $all_targetTickets = (new \PluginFormcreatorTargetTicket())->getTargetsForForm($form->getID()); $this->integer(count($all_sections))->isEqualTo(count($section_ids)); - $all_new_targetTickets = (new \PluginFormcreatorTargetTicket())->getTargetTicketsForForm($new_form->getID()); + $all_new_targetTickets = (new \PluginFormcreatorTargetTicket())->getTargetsForForm($new_form->getID()); $this->integer(count($all_sections))->isEqualTo(count($section_ids)); // check that all sections uuid are new @@ -885,9 +885,9 @@ public function testDuplicate() { $this->integer(count(array_diff($new_uuids, $uuids)))->isEqualTo(count($new_uuids)); // check target changes - $all_targetChanges = (new \PluginFormcreatorTargetChange())->getTargetChangesForForm($form->getID()); + $all_targetChanges = (new \PluginFormcreatorTargetChange())->getTargetsForForm($form->getID()); $this->integer(count($all_sections))->isEqualTo(count($section_ids)); - $all_new_targetChanges = (new \PluginFormcreatorTargetChange())->getTargetChangesForForm($new_form->getID()); + $all_new_targetChanges = (new \PluginFormcreatorTargetChange())->getTargetsForForm($new_form->getID()); $this->integer(count($all_sections))->isEqualTo(count($section_ids)); // check that all sections uuid are new diff --git a/tests/fixture/PluginFormcreatorDependentField.php b/tests/fixture/PluginFormcreatorDependentField.php index e1dd37149..9f2afa153 100644 --- a/tests/fixture/PluginFormcreatorDependentField.php +++ b/tests/fixture/PluginFormcreatorDependentField.php @@ -37,10 +37,15 @@ use Toolbox; use Html; use Session; +use PluginFormcreatorTranslatable; class DependentField extends PluginFormcreatorAbstractField { - public function isPrerequisites(): bool { + + use PluginFormcreatorTranslatable; + + public function isPrerequisites(): bool + { return true; }