Merge branch 'develop' into feature/cli-backup-restore

This commit is contained in:
Eric Espie
2021-09-07 14:45:35 +02:00
251 changed files with 3895 additions and 1995 deletions

View File

@@ -18,8 +18,12 @@ use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Form\Form;
use Combodo\iTop\Application\UI\Base\Component\Form\FormUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Html\HtmlFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\MedallionIcon\MedallionIcon;
use Combodo\iTop\Application\UI\Base\Component\Panel\Panel;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Title\Title;
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
@@ -94,6 +98,8 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
/** @var string */
public const ENUM_INPUT_TYPE_RADIO = 'radio';
/** @var string */
public const ENUM_INPUT_TYPE_CHECKBOX = 'checkbox';
/** @var string */
public const ENUM_INPUT_TYPE_DROPDOWN_RAW = 'dropdown_raw';
/** @var string */
public const ENUM_INPUT_TYPE_DROPDOWN_DECORATED = 'dropdown_decorated'; // now with the JQuery Selectize plugin
@@ -2894,7 +2900,7 @@ EOF
$oPage->add($oAppContext->GetForForm());
// Hook the cancel button via jQuery so that it can be unhooked easily as well if needed
$sDefaultUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=cancel&'.$oAppContext->GetForLink();
$sDefaultUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search_form&class='.$sClass.'&'.$oAppContext->GetForLink();
$oPage->add_ready_script("$('#form_{$this->m_iFormId} button.cancel').on('click', function() { BackToDetails('$sClass', $iKey, '$sDefaultUrl', $sJSToken)} );");
$iFieldsCount = count($aFieldsMap);
@@ -2945,6 +2951,93 @@ EOF
}
}
/**
* Select the derived class to create
* @param string $sClass
* @param \WebPage $oP
* @param \ApplicationContext $oAppContext
* @param array $aPossibleClasses
* @param array $aHiddenFields
*
* @return void
* @throws \CoreException
* @throws \DictExceptionMissingString
*
* @since 3.0.0
*/
public static function DisplaySelectClassToCreate(string $sClass, WebPage $oP, ApplicationContext $oAppContext, array $aPossibleClasses, array $aHiddenFields)
{
$sClassLabel = MetaModel::GetName($sClass);
$sTitle = Dict::Format('UI:CreationTitle_Class', $sClassLabel);
$oP->set_title($sTitle);
$sClassIconUrl = MetaModel::GetClassIcon($sClass, false);
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, $sTitle)
->SetIcon($sClassIconUrl);
$oClassForm = FormUIBlockFactory::MakeStandard();
$oPanel->AddMainBlock($oClassForm);
$oClassForm->AddHtml($oAppContext->GetForForm())
->AddSubBlock(InputUIBlockFactory::MakeForHidden('checkSubclass', '0'))
->AddSubBlock(InputUIBlockFactory::MakeForHidden('operation', 'new'));
foreach ($aHiddenFields as $sKey => $sValue) {
if (is_scalar($sValue)) {
$oClassForm->AddSubBlock(InputUIBlockFactory::MakeForHidden($sKey, $sValue));
}
}
$aDefaults = utils::ReadParam('default', array(), false, 'raw_data');
foreach ($aDefaults as $key => $value) {
if (is_array($value)) {
foreach ($value as $key2 => $value2) {
if (is_array($value2)) {
foreach ($value2 as $key3 => $value3) {
$sValue = utils::EscapeHtml($value3);
$oClassForm->AddSubBlock(InputUIBlockFactory::MakeForHidden("default[$key][$key2][$key3]", $sValue));
}
} else {
$sValue = utils::EscapeHtml($value2);
$oClassForm->AddSubBlock(InputUIBlockFactory::MakeForHidden("default[$key][$key2]", $sValue));
}
}
} else {
$sValue = utils::EscapeHtml($value);
$oClassForm->AddSubBlock(InputUIBlockFactory::MakeForHidden("default[$key]", $sValue));
}
}
$oClassForm->AddSubBlock(self::DisplayBlockSelectClassToCreate($sClass, $sClassLabel, $aPossibleClasses));
$oP->AddSubBlock($oPanel);
}
/**
* @param string $sClassLabel
* @param array $aPossibleClasses
* @param string $sClass
*
* @return UIContentBlock
* @throws \CoreException
*/
public static function DisplayBlockSelectClassToCreate( string $sClass, string $sClassLabel,array $aPossibleClasses): UIContentBlock
{
$oBlock= UIContentBlockUIBlockFactory::MakeStandard();
$oBlock->AddSubBlock(HtmlFactory::MakeRaw(Dict::Format('UI:SelectTheTypeOf_Class_ToCreate', $sClassLabel)));
$oSelect = SelectUIBlockFactory::MakeForSelect('class');
$oBlock->AddSubBlock($oSelect);
asort($aPossibleClasses);
foreach ($aPossibleClasses as $sClassName => $sClassLabel) {
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($sClassName, $sClassLabel, ($sClassName == $sClass)));
}
$oToolbar = ToolbarUIBlockFactory::MakeForAction();
$oBlock->AddSubBlock($oToolbar);
$oToolbar->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), null, null, true));
return $oBlock;
}
/**
* @param \WebPage $oPage
* @param string $sClass

View File

@@ -543,7 +543,7 @@ EOF
if ($bFromDasboardPage) {
$sTitleForHTML = utils::HtmlEntities(Dict::S($this->sTitle));
$sHtml = "<div class=\"ibo-top-bar--toolbar-dashboard-title\">{$sTitleForHTML}</div>";
$sHtml = "<div class=\"ibo-top-bar--toolbar-dashboard-title\" title=\"{$sTitleForHTML}\">{$sTitleForHTML}</div>";
if ($oPage instanceof iTopWebPage) {
$oTopBar = $oPage->GetTopBarLayout();
$oToolbar = ToolbarUIBlockFactory::MakeStandard();

View File

@@ -270,6 +270,8 @@ class DisplayBlock
'panel_title',
/** string class for panel block style */
'panel_class',
/** string class for panel block style */
'panel_icon',
];
if (isset($aAllowedParams[$sStyle])) {
@@ -1196,6 +1198,9 @@ JS
$sTitle = Dict::Format($sFormat, $iTotalCount);
$oBlock = PanelUIBlockFactory::MakeForClass($aExtraParams["panel_class"], $aExtraParams["panel_title"]);
$oBlock->AddSubTitleBlock(new Html($sTitle));
if(isset($aExtraParams["panel_icon"]) && strlen($aExtraParams["panel_icon"]) > 0){
$oBlock->SetIcon($aExtraParams["panel_icon"]);
}
$oDataTable = DataTableUIBlockFactory::MakeForStaticData("", $aAttribs, $aData, null, $aExtraParams, $this->m_oFilter->ToOQL(), $aOption);
$oBlock->AddSubBlock($oDataTable);
} else {
@@ -1212,6 +1217,9 @@ JS
}
if (isset($aExtraParams["surround_with_panel"]) && $aExtraParams["surround_with_panel"]) {
$oBlock = PanelUIBlockFactory::MakeForClass($aExtraParams["panel_class"], $aExtraParams["panel_title"]);
if(isset($aExtraParams["panel_icon"]) && strlen($aExtraParams["panel_icon"]) > 0){
$oBlock->SetIcon($aExtraParams["panel_icon"]);
}
$oBlock->AddSubBlock(new Html('<p>'.Dict::Format($sFormat, $iCount).'</p>'));
} else {
$oBlock = new Html('<p>'.Dict::Format($sFormat, $iCount).'</p>');
@@ -1347,6 +1355,9 @@ JS
if (isset($aExtraParams["surround_with_panel"]) && $aExtraParams["surround_with_panel"]) {
$oPanel = PanelUIBlockFactory::MakeForClass($aExtraParams["panel_class"], $aExtraParams["panel_title"]);
if(isset($aExtraParams["panel_icon"]) && strlen($aExtraParams["panel_icon"]) > 0){
$oPanel->SetIcon($aExtraParams["panel_icon"]);
}
$oPanel->AddSubBlock($oBlock);
return $oPanel;
@@ -1544,6 +1555,9 @@ JS
if (isset($aExtraParams["surround_with_panel"]) && $aExtraParams["surround_with_panel"]) {
$oPanel = PanelUIBlockFactory::MakeForClass($aExtraParams["panel_class"], $aExtraParams["panel_title"]);
if(isset($aExtraParams["panel_icon"]) && strlen($aExtraParams["panel_icon"]) > 0){
$oPanel->SetIcon($aExtraParams["panel_icon"]);
}
$oPanel->AddSubBlock($oBlock);
return $oPanel;
@@ -1632,6 +1646,9 @@ JS
}
if (isset($aExtraParams["surround_with_panel"]) && $aExtraParams["surround_with_panel"]) {
$oPanel = PanelUIBlockFactory::MakeForClass($aExtraParams["panel_class"], $aExtraParams["panel_title"]);
if(isset($aExtraParams["panel_icon"]) && strlen($aExtraParams["panel_icon"]) > 0){
$oPanel->SetIcon($aExtraParams["panel_icon"]);
}
$oPanel->AddSubBlock($oBlock);
return $oPanel;

View File

@@ -102,12 +102,20 @@ class DesignerForm
$sReturn .= '<fieldset>';
$sReturn .= '<legend>'.$sLabel.'</legend>';
}
/** @var \DesignerFormField $oField */
foreach($aFields as $oField) {
$aRow = $oField->Render($oP, $sFormId);
if ($oField->IsVisible()) {
$sValidation = '<span class="prop_apply ibo-prop--apply ibo-button ibo-is-alternative">'.$this->GetValidationArea($oField->GetFieldId()).'</span>';
$sField = $aRow['value'].$sValidation;
$aDetails[] = array('label' => $aRow['label'], 'value' => $sField);
$aDetails[] = array(
'label' => $aRow['label'],
'value' => $sField,
'attcode' => $oField->GetCode(),
'attlabel' => $aRow['label'],
'inputid' => $this->GetFieldId($oField->GetCode()),
'inputtype' => $oField->GetInputType(),
);
} else {
$sHiddenFields .= $aRow['value'];
}
@@ -707,6 +715,19 @@ class DesignerFormField
$this->aWidgetExtraParams = array();
}
/**
* Important, for now we use constants from the \cmdbAbstractObject class, introducing a coupling that should not exist.
* This has been traced under N°4241 and will be discussed during the next modernization batch.
*
* @return string|null Return the input type of the field
* @see \cmdbAbstractObject::ENUM_INPUT_TYPE_XXX
* @since 3.0.0
*/
public function GetInputType(): ?string
{
return cmdbAbstractObject::ENUM_INPUT_TYPE_SINGLE_INPUT;
}
/**
* @return string
*/
@@ -1047,6 +1068,14 @@ class DesignerLongTextField extends DesignerTextField
$this->aCSSClasses[] = 'ibo-input-text';
}
/**
* @inheritDoc
*/
public function GetInputType(): string
{
return cmdbAbstractObject::ENUM_INPUT_TYPE_TEXTAREA;
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
$sId = $this->oForm->GetFieldId($this->sCode);
@@ -1175,6 +1204,19 @@ class DesignerComboField extends DesignerFormField
$this->bAutoApply = true;
$this->bSorted = true; // Sorted by default
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
if ($this->bMultipleSelection) {
return cmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_MULTIPLE_CHOICES;
}
else {
return cmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_RAW;
}
}
public function SetAllowedValues($aAllowedValues)
{
@@ -1311,6 +1353,14 @@ class DesignerBooleanField extends DesignerFormField
$this->bAutoApply = true;
$this->aCSSClasses[] = 'ibo-input-checkbox';
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return cmdbAbstractObject::ENUM_INPUT_TYPE_CHECKBOX;
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
@@ -1370,6 +1420,14 @@ class DesignerHiddenField extends DesignerFormField
{
parent::__construct($sCode, $sLabel, $defaultValue);
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return null;
}
public function IsVisible()
{
@@ -1397,6 +1455,14 @@ class DesignerIconSelectionField extends DesignerFormField
$this->bAutoApply = true;
$this->sUploadUrl = null;
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return cmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_DECORATED;
}
public function SetAllowedValues($aAllowedValues)
{
@@ -1566,6 +1632,14 @@ class DesignerSortableField extends DesignerFormField
parent::__construct($sCode, $sLabel, $defaultValue);
$this->aAllowedValues = array();
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return null;
}
public function SetAllowedValues($aAllowedValues)
{
@@ -1605,6 +1679,14 @@ class DesignerFormSelectorField extends DesignerFormField
$this->aCSSClasses[] = 'ibo-input-select';
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return null;
}
public function IsSorted()
{
return $this->bSorted;
@@ -1790,6 +1872,14 @@ class DesignerSubFormField extends DesignerFormField
parent::__construct('', $sLabel, '');
$this->oSubForm = $oSubForm;
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return null;
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
@@ -1834,6 +1924,14 @@ class DesignerStaticTextField extends DesignerFormField
parent::__construct($sCode, $sLabel, $defaultValue);
}
/**
* @inheritDoc
*/
public function GetInputType(): ?string
{
return null;
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
return array('label' => $this->sLabel, 'value' => $this->defaultValue);

View File

@@ -1125,7 +1125,6 @@ class OQLMenuNode extends MenuNode
{
$sUsageId = utils::GetSafeId($sUsageId);
$oSearch = DBObjectSearch::FromOQL($sOql);
//$sIcon = MetaModel::GetClassIcon($oSearch->GetClass(), false);
if ($bSearchPane) {
$aParams = array_merge(['open' => $bSearchOpen, 'table_id' => $sUsageId, 'submit_on_load' => true], $aExtraParams);
@@ -1133,6 +1132,16 @@ class OQLMenuNode extends MenuNode
$oBlock->Display($oPage, 0);
}
$oPage->add("<div class='sf_results_area' data-target='search_results'>");
$oTitle = TitleUIBlockFactory::MakeForPage($sTitle);
$oPage->AddUiBlock($oTitle);
$aParams = array_merge(array('table_id' => $sUsageId), $aExtraParams);
$oBlock = new DisplayBlock($oSearch, 'list', false /* Asynchronous */, $aParams);
$oBlock->Display($oPage, $sUsageId);
$oPage->add("</div>");
if ($bEnableBreadcrumb && ($oPage instanceof iTopWebPage)) {
// Breadcrumb
//$iCount = $oBlock->GetDisplayedCount();

View File

@@ -4,6 +4,10 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\UI\Base\Component\Form\FormUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
require_once(APPROOT.'/application/displayblock.class.inc.php');
/**
@@ -200,42 +204,35 @@ class UIExtKeyWidget
$sHelpText = ''; //$this->oAttDef->GetHelpOnEdition();
//$sHTMLValue .= "<div class=\"field_select_wrapper\">\n";
$aOptions = [];
$sDisplayValue = "";
$aOption = [];
$aOption['value'] = "";
$aOption['label'] = Dict::S('UI:SelectOne');
array_push($aOptions,$aOption);
array_push($aOptions, $aOption);
$oAllowedValues->Rewind();
$bAddingValue=false;
$sClassAllowed = $oAllowedValues->GetClass();
$bAddingValue = false;
$aComplementAttributeSpec = MetaModel::GetComplementAttributeSpec($oAllowedValues->GetClass());
$aComplementAttributeSpec = MetaModel::GetNameSpec($oAllowedValues->GetClass(), FriendlyNameType::COMPLEMENTARY);
$sFormatAdditionalField = $aComplementAttributeSpec[0];
$aAdditionalField = $aComplementAttributeSpec[1];
if (count($aAdditionalField)>0)
{
$bAddingValue=true;
if (count($aAdditionalField) > 0) {
$bAddingValue = true;
}
while($oObj = $oAllowedValues->Fetch())
{
$aOption=[];
$sObjectImageAttCode = MetaModel::GetImageAttributeCode($sClassAllowed);
$bInitValue = false;
while ($oObj = $oAllowedValues->Fetch()) {
$aOption = [];
$aOption['value'] = $oObj->GetKey();
$aOption['label'] = $oObj->GetName();//.'<span class=\"object-ref-icon fas fa-eye-slash object-obsolete fa-1x fa-fw\"></span>';
if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true') )
{
if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true')) {
// When there is only once choice, select it by default
$sDisplayValue=$oObj->GetName();
if($value != $oObj->GetKey())
{
$value=$oObj->GetKey();
}
}
else {
if ((is_array($value) && in_array($oObj->GetKey(), $value)) || ($value == $oObj->GetKey())) {
$sDisplayValue = $oObj->GetName();
if ($value != $oObj->GetKey()) {
$value = $oObj->GetKey();
$bInitValue = true;
}
}
if ($oObj->IsObsolete()) {
@@ -248,6 +245,17 @@ class UIExtKeyWidget
}
$aOption['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments);
}
if (!empty($sObjectImageAttCode)) {
// Try to retrieve image for contact
/** @var \ormDocument $oImage */
$oImage = $oObj->Get($sObjectImageAttCode);
if (!$oImage->IsEmpty()) {
$aOption['picture_url'] = $oImage->GetDisplayURL($sClassAllowed, $oObj->GetKey(), $sObjectImageAttCode);
$aOption['initials'] = '';
} else {
$aOption['initials'] = utils::ToAcronym($oObj->Get('friendlyname'));
}
}
array_push($aOptions, $aOption);
}
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_DECORATED;
@@ -259,10 +267,12 @@ class UIExtKeyWidget
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
oACWidget_{$this->iId}.AddSelectize('$sJsonOptions','$value');
$('#$this->iId').on('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').on('change', function() { $(this).trigger('extkeychange') } );
$('#$this->iId').on('change', function() { $(this).trigger('extkeychange'); } );
EOF
);
if ($bInitValue) {
$oPage->add_ready_script("$('#$this->iId').one('validate', function() { $(this).trigger('change'); } );");
}
$sHTMLValue .= "<div class=\"ibo-input-select--action-buttons\">";
}
else
@@ -811,21 +821,24 @@ JS
{
case static::ENUM_OUTPUT_FORMAT_JSON:
$aJsonMap = array();
foreach ($aValues as $sKey => $aValue)
{
if ($aValue['additional_field'] != '')
{
$aJsonMap[] = array('value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag'], 'additional_field' => $aValue['additional_field']);
}
else
{
$aJsonMap[] = array('value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag']);
}
}
$aJsonMap = array();
foreach ($aValues as $sKey => $aValue) {
$aElt = ['value' => $sKey, 'label' => $aValue['label'], 'obsolescence_flag' => $aValue['obsolescence_flag']];
if ($aValue['additional_field'] != '') {
$aElt['additional_field'] = $aValue['additional_field'];
}
$oP->SetContentType('application/json');
$oP->add(json_encode($aJsonMap));
if (array_key_exists('initials', $aValue)) {
$aElt['initials'] = $aValue['initials'];
if (array_key_exists('picture_url', $aValue)) {
$aElt['picture_url'] = $aValue['picture_url'];
}
}
$aJsonMap[] = $aElt;
}
$oP->SetContentType('application/json');
$oP->add(json_encode($aJsonMap));
break;
case static::ENUM_OUTPUT_FORMAT_CSV:
@@ -892,26 +905,17 @@ JS
}
}
$sDialogTitle = '';
$oPage->add('<div id="ac_create_'.$this->iId.'"><div class="wizContainer" style="vertical-align:top;"><div id="dcr_'.$this->iId.'">');
$oPage->add('<form>');
$sClassLabel = MetaModel::GetName($this->sTargetClass);
$oPage->add('<p>'.Dict::Format('UI:SelectTheTypeOf_Class_ToCreate', $sClassLabel));
$oPage->add('<nobr><select name="class">');
asort($aPossibleClasses);
foreach($aPossibleClasses as $sClassName => $sClassLabel)
{
$oPage->add("<option value=\"$sClassName\">$sClassLabel</option>");
}
$oPage->add('</select>');
$oPage->add('&nbsp; <button type="submit" class="action" style="margin-top:15px;"><span>' . Dict::S('UI:Button:Ok') . '</span></button></nobr></p>');
$sDialogTitle = Dict::Format('UI:CreationTitle_Class', $sClassLabel);;
$oBlock = UIContentBlockUIBlockFactory::MakeStandard('ac_create_'.$this->iId,['ibo-is-visible']);
$oPage->AddSubBlock($oBlock);
$oClassForm = FormUIBlockFactory::MakeStandard();
$oBlock->AddSubBlock($oClassForm);
$oClassForm->AddSubBlock(cmdbAbstractObject::DisplayBlockSelectClassToCreate( $sClassLabel, $this->sTargetClass, $aPossibleClasses));
$oPage->add('</form>');
$oPage->add('</div></div></div>');
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').removeAttr('onsubmit');");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').on('submit.uilinksWizard', oACWidget_{$this->iId}.DoSelectObjectClass);");
$oPage->add_ready_script("$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("$('#ac_create_{$this->iId} form').removeAttr('onsubmit');");
$oPage->add_ready_script("$('#ac_create_{$this->iId} form').on('submit.uilinksWizard', oACWidget_{$this->iId}.DoSelectObjectClass);");
}
/**

View File

@@ -2656,7 +2656,7 @@ class utils
$sMentionItemUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&class='.$sMentionClass.'&id={id}';
$sMentionItemPictureTemplate = (empty(MetaModel::GetImageAttributeCode($sMentionClass))) ? '' : <<<HTML
<span class="ibo-vendors-ckeditor--autocomplete-item-image" style="background-image: url('{picture_url}');">{initials}</span>
<span class="ibo-vendors-ckeditor--autocomplete-item-image" style="{picture_style}">{initials}</span>
HTML;
$sMentionItemTemplate = <<<HTML
<li class="ibo-vendors-ckeditor--autocomplete-item" data-id="{id}">{$sMentionItemPictureTemplate}<span class="ibo-vendors-ckeditor--autocomplete-item-title">{friendlyname}</span></li>

View File

@@ -4123,7 +4123,8 @@ class AttributeText extends AttributeString
{
// Propose a std link to the object
$sClassLabel = MetaModel::GetName($sClass);
$sReplacement = "<span class=\"wiki_broken_link\">$sClassLabel:$sName" . (!empty($sLabel) ? " ($sLabel)" : "") . "</span>";
$sToolTipForHtml = utils::EscapeHtml(Dict::Format('Core:UnknownObjectLabel', $sClass, $sName));
$sReplacement = "<span class=\"wiki_broken_link ibo-is-broken-hyperlink\" data-tooltip-content=\"$sToolTipForHtml\">$sClassLabel:$sName" . (!empty($sLabel) ? " ($sLabel)" : "") . "</span>";
$sText = str_replace($aMatches[0], $sReplacement, $sText);
// Later: propose a link to create a new object
// Anyhow... there is no easy way to suggest default values based on the given FRIENDLY name

View File

@@ -1415,6 +1415,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'security.disable_inline_documents_sandbox' => [
'type' => 'bool',
'description' => 'If true then the sandbox for documents displayed in a browser tab will be disabled; enabling scripts and other interactive content. Note that setting this to true will open the application to potential XSS attacks!',
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'behind_reverse_proxy' => [
'type' => 'bool',
'description' => 'If true, then proxies custom header (X-Forwarded-*) are taken into account. Use only if the webserver is not publicly accessible (reachable only by the reverse proxy)',

View File

@@ -4,6 +4,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
/**
* All objects to be displayed in the application (either as a list or as details)
* must implement this interface.
@@ -1525,14 +1527,15 @@ abstract class DBObject implements iDisplay
* Helper to get the friendly name in a safe manner for displaying inside a web page
*
* @internal
* @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107)
*
* @return string
* @throws \CoreException
* @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107)
* @since 3.0.0 N°580 New $sType parameter
*
*/
public function GetName()
public function GetName($sType = FriendlyNameType::SHORT)
{
return htmlentities($this->GetRawName(), ENT_QUOTES, 'UTF-8');
return htmlentities($this->GetRawName($sType), ENT_QUOTES, 'UTF-8');
}
/**
@@ -1546,11 +1549,17 @@ abstract class DBObject implements iDisplay
* @return string
* @throws \CoreException
* @since 3.0.0 N°4106 This method is now internal. It will be set final in 3.1.0 (N°4107)
* @since 3.0.0 N°580 New $sType parameter
*
*/
public function GetRawName()
public function GetRawName($sType = FriendlyNameType::SHORT)
{
return $this->Get('friendlyname');
if ($sType == FriendlyNameType::SHORT) {
return $this->Get('friendlyname');
} else {
$oExpression = MetaModel::GetNameExpression(get_class($this), $sType);
$this->EvaluateExpression($oExpression);
}
}
/**

View File

@@ -464,7 +464,7 @@ class DisplayableNode extends GraphNode
{
$aRootCauses[] = $oRootCause->GetHyperlink();
}
$sHtml .= '<p><img style="max-height: 24px; vertical-align:bottom;" src="'.utils::GetAbsoluteUrlModulesRoot().$aContext['icon'].'" title="'.htmlentities(Dict::S($aContext['dict'])).'">&nbsp;'.implode(', ', $aRootCauses).'</p>';
$sHtml .= '<p><img style="max-height: 24px; vertical-align:bottom;" class="ibo-class-icon ibo-is-small" src="'.utils::GetAbsoluteUrlModulesRoot().$aContext['icon'].'" title="'.htmlentities(Dict::S($aContext['dict'])).'">&nbsp;'.implode(', ', $aRootCauses).'</p>';
}
$sHtml .= '<hr/>';
}
@@ -805,7 +805,7 @@ class DisplayableGroupNode extends DisplayableNode
$sHtml .= '<a href="#" onclick="$(\'.itop-simple-graph\').simple_graph(\'show_group\', \'relation_group_'.$iGroupIdx.'\');">'.Dict::Format('UI:RelationGroupNumber_N', (1+$iGroupIdx))."</a>";
$sHtml .= '<hr/>';
$sHtml .= '<table><tbody><tr>';
$sHtml .= '<td style="vertical-align:top;padding-right: 0.5em;"><img src="'.$this->GetProperty('icon_url').'"></td><td style="vertical-align:top">'.MetaModel::GetName($this->GetObjectClass()).'<br/>';
$sHtml .= '<td style="vertical-align:top;padding-right: 0.5em;"><img class="ibo-class-icon ibo-is-small" src="'.$this->GetProperty('icon_url').'"></td><td style="vertical-align:top">'.MetaModel::GetName($this->GetObjectClass()).'<br/>';
$sHtml .= Dict::Format('UI_CountOfObjectsShort', $this->GetObjectCount()).'</td>';
$sHtml .= '</tr></tbody></table>';
return $sHtml;

View File

@@ -229,7 +229,7 @@ class InlineImage extends DBObject
*
* @param string $sTempId
*
* @return void
* @return bool True if cleaning was successful, false if anything aborted it
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
@@ -239,8 +239,19 @@ class InlineImage extends DBObject
* @throws \MySQLHasGoneAwayException
* @throws \OQLException
*/
public static function OnFormCancel($sTempId)
public static function OnFormCancel($sTempId): bool
{
// Protection against unfortunate massive delete of inline images when a null temp ID is passed
if (strlen($sTempId) === 0) {
IssueLog::Trace('OnFormCancel "error" $sTempId is null or empty', LogChannels::INLINE_IMAGE, array(
'$sTempId' => $sTempId,
'$sUser' => UserRights::GetUser(),
'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'],
));
return false;
}
// Delete all "pending" InlineImages for this form
$sOQL = 'SELECT InlineImage WHERE temp_id = :temp_id';
$oSearch = DBObjectSearch::FromOQL($sOQL);
@@ -257,6 +268,8 @@ class InlineImage extends DBObject
'$sUser' => UserRights::GetUser(),
'HTTP_REFERER' => @$_SERVER['HTTP_REFERER'],
));
return true;
}
/**

View File

@@ -911,9 +911,21 @@ class DeprecatedCallsLog extends LogAPI
$iStackCallerMethodLevel = $iStackDeprecatedMethodLevel + 1; // level 3 = caller of the deprecated method
if (array_key_exists($iStackCallerMethodLevel, $aStack)) {
$sCallerObject = $aStack[3]['class'];
$sCallerMethod = $aStack[3]['function'];
$sMessage .= " ({$sCallerObject}::{$sCallerMethod})";
$sCallerObject = $aStack[$iStackCallerMethodLevel]['class'] ?? null;
$sCallerMethod = $aStack[$iStackCallerMethodLevel]['function'] ?? null;
$sMessage .= ' (';
if (!is_null($sCallerObject)) {
$sMessage .= "{$sCallerObject}::{$sCallerMethod}";
} else {
$sCallerMethodFile = $aStack[$iStackCallerMethodLevel]['file'];
$sCallerMethodLine = $aStack[$iStackCallerMethodLevel]['line'];
if (!is_null($sCallerMethod)) {
$sMessage .= "call to {$sCallerMethod}() in {$sCallerMethodFile}#L{$sCallerMethodLine}";
} else {
$sMessage .= "{$sCallerMethodFile}#L{$sCallerMethodLine}";
}
}
$sMessage .= ')';
}
if (!empty($errstr)) {

View File

@@ -17,6 +17,8 @@
// along with iTop. If not, see <http://www.gnu.org/licenses/>
//
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
require_once APPROOT.'core/modulehandler.class.inc.php';
require_once APPROOT.'core/querymodifier.class.inc.php';
require_once APPROOT.'core/metamodelmodifier.inc.php';
@@ -752,17 +754,56 @@ abstract class MetaModel
/**
* @param string $sClass
* @param string $sType {@see \Combodo\iTop\Core\MetaModel\FriendlyNameType}
*
* @return array
* @throws \CoreException
* @throws \DictExceptionMissingString
*
* @since 3.0.0 N°580 New $sType parameter
*/
final public static function GetNameSpec($sClass)
final public static function GetNameSpec($sClass, $sType = FriendlyNameType::SHORT)
{
self::_check_subclass($sClass);
$nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"];
switch ($sType) {
case FriendlyNameType::COMPLEMENTARY:
if (!isset(self::$m_aClassParams[$sClass]["complementary_name_attcode"])) {
return [$sClass, []];
}
$nameRawSpec = self::$m_aClassParams[$sClass]["complementary_name_attcode"];
$sDictName = 'ComplementaryName';
break;
case FriendlyNameType::LONG:
$nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"];
if (!isset(self::$m_aClassParams[$sClass]["complementary_name_attcode"])) {
return self::GetNameSpec($sClass, FriendlyNameType::SHORT);
}
$complementaryNameRawSpec = self::$m_aClassParams[$sClass]["complementary_name_attcode"];
if (is_array($nameRawSpec)) {
if (is_array($complementaryNameRawSpec)) {
$nameRawSpec = merge($nameRawSpec, $complementaryNameRawSpec);
} elseif (!empty($nameRawSpec)) {
$nameRawSpec = merge($nameRawSpec, [$complementaryNameRawSpec]);
}
} elseif (empty($nameRawSpec)) {
$nameRawSpec = $complementaryNameRawSpec;
} else {
if (is_array($complementaryNameRawSpec)) {
$nameRawSpec = merge([$nameRawSpec], $complementaryNameRawSpec);
} elseif (!empty($nameRawSpec)) {
$nameRawSpec = [$nameRawSpec, $complementaryNameRawSpec];
}
}
$sDictName = 'LongName';
break;
default:
$nameRawSpec = self::$m_aClassParams[$sClass]["name_attcode"];
$sDictName = 'Name';
}
if (is_array($nameRawSpec)) {
$sFormat = Dict::S("Class:$sClass/Name", '');
$sFormat = Dict::S("Class:$sClass/$sDictName", '');
if (strlen($sFormat) == 0) {
// Default to "%1$s %2$s..."
for ($i = 1; $i <= count($nameRawSpec); $i++) {
@@ -774,12 +815,12 @@ abstract class MetaModel
}
}
return array($sFormat, $nameRawSpec);
return [$sFormat, $nameRawSpec];
} elseif (empty($nameRawSpec)) {
return array($sClass, array());
return [$sClass, []];
} else {
// string -> attcode
return array('%1$s', array($nameRawSpec));
return ['%1$s', [$nameRawSpec]];
}
}
@@ -787,24 +828,38 @@ abstract class MetaModel
*
* @param string $sClass
* @param bool $bWithAttributeDefinition
* @param string $sType {@see \Combodo\iTop\Core\MetaModel\FriendlyNameType}
*
* @return array of attribute codes used by friendlyname
* @throws \CoreException
* @since 3.0.0
*/
final public static function GetNameAttributes(string $sClass, $bWithAttributeDefinition = false): array
final public static function GetNameAttributes(string $sClass, $bWithAttributeDefinition = false, $sType = FriendlyNameType::SHORT): array
{
self::_check_subclass($sClass);
$rawNameAttCodes = self::$m_aClassParams[$sClass]["name_attcode"];
$aNameAttCodes = [];
if (!is_array($rawNameAttCodes)) {
if (self::IsValidAttCode($sClass, $rawNameAttCodes)) {
$aNameAttCodes[] = $rawNameAttCodes;
if ($sType == FriendlyNameType::SHORT || FriendlyNameType::LONG) {
$rawNameAttCodes = self::$m_aClassParams[$sClass]["name_attcode"];
if (!is_array($rawNameAttCodes)) {
if (self::IsValidAttCode($sClass, $rawNameAttCodes)) {
$aNameAttCodes[] = $rawNameAttCodes;
}
} else {
$aNameAttCodes = $rawNameAttCodes;
}
}
if ($sType == FriendlyNameType::COMPLEMENTARY || FriendlyNameType::LONG) {
$rawNameAttCodes = self::$m_aClassParams[$sClass]["complementary_name_attcode"];
if (!isEmpty($rawNameAttCodes)) {
if (!is_array($rawNameAttCodes)) {
if (self::IsValidAttCode($sClass, $rawNameAttCodes)) {
$aNameAttCodes[] = array_merge($aNameAttCodes, [$rawNameAttCodes]);
}
} else {
$aNameAttCodes = array_merge($rawNameAttCodes, $rawNameAttCodes);
}
}
} else {
$aNameAttCodes = $rawNameAttCodes;
}
if ($bWithAttributeDefinition) {
$aResults = [];
foreach ($aNameAttCodes as $sAttCode) {
@@ -842,68 +897,21 @@ abstract class MetaModel
return $aResults;
}
/**
* @param string $sClass
*
* @return array
* @throws \CoreException
* @throws \DictExceptionMissingString
*/
final static public function GetComplementAttributeSpec($sClass)
{
self::_check_subclass($sClass);
if (!isset(self::$m_aClassParams[$sClass]["name_complement_for_select"]))
{
$sParentClass = static::GetParentClass($sClass);
if (is_null($sParentClass)) {
return array($sClass, array());
} else {
return static::GetComplementAttributeSpec($sParentClass);
}
}
$nameRawSpec = self::$m_aClassParams[$sClass]["name_complement_for_select"];
if (is_array($nameRawSpec))
{
$sFormat = Dict::S("Class:$sClass/ComplementForSelect", '');
if (strlen($sFormat) == 0)
{
// Default to "%1$s %2$s..."
for($i = 1; $i <= count($nameRawSpec); $i++)
{
if (empty($sFormat))
{
$sFormat .= '%'.$i.'$s';
}
else
{
$sFormat .= ' %'.$i.'$s';
}
}
}
return array($sFormat, $nameRawSpec);
}
elseif (empty($nameRawSpec))
{
return array($sClass, array());
}
else
{
// string -> attcode
return array('%1$s', array($nameRawSpec));
}
}
/**
* Get the friendly name expression for a given class
*
* @param string $sClass
* @param string $sType {@see \Combodo\iTop\Core\MetaModel\FriendlyNameType}
*
* @return Expression
* @throws \CoreException
* @throws \DictExceptionMissingString
*
* @since 3.0.0 N°580 New $sType parameter
*/
final public static function GetNameExpression($sClass)
final public static function GetNameExpression($sClass, $sType = FriendlyNameType::SHORT)
{
$aNameSpec = self::GetNameSpec($sClass);
$aNameSpec = self::GetNameSpec($sClass, $sType);
$sFormat = $aNameSpec[0];
$aAttributes = $aNameSpec[1];
@@ -935,14 +943,17 @@ abstract class MetaModel
/**
* @param string $sClass
* @param string $sType {@see \Combodo\iTop\Core\MetaModel\FriendlyNameType}
*
* @return string The friendly name IIF it is equivalent to a single attribute
* @throws \CoreException
* @throws \DictExceptionMissingString
*
* @since 3.0.0 N°580 New $sType parameter
*/
final public static function GetFriendlyNameAttributeCode($sClass)
final public static function GetFriendlyNameAttributeCode($sClass, $sType = FriendlyNameType::SHORT)
{
$aNameSpec = self::GetNameSpec($sClass);
$aNameSpec = self::GetNameSpec($sClass, $sType);
$sFormat = trim($aNameSpec[0]);
$aAttributes = $aNameSpec[1];
if (($sFormat != '') && ($sFormat != '%1$s')) {
@@ -958,13 +969,16 @@ abstract class MetaModel
/**
* Returns the list of attributes composing the friendlyname
*
* @param $sClass
* @param string $sClass
* @param string $sType {@see \Combodo\iTop\Core\MetaModel\FriendlyNameType}
*
* @return array
*
* @since 3.0.0 N°580 New $sType parameter
*/
final public static function GetFriendlyNameAttributeCodeList($sClass)
final public static function GetFriendlyNameAttributeCodeList($sClass, $sType = FriendlyNameType::SHORT)
{
$aNameSpec = self::GetNameSpec($sClass);
$aNameSpec = self::GetNameSpec($sClass, $sType);
$aAttributes = $aNameSpec[1];
return $aAttributes;
@@ -1133,7 +1147,8 @@ abstract class MetaModel
{
self::_check_subclass($sClass);
$oAtt = self::GetAttributeDef($sClass, $sAttCode);
return $oAtt->GetPrerequisiteAttributes();
return $oAtt->GetPrerequisiteAttributes($sClass);
}
/**
@@ -5114,7 +5129,7 @@ abstract class MetaModel
foreach($aErrors as $sClass => $aMessages)
{
echo "<p>Wrong declaration for class <b>$sClass</b></p>\n";
echo "<ul class=\"treeview\">\n";
echo "<ul >\n";
$i = 0;
foreach($aMessages as $sMsg)
{

View File

@@ -168,7 +168,6 @@ class ormCaseLog {
return $aEntries;
}
/**
* Returns a "plain text" version of the log (equivalent to $this->m_sLog) where all the HTML markup from the 'html' entries have been removed
* @return string
@@ -201,6 +200,15 @@ class ormCaseLog {
{
return ($this->m_sLog === null);
}
/**
* @return int The number of entries in this log
* @since 3.0.0
*/
public function GetEntryCount(): int
{
return count($this->m_aIndex);
}
public function ClearModifiedFlag()
{
@@ -570,7 +578,6 @@ class ormCaseLog {
$this->m_bModified = true;
}
public function AddLogEntryFromJSON($oJson, $bCheckUserId = true)
{
if (isset($oJson->user_id))
@@ -647,7 +654,6 @@ class ormCaseLog {
$this->m_bModified = true;
}
public function GetModifiedEntry($sFormat = 'text')
{
$sModifiedEntry = '';
@@ -726,4 +732,3 @@ class ormCaseLog {
return $sText;
}
}
?>

View File

@@ -24,6 +24,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
require_once('MyHelpers.class.inc.php');
/**
@@ -379,41 +381,35 @@ class ValueSetObjects extends ValueSetDefinition
$this->m_aValues = array();
if ($this->m_bAllowAllData)
{
if ($this->m_bAllowAllData) {
$oFilter = DBObjectSearch::FromOQL_AllData($this->m_sFilterExpr);
}
else
{
} else {
$oFilter = DBObjectSearch::FromOQL($this->m_sFilterExpr);
$oFilter->SetShowObsoleteData(utils::ShowObsoleteData());
}
if (!$oFilter) return false;
if (!is_null($this->m_oExtraCondition))
{
if (!$oFilter) {
return false;
}
if (!is_null($this->m_oExtraCondition)) {
$oFilter = $oFilter->Intersect($this->m_oExtraCondition);
}
foreach($this->m_aModifierProperties as $sPluginClass => $aProperties)
{
foreach ($aProperties as $sProperty => $value)
{
foreach ($this->m_aModifierProperties as $sPluginClass => $aProperties) {
foreach ($aProperties as $sProperty => $value) {
$oFilter->SetModifierProperty($sPluginClass, $sProperty, $value);
}
}
//$oExpression = DBObjectSearch::GetPolymorphicExpression($oFilter->GetClass(), 'friendlyname');
$sClass = $oFilter->GetClass();
$sClassAlias = $oFilter->GetClassAlias();
switch ($sOperation)
{
switch ($sOperation) {
case 'equals':
$aAttributes = MetaModel::GetFriendlyNameAttributeCodeList($sClass);
$sClassAlias = $oFilter->GetClassAlias();
$aFilters = array();
$oValueExpr = new ScalarExpression($sContains);
foreach($aAttributes as $sAttribute)
{
foreach ($aAttributes as $sAttribute) {
$oNewFilter = $oFilter->DeepClone();
$oNameExpr = new FieldExpression($sAttribute, $sClassAlias);
$oCondition = new BinaryExpression($oNameExpr, '=', $oValueExpr);
@@ -425,7 +421,6 @@ class ValueSetObjects extends ValueSetDefinition
break;
case 'start_with':
$aAttributes = MetaModel::GetFriendlyNameAttributeCodeList($sClass);
$sClassAlias = $oFilter->GetClassAlias();
$aFilters = array();
$oValueExpr = new ScalarExpression($sContains.'%');
foreach($aAttributes as $sAttribute)
@@ -442,63 +437,67 @@ class ValueSetObjects extends ValueSetDefinition
default:
$oValueExpr = new ScalarExpression('%'.$sContains.'%');
$oNameExpr = new FieldExpression('friendlyname', $oFilter->GetClassAlias());
$oNameExpr = new FieldExpression('friendlyname', $sClassAlias);
$oNewCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
$oFilter->AddConditionExpression($oNewCondition);
break;
}
$oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs, null, $this->m_iLimit, 0, $this->m_bSort);
if (empty($this->m_sValueAttCode))
{
$aAttToLoad = array($oFilter->GetClassAlias() => array('friendlyname'));
}
else
{
$aAttToLoad = array($oFilter->GetClassAlias() => array($this->m_sValueAttCode));
if (empty($this->m_sValueAttCode)) {
$aAttToLoad = ['friendlyname'];
} else {
$aAttToLoad = [$this->m_sValueAttCode];
}
$aComplementAttributeSpec = MetaModel::GetComplementAttributeSpec($sClass);
$sImageAttr = MetaModel::GetImageAttributeCode($sClass);
if (!empty($sImageAttr)) {
$aAttToLoad [] = $sImageAttr;
}
$aComplementAttributeSpec = MetaModel::GetNameSpec($sClass, FriendlyNameType::COMPLEMENTARY);
$sFormatAdditionalField = $aComplementAttributeSpec[0];
$aAdditionalField = $aComplementAttributeSpec[1];
$aAdditionalField = $aComplementAttributeSpec[1];
if (count($aAdditionalField)>0)
{
$aAttToLoad = array_merge ($aAttToLoad, [$oFilter->GetClassAlias() => $aAdditionalField]);
if (count($aAdditionalField) > 0) {
if (is_array($aAdditionalField)) {
$aAttToLoad = array_merge($aAttToLoad, $aAdditionalField);
} else {
$aAttToLoad [] = $aAdditionalField;
}
}
$oObjects->OptimizeColumnLoad($aAttToLoad);
while ($oObject = $oObjects->Fetch())
{
$aData=[];
if (empty($this->m_sValueAttCode))
{
$oObjects->OptimizeColumnLoad([$sClassAlias => $aAttToLoad]);
while ($oObject = $oObjects->Fetch()) {
$aData = [];
if (empty($this->m_sValueAttCode)) {
$aData['label'] = $oObject->GetName();
}
else
{
} else {
$aData['label'] = $oObject->Get($this->m_sValueAttCode);
}
if($oObject->IsObsolete())
{
$aData['obsolescence_flag']='1';
if ($oObject->IsObsolete()) {
$aData['obsolescence_flag'] = '1';
} else {
$aData['obsolescence_flag'] = '0';
}
else
{
$aData['obsolescence_flag']='0';
}
if (count($aAdditionalField)>0)
{
if (count($aAdditionalField) > 0) {
$aArguments = [];
foreach ($aAdditionalField as $sAdditionalField)
{
array_push ($aArguments,$oObject->Get($sAdditionalField));
foreach ($aAdditionalField as $sAdditionalField) {
array_push($aArguments, $oObject->Get($sAdditionalField));
}
$aData['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments);
} else {
$aData['additional_field'] = '';
}
else
{
$aData['additional_field']='';
if (!empty($sImageAttr)) {
/** @var \ormDocument $oImage */
$oImage = $oObject->Get($sImageAttr);
if (!$oImage->IsEmpty()) {
$aData['picture_url'] = $oImage->GetDisplayURL($sClass, $oObject->GetKey(), $sImageAttr);
$aData['initials'] = '';
} else {
$aData['initials'] = utils::ToAcronym($aData['label']);
}
}
$this->m_aValues[$oObject->GetKey()] = $aData;
}

View File

@@ -16,6 +16,8 @@
* You should have received a copy of the GNU Affero General Public License
*/
$ibo-breadcrumbs--margin-right: 16px !default;
$ibo-breadcrumbs--item--text-color: $ibo-color-grey-800 !default;
$ibo-breadcrumbs--item-icon--margin-x: 8px !default;
@@ -27,9 +29,27 @@ $ibo-breadcrumbs--item-label--max-width: 100px !default;
$ibo-breadcrumbs--item-separator--margin-x: 12px !default;
$ibo-breadcrumbs--item-separator--text-color: $ibo-color-grey-500 !default;
$ibo-breadcrumbs--previous-items-list-toggler--text-color: $ibo-color-grey-700 !default;
$ibo-breadcrumbs--previous-items-list-toggler--margin-right: 2 * $ibo-breadcrumbs--item-separator--margin-x !default;
$ibo-breadcrumbs--previous-items-list--top: 37px !default;
$ibo-breadcrumbs--previous-items-list--padding-y: 8px !default;
$ibo-breadcrumbs--previous-items-list--background-color: $ibo-color-white-100 !default;
$ibo-breadcrumbs--previous-item--text-color: $ibo-breadcrumbs--item--text-color !default;
$ibo-breadcrumbs--previous-item--padding-x: 12px !default;
$ibo-breadcrumbs--previous-item--padding-y: 12px !default;
$ibo-breadcrumbs--previous-item-label--max-width: 200px !default;
.ibo-breadcrumbs{
position: relative;
margin-right: $ibo-breadcrumbs--margin-right;
@extend %ibo-full-height-content;
&.ibo-is-overflowing {
justify-content: right;
}
* {
display: flex;
align-items: center;
@@ -40,13 +60,6 @@ $ibo-breadcrumbs--item-separator--text-color: $ibo-color-grey-500 !default;
@extend %ibo-font-ral-med-100;
&:not(:last-child){
&::after{
content: '\f054';
margin: 0 $ibo-breadcrumbs--item-separator--margin-x;
color: $ibo-breadcrumbs--item-separator--text-color;
@extend %fa-solid-base;
}
&:hover{
.ibo-breadcrumbs--item-icon{
> *{
@@ -78,3 +91,50 @@ $ibo-breadcrumbs--item-separator--text-color: $ibo-color-grey-500 !default;
max-width: $ibo-breadcrumbs--item-label--max-width;
@extend %ibo-text-truncated-with-ellipsis;
}
.ibo-breadcrumbs--item,
.ibo-breadcrumbs--previous-items-list-toggler {
&:not(:last-child){
&::after{
content: '\f054';
margin: 0 $ibo-breadcrumbs--item-separator--margin-x;
color: $ibo-breadcrumbs--item-separator--text-color;
@extend %fa-solid-base;
}
}
}
.ibo-breadcrumbs--previous-items-list-toggler {
margin-right: $ibo-breadcrumbs--previous-items-list-toggler--margin-right;
color: $ibo-breadcrumbs--previous-items-list-toggler--text-color !important;
@extend %ibo-font-ral-med-100;
&:not(:last-child) {
&::after {
position: absolute; /* To be outside of the button */
right: -1 * $ibo-breadcrumbs--previous-items-list-toggler--margin-right;
}
}
}
.ibo-breadcrumbs--previous-items-list {
display: flex;
flex-direction: column;
align-items: stretch; /* For the items to occupy the full width */
position: fixed;
top: $ibo-breadcrumbs--previous-items-list--top;
padding: $ibo-breadcrumbs--previous-items-list--padding-y 0;
background-color: $ibo-breadcrumbs--previous-items-list--background-color;
@extend %ibo-elevation-300;
}
.ibo-breadcrumbs--previous-item {
color: $ibo-breadcrumbs--previous-item--text-color;
@extend %ibo-font-ral-med-100;
padding: $ibo-breadcrumbs--previous-item--padding-y $ibo-breadcrumbs--previous-item--padding-x;
.ibo-breadcrumbs--item-label {
max-width: 200px;
}
}

View File

@@ -461,6 +461,7 @@ $ibo-button-colors: (
}
.ibo-button {
position: relative;
display: inline-block; /* Used to allow truncated text on .ibo-button--label */
padding: $ibo-button--padding-y $ibo-button--padding-x;
border: $ibo-button--border;

View File

@@ -36,11 +36,18 @@ $ibo-field--value-decoration--spacing-x: 0.5rem !default;
/* Avoid value to overflow from its container with very long strings (typically URLs) */
/* Note: Some types of attribute must be excluding as it can alter their rendering */
&:not([data-attribute-type="AttributeBlob"]):not([data-attribute-type="AttributeFile"]):not([data-attribute-type="AttributeImage"]):not([data-attribute-type="AttributeCustomFields"]):not(.ibo-input-file-select--container) {
/* We need the rule to apply for the class and all its descendants */
/* We need the rule to apply for the class and all its descendants, hence the "&, & *" */
.ibo-field--value {
* {
&, & * {
word-break: break-word;
white-space: pre-line;
white-space: inherit; /* Here we don't put break-spaces as it would put ".ibo-field-small .ibo-field-value" on a new line due to the spaces/indentation of the HTML templates. For now we rather have this rule than diminish the templates readability/maintenability */
}
}
&.ibo-field-large {
.ibo-field--value {
&, & * {
white-space: break-spaces; /* For large fields we don't have the issue stated above */
}
}
}
}
@@ -57,7 +64,6 @@ $ibo-field--value-decoration--spacing-x: 0.5rem !default;
.ibo-field--label {
position: relative; /* Necessary for fullscreen toggler */
display: flex;
justify-content: space-between;
align-items: center;
max-width: initial;
width: 100%;
@@ -113,7 +119,7 @@ $ibo-field--value-decoration--spacing-x: 0.5rem !default;
@extend %ibo-hyperlink-inherited-colors;
@extend %ibo-fully-centered-content;
@extend %ibo-font-size-100;
@extend %ibo-font-size-50;
&:hover {
background-color: $ibo-field--fullscreen-toggler--background-color--on-hover;
@@ -138,6 +144,9 @@ $ibo-field--value-decoration--spacing-x: 0.5rem !default;
}
}
}
.ibo-field--label-small .ibo-field--label{
width: 145px;
}
.ibo-field--value {
display: table;
width: 100%;

View File

@@ -894,25 +894,23 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
border-bottom-color: transparent;
}
}
.sf_results_area {
.ibo-datatable-panel.ibo-is-sticking {
.ibo-panel--header {
z-index: 0;
}
.ibo-datatable--toolbar {
position: fixed;
z-index: 2;
padding-bottom: 4px;
background-color: $ibo-search-results-area--datatable-toolbar--background-color--is-sticking;
border-left: $ibo-search-results-area--datatable-toolbar--border--is-sticking;
border-right: $ibo-search-results-area--datatable-toolbar--border--is-sticking;
}
.dataTables_scrollHead {
position: fixed !important; /* Important is required as the property is already set in the style attribute by the JS lib */
z-index: 2;
background-color: $ibo-search-results-area--datatable-scrollhead--background-color--is-sticking;
border-left: $ibo-search-results-area--datatable-scrollhead--border--is-sticking !important; /* Unfortunately the !important is necessary to overload the lib style attribute */
border-right: $ibo-search-results-area--datatable-scrollhead--border--is-sticking !important; /* Unfortunately the !important is necessary to overload the lib style attribute */
}
.ibo-datatable-panel.ibo-is-sticking {
.ibo-panel--header {
z-index: 0;
}
.ibo-datatable--toolbar {
position: fixed;
z-index: 2;
padding-bottom: 4px;
background-color: $ibo-search-results-area--datatable-toolbar--background-color--is-sticking;
border-left: $ibo-search-results-area--datatable-toolbar--border--is-sticking;
border-right: $ibo-search-results-area--datatable-toolbar--border--is-sticking;
}
.dataTables_scrollHead {
position: fixed !important; /* Important is required as the property is already set in the style attribute by the JS lib */
z-index: 2;
background-color: $ibo-search-results-area--datatable-scrollhead--background-color--is-sticking;
border-left: $ibo-search-results-area--datatable-scrollhead--border--is-sticking !important; /* Unfortunately the !important is necessary to overload the lib style attribute */
border-right: $ibo-search-results-area--datatable-scrollhead--border--is-sticking !important; /* Unfortunately the !important is necessary to overload the lib style attribute */
}
}

View File

@@ -34,6 +34,11 @@ $ibo-input-select--select-wrapper--action-button--margin-right: 20px !default;
$ibo-input-select--action-button--padding-left: 6px !default;
$ibo-input-select--action-button--padding-right: 2px !default;
$ibo-input-select--autocomplete-item-image--size: 25px !default;
$ibo-input-select--autocomplete-item-image--margin-right: 0.5rem !default;
$ibo-input-select--autocomplete-item-image--background-color: $ibo-color-blue-100 !default;
$ibo-input-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-600 !default;
.ibo-input-select {
display: inline-block;
min-width: $ibo-input-select--value--min-midth;
@@ -160,12 +165,39 @@ $ibo-input-select--action-button--padding-right: 2px !default;
}
.selectize-dropdown {
z-index: 2000; /* Note: This is not great as it does not take into account other elements z-index, but as selectize puts its dropdown under the <body> tag, we cannot have a z-index relative to input container */
z-index: 2000 !important; /* Note: This is not great as it does not take into account other elements z-index, but as selectize puts its dropdown under the <body> tag, we cannot have a z-index relative to input container. "!important" is necessary to overload the default selectize CSS rule 😕 */
max-height: $ibo-input-select-selectize--dropdown--max-height;
overflow-y: auto;
}
.selectize-dropdown.ui-menu .ui-state-active {
margin: unset;
background-color: #f5fafd;
color: #495c68;
margin: unset;
background-color: #f5fafd;
color: #495c68;
}
.ibo-input-select--autocomplete-item {
display: flex;
justify-content: left;
align-items: center;
}
.ibo-input-select--autocomplete-item-image {
width: $ibo-input-select--autocomplete-item-image--size;
height: $ibo-input-select--autocomplete-item-image--size;
/* min-xxx are here to avoid medallion to be horizontally compressed when the title is to long */
min-width: $ibo-input-select--autocomplete-item-image--size;
min-height: $ibo-input-select--autocomplete-item-image--size;
background-position: center center;
background-size: 100%;
border-radius: 100%;
margin-right: $ibo-input-select--autocomplete-item-image--margin-right;
background-color: $ibo-input-select--autocomplete-item-image--background-color;
border: $ibo-input-select--autocomplete-item-image--border;
@extend %ibo-fully-centered-content;
}
.ibo-input-select--autocomplete-item-txt {
white-space: nowrap;
}

View File

@@ -26,6 +26,8 @@ $ibo-top-bar--elements-spacing: 32px !default;
$ibo-top-bar--quick-actions--margin-right: $ibo-top-bar--elements-spacing !default;
$ibo-top-bar--toolbar-dashboard-title--max-width: 350px !default;
/* CSS variables (can be changed directly from the browser) */
:root{
--ibo-top-bar--height: #{$ibo-top-bar--height};
@@ -65,6 +67,8 @@ $ibo-top-bar--quick-actions--margin-right: $ibo-top-bar--elements-spacing !defau
.ibo-top-bar--toolbar-dashboard-title {
@extend %ibo-font-size-250;
@extend %ibo-text-truncated-with-ellipsis;
max-width: $ibo-top-bar--toolbar-dashboard-title--max-width;
}
.ibo-top-bar--toolbar-dashboard-menu-toggler {

View File

@@ -94,6 +94,7 @@ $ibo-activity-panel--load-all-entries--is-hover--margin-left: ($ibo-activity-pan
/* Current or not user specificities */
&.ibo-is-current-user{
flex-direction: row-reverse;
min-width: max-content;
.ibo-activity-entry--medallion{
margin-right: initial;
@@ -201,17 +202,6 @@ $ibo-activity-panel--load-all-entries--is-hover--margin-left: ($ibo-activity-pan
flex-grow: 1; /* So it occupies all the remaining width, which is easier for the user to click */
word-break: break-word; /* To avoid content to overflow its container (typically very long URLs) */
/* Avoid pre (code snippets) to overflow outside the entry */
pre {
white-space: pre-line;
}
/* Avoid table to overflow outside the entry (see N°2127) */
table {
table-layout: fixed;
width: 100%;
}
/* Specific hyperlink color */
a {
color: $ibo-activity-entry--main-information-hyperlink--text-color;

View File

@@ -96,9 +96,12 @@ $ibo-activity-panel--add-caselog-entry-button--right: 12px !default;
$ibo-activity-panel--add-caselog-entry-button--top: 76px + $ibo-activity-panel--add-caselog-entry-button--right !default;
$ibo-activity-panel--add-caselog-entry-button--diameter: 36px !default;
$ibo-activity-panel--add-caselog-entry-button--background-color: $ibo-color-primary-600 !default;
$ibo-activity-panel--add-caselog-entry-button--background-color--on-hover: $ibo-color-primary-500 !default;
$ibo-activity-panel--add-caselog-entry-button--background-color--is-active: $ibo-color-primary-700 !default;
$ibo-activity-panel--add-caselog-entry-button--color: $ibo-color-white-100 !default;
$ibo-activity-panel--add-caselog-entry-button--border-radius: $ibo-border-radius-full !default;
$ibo-activity-panel--add-caselog-entry-button--box-shadow: $ibo-elevation-100 !default;
$ibo-activity-panel--add-caselog-entry-button--hover--box-shadow: $ibo-elevation-200 !default;
$ibo-activity-panel--add-caselog-entry-button--icon--height: 100% !default;
$ibo-activity-panel--add-caselog-entry-button--icon--width: $ibo-activity-panel--add-caselog-entry-button--icon--height !default;
@@ -379,6 +382,7 @@ $ibo-activity-panel--open-icon--margin-left: 0.75rem !default;
border-radius: $ibo-activity-panel--add-caselog-entry-button--border-radius;
box-shadow: $ibo-activity-panel--add-caselog-entry-button--box-shadow;
> i{
text-align: center;
height: $ibo-activity-panel--add-caselog-entry-button--icon--height;
@@ -388,7 +392,13 @@ $ibo-activity-panel--open-icon--margin-left: 0.75rem !default;
}
&:hover {
color: $ibo-activity-panel--add-caselog-entry-button--color;
}
background-color: $ibo-activity-panel--add-caselog-entry-button--background-color--on-hover;
box-shadow: $ibo-activity-panel--add-caselog-entry-button--hover--box-shadow;
}
&:active {
color: $ibo-activity-panel--add-caselog-entry-button--color;
background-color: $ibo-activity-panel--add-caselog-entry-button--background-color--is-active;
}
&.ibo-is-hidden{
display: none;
}

View File

@@ -65,7 +65,7 @@ $ibo-tab--temporary-remote-content--button--hover--color: $ibo-color-grey-200 !d
color: $ibo-tab-container--tab-header--text-color;
&:hover {
&:hover:not(.ui-state-disabled) {
color: $ibo-tab-container--tab-header--text-color--on-hover;
background-color: $ibo-tab-container--tab-header--background-color--on-hover;
}
@@ -137,6 +137,7 @@ $ibo-tab--temporary-remote-content--button--hover--color: $ibo-color-grey-200 !d
.ibo-tab-container--tab-container {
padding: $ibo-tab-container--tab-container--padding-y $ibo-tab-container--tab-container--padding-x;
overflow-x: auto;
}
.ibo-is-scrollable .ibo-tab-container--tab-container--label {

View File

@@ -10,6 +10,7 @@ $ibo-simple-graph--grouping-threshold-additional-context--container--margin-righ
$ibo-simple-graph--grouping-threshold-additional-context--content--margin-right: 1em !default;
$ibo-impact-analysis--graph-zoom-slider--width: 10em !default;
$ibo-impact-analysis--impacted-objects-lists--elements-spacing: 24px !default;
$ibo-display-graph--search-box--criterion--content--padding-y: 0 !default;
$ibo-display-graph--search-box--criterion--content--padding-x: 15px !default;
@@ -108,4 +109,12 @@ $ibo-display-graph--search-box--criterion--content--checkbox--margin-right: 10px
#ReloadMovieBtn {
align-self: flex-end;
}
}
}
#impacted_objects_lists{
> div ~ div{
margin-top: $ibo-impact-analysis--impacted-objects-lists--elements-spacing;
}
}
#impacted_objects_lists_placeholder, #impacted_groups_placeholder{
height: 250px;
}

View File

@@ -23,3 +23,4 @@
@import "font-icon";
@import "typography";
@import "misc";
@import "class-icon";

View File

@@ -0,0 +1,21 @@
$ibo-class-icon--small--size: 32px !default;
$ibo-class-icon--medium--size: 48px !default;
$ibo-class-icon--large--size: 64px !default;
.ibo-class-icon{
&.ibo-is-small{
width: $ibo-class-icon--small--size;
min-width: $ibo-class-icon--small--size;
max-height: $ibo-class-icon--small--size;
}
&.ibo-is-medium{
width: $ibo-class-icon--medium--size;
min-width: $ibo-class-icon--medium--size;
max-height: $ibo-class-icon--medium--size;
}
&.ibo-is-large{
width: $ibo-class-icon--large--size;
min-width: $ibo-class-icon--large--size;
max-height: $ibo-class-icon--large--size;
}
}

View File

@@ -97,7 +97,7 @@ body.ibo-has-fullscreen-descendant {
.ibo-has-fullscreen-descendant {
position: static !important;
overflow: visible !important;
z-index: 9000 !important;
z-index: 1050 !important;
}
/* Used on a fullscreen element (see .ibo-has-fullscreen-descendant) */
@@ -110,7 +110,7 @@ body.ibo-has-fullscreen-descendant {
width: 100vw;
height: 100vh;
overflow: auto;
z-index: 9000;
z-index: 1050;
}
/****************/
@@ -136,6 +136,11 @@ body.ibo-has-fullscreen-descendant {
}
}
.ibo-is-broken-hyperlink {
text-decoration: line-through;
cursor: help;
}
.ibo-is-code {
background-color: $ibo-is-code--background-color;
padding: $ibo-is-code--padding;
@@ -149,8 +154,16 @@ body.ibo-has-fullscreen-descendant {
.ibo-is-html-content {
@extend .content;
code {
color: initial;
/* Force user-generated tables to fit within the container as they often have an hard-coded width */
table {
width: unset !important;
max-width: max-content;
}
/* Preserve original text color in code blocks, except for the Highlight.js blocks which have their own colors */
& > code,
:not(pre.hljs) code {
color: inherit;
}
}

View File

@@ -24,4 +24,5 @@
@import "jquery-multiselect";
@import "datatables";
@import "jquery-treeview";
@import "jquery-blockui";
@import "jquery-blockui";
@import "magnific-popup";

View File

@@ -23,9 +23,12 @@ $ibo-vendors-datatables--page-length-selector--border-color: $ibo-color-grey-500
$ibo-vendors-datatables--page-length-selector--border-radius: $ibo-border-radius-300 !default;
$ibo-vendors-datatables--page-length-selector--border-color--on-focus: $ibo-color-primary-600 !default;
$ibo-vendors-datatables--cell--padding-x: 12px !default;
$ibo-vendors-datatables--cell--padding-y: 10px !default;
$ibo-vendors-datatables--column-sorting-icon--opacity: 0.3 !default;
$ibo-vendors-datatables--column-sorting-icon--opacity--is-sorted: 1 !default;
$ibo-vendors-datatables--column-sorting-icon--right: 1em !default;
$ibo-vendors-datatables--column-sorting-icon--right: calc((#{$ibo-vendors-datatables--cell--padding-x} - 8px) / 2) !default;
$ibo-vendors-datatables--column-sorting-icon--content: "\f0dc" !default;
$ibo-vendors-datatables--column-sorting-icon--content--is-sorted-asc: "\f0d8" !default;
$ibo-vendors-datatables--column-sorting-icon--content--is-sorted-desc: "\f0d7" !default;
@@ -137,7 +140,7 @@ $ibo-vendors-datatables--row-highlight--colors:(
.dataTable {
th, td {
position: relative;
padding: 10px 12px;
padding: $ibo-vendors-datatables--cell--padding-y $ibo-vendors-datatables--cell--padding-x;
@extend %ibo-font-ral-med-100; /* Necessary to set the font-size as its container can have a different one */
}

View File

@@ -134,4 +134,4 @@ button.ui-multiselect {
button.ui-multiselect .fas{
float:right;
padding-left:10px;
}
}

View File

@@ -599,4 +599,9 @@ $ibo-vendors-jqueryui--ui-slider--ui-slider-handle--hover--border-color: $ibo-co
padding: 0;
position: absolute;
width: 1px;
}
// Tabs
.ui-tabs-tab.ui-state-disabled a{
cursor: not-allowed !important;
}

View File

@@ -0,0 +1,6 @@
.mfp-bg{
z-index: 1100;
}
.mfp-wrap{
z-index: 1101;
}

View File

@@ -179,7 +179,9 @@ a:hover {
.v-spacer {
padding-top: 1em;
}
#login-sso-buttons{
padding: 0 10px;
}
.sso-button {
margin: 5px 0px;
position: relative;

View File

@@ -605,7 +605,7 @@ ul.cke_autocomplete_panel, .ibo-quick-create--input.selectize-control.single .se
/* NOTE: Those helpers allow to easily use an icon from libs. like FontAwesome or FontCombodo within a CSS rule (eg. ::after) */
/* To use it, simply "@extend %fa-regular-base" in a rule and put the desired icon "content: '\f054'" */
/******************************************************************************************************************************/
.dataTables_scrollHead thead tr th.sorting::after, .ibo-breadcrumbs--item:not(:last-child)::after, .ibo-prop--apply.ui-state-error:after, .ibo-sort-order::after {
.dataTables_scrollHead thead tr th.sorting::after, .ibo-breadcrumbs--item:not(:last-child)::after, .ibo-prop--apply.ui-state-error:after, .ibo-sort-order::after, .collapsable-options [data-role="setup-collapsable-options--toggler"]::before, #params_summary div.closed .title::before, #params_summary div:not(.closed) .title::before {
font-family: "Font Awesome 5 Free";
font-weight: 900;
-webkit-font-smoothing: antialiased;
@@ -750,7 +750,7 @@ ul.cke_autocomplete_panel, .ibo-quick-create--input.selectize-control.single .se
-moz-font-feature-settings: "lnum";
font-feature-settings: "lnum";
}
.ibo-font-ral-nor-250, .ui-dialog-title, .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message, .ibo-welcome-popup--text {
.ibo-font-ral-nor-250, .ui-dialog-title, .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message, .ibo-welcome-popup--text, #ibo_setup_container .ibo-setup--body .setup-content-title, #ibo_setup_container .ibo-setup--body h2, .setup-end-placeholder a {
font-size: 1.5rem;
font-family: "Raleway", "sans-serif", "system-ui";
font-weight: 400;
@@ -1291,7 +1291,7 @@ ul.cke_autocomplete_panel, .ibo-quick-create--input.selectize-control.single .se
.ibo-is-fullwidth {
width: 100%;
}
ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image, .ibo-panel--header-left, .ibo-panel--icon, .ibo-dashlet-header-static--icon-container, .ibo-input-image--image-view, .ibo-pill, .ibo-title--icon, .ibo-datatable--toolbar-left, .ibo-datatable--toolbar-right, .ibo-field--fullscreen-toggler, .ibo-navigation-menu--bottom-part, .ibo-navigation-menu--user-info, .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture, .ibo-tab-container--tab-toggler, .ibo-tab-container--extra-tabs-list-toggler, .ibo-object-details--status-dot, .ibo-activity-panel--togglers, .ibo-activity-panel--tabs-togglers, .ibo-activity-panel--tab-title, .ibo-activity-panel--tab-toolbar-actions, .ibo-activity-panel--tab-toolbar-action, .ibo-activity-panel--body--placeholder-image, .ibo-activity-panel--body--placeholder-hint, .ibo-activity-panel--closed-cover, .ibo-caselog-entry-form--lock-icon, .ibo-activity-entry--medallion, .ibo-activity-panel--load-more-entries-container, .ibo-activity-panel--load-entries-button {
ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image, .ibo-panel--header-left, .ibo-panel--icon, .ibo-dashlet-header-static--icon-container, .ibo-input-image--image-view, .ibo-select--autocomplete-item-image, .ibo-pill, .ibo-title--icon, .ibo-datatable--toolbar-left, .ibo-datatable--toolbar-right, .ibo-field--fullscreen-toggler, .ibo-navigation-menu--bottom-part, .ibo-navigation-menu--user-info, .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture, .ibo-tab-container--tab-toggler, .ibo-tab-container--extra-tabs-list-toggler, .ibo-object-details--status-dot, .ibo-activity-panel--togglers, .ibo-activity-panel--tabs-togglers, .ibo-activity-panel--tab-title, .ibo-activity-panel--tab-toolbar-actions, .ibo-activity-panel--tab-toolbar-action, .ibo-activity-panel--body--placeholder-image, .ibo-activity-panel--body--placeholder-hint, .ibo-activity-panel--closed-cover, .ibo-caselog-entry-form--lock-icon, .ibo-activity-entry--medallion, .ibo-activity-panel--load-more-entries-container, .ibo-activity-panel--load-entries-button {
display: flex;
justify-content: center;
align-items: center;
@@ -1356,6 +1356,10 @@ body.ibo-has-fullscreen-descendant {
.dataTables_paginate a.paginate_button:hover, .dataTables_paginate .ibo-quick-create--compartment-results--element > .paginate_button.option:hover, .ibo-dashlet-badge--action-list:hover, .ibo-dashlet-badge--action-list:active:hover, .ibo-field--fullscreen-toggler:hover, .search_form_handler a:hover, .search_form_handler .ibo-quick-create--compartment-results--element > .option:hover, .ibo-navigation-menu--menu-filter-clear:hover, .ibo-navigation-menu--menu-filter-hint-close:hover, .ibo-tab-container--tab-toggler:hover, .ibo-tab-container--extra-tabs-list-toggler:hover, .ibo-activity-panel--load-entries-button:hover, .dataTables_paginate a.paginate_button:active, .ibo-dashlet-badge--action-list:hover:active, .ibo-dashlet-badge--action-list:active, .ibo-field--fullscreen-toggler:active, .search_form_handler a:active, .ibo-navigation-menu--menu-filter-clear:active, .ibo-navigation-menu--menu-filter-hint-close:active, .ibo-tab-container--tab-toggler:active, .ibo-tab-container--extra-tabs-list-toggler:active, .ibo-activity-panel--load-entries-button:active {
color: inherit;
}
.ibo-is-broken-hyperlink {
text-decoration: line-through;
cursor: help;
}
.ibo-is-code {
background-color: #f2f2f2;
padding: 1.25rem 1.5rem;
@@ -1364,6 +1368,9 @@ body.ibo-has-fullscreen-descendant {
* A single class to handle WYSIWYG generated content, where only HTML tags are available
* See https://bulma.io/documentation/elements/content/
*/
.ibo-is-html-content code {
color: initial;
}
/***********************************************************************/
/* Sticky headers */
/* */
@@ -1419,6 +1426,10 @@ body.ibo-has-fullscreen-descendant {
*
* You should have received a copy of the GNU Affero General Public License
*/
/**
* customize Bulma content variables
* See https://bulma.io/documentation/elements/content/
*/
/*! bulma.io v0.9.0 | MIT License | github.com/jgthms/bulma */
@keyframes spinAround {
from {
@@ -2964,8 +2975,8 @@ a.box:active {
width: 100%;
}
.content table td, .ibo-is-html-content table td, .content table th, .ibo-is-html-content table th {
border: 1px solid #dbdbdb;
border-width: 0 0 1px;
border: 1px solid black;
border-width: 1px;
padding: 0.5em 0.75em;
vertical-align: top;
}
@@ -2976,12 +2987,12 @@ a.box:active {
text-align: inherit;
}
.content table thead td, .ibo-is-html-content table thead td, .content table thead th, .ibo-is-html-content table thead th {
border-width: 0 0 2px;
border-width: 1px;
color: #363636;
}
.content table tfoot td, .ibo-is-html-content table tfoot td, .content table tfoot th, .ibo-is-html-content table tfoot th {
border-width: 2px 0 0;
color: #363636;
border-width: 1px;
color: black;
}
.content table tbody tr:last-child td, .ibo-is-html-content table tbody tr:last-child td, .content table tbody tr:last-child th, .ibo-is-html-content table tbody tr:last-child th {
border-bottom-width: 0;
@@ -10349,7 +10360,7 @@ a.has-text-danger-dark:hover, .ibo-quick-create--compartment-results--element >
padding: 0.9rem !important;
box-shadow: 0 0px 3px 2px inset rgba(0, 0, 0, 0.4);
border-radius: 3px;
white-space: pre-wrap;
white-space: pre-line;
}
/* Mentions in caselogs */
/* Note: Mind the "ul", it allows us to have a more precise rule than the original plugin's CSS so we can override it */
@@ -10366,14 +10377,19 @@ ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item {
ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image {
width: 25px;
height: 25px;
/* min-xxx are here to avoid medallion to be horizontally compressed when the title is to long */
min-width: 25px;
min-height: 25px;
background-position: center center;
background-size: 100%;
border-radius: 100%;
margin-right: 0.5rem;
background-color: #e1e7ec;
background-color: #ebf8ff;
border: 1px solid #929fb1;
}
ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title {
white-space: nowrap;
/* Here we don't want to truncate the text as in an autocomplete we might have similar values and we need the user to see the entire text to be able to differenciate them */
color: #3A3A3A;
}
/*!
@@ -10828,6 +10844,9 @@ ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title {
cursor: default;
z-index: 100;
}
.ui-autocomplete .ui-menu-item {
padding: 0;
}
.ui-autocomplete-input {
width: auto;
display: inline;
@@ -13453,6 +13472,27 @@ img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-naviga
background-color: #f5fafd;
color: #495c68;
}
.ibo-select--autocomplete-item {
display: flex;
justify-content: left;
align-items: center;
}
.ibo-select--autocomplete-item-image {
width: 25px;
height: 25px;
/* min-xxx are here to avoid medallion to be horizontally compressed when the title is to long */
min-width: 25px;
min-height: 25px;
background-position: center center;
background-size: 100%;
border-radius: 100%;
margin-right: 0.5rem;
background-color: #ebf8ff;
border: 1px solid #929fb1;
}
.ibo-select--autocomplete-item-txt {
white-space: nowrap;
}
.ibo-input-select-icon > img {
max-height: 100%;
max-width: 100%;
@@ -13772,7 +13812,7 @@ img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-naviga
}
.ibo-field:not([data-attribute-type="AttributeBlob"]):not([data-attribute-type="AttributeFile"]):not([data-attribute-type="AttributeImage"]):not([data-attribute-type="AttributeCustomFields"]):not(.ibo-input-file-select--container) .ibo-field--value * {
word-break: break-word;
white-space: pre-wrap;
white-space: pre-line;
}
.ibo-field ~ .ibo-field {
margin-top: 16px;
@@ -14405,7 +14445,7 @@ img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-naviga
}
.search_form_handler .sf_criterion_area .sf_more_criterion > * {
background-color: white;
color: #dd6c20;
color: #37474f;
}
.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_title {
margin-right: 7px;
@@ -16240,7 +16280,7 @@ input:checked + .ibo-dashboard--slider:after {
/* Avoid pre (code snippets) to overflow outside the entry */
}
.ibo-activity-entry--main-information-content pre {
white-space: pre-wrap;
white-space: pre-line;
/* Avoid table to overflow outside the entry (see N°2127) */
}
.ibo-activity-entry--main-information-content table {
@@ -17139,6 +17179,8 @@ tr.row_added td {
*/
}
#ibo-main-content .ibo-panel.ibo-has-sticky-header {
margin-bottom: 200px;
/* Add a margin below the panel so the dropdown lists can open without problem (N°4039) */
/* Stickable header rules */
}
#ibo-main-content .ibo-panel.ibo-has-sticky-header > .ibo-sticky-sentinel-top {
@@ -17450,10 +17492,9 @@ h3.clickable.open {
fieldset {
border: none;
padding: 0;
margin: 30px 0 0 0;
margin: 15px 0 0 0;
}
fieldset > legend {
margin-top: 25px;
margin-bottom: 7px;
padding-bottom: 7px;
width: 100%;
@@ -17505,14 +17546,11 @@ body {
border-bottom: none;
border-radius: 3px 3px 0 0;
}
#ibo_setup_container .ibo-setup--header img {
#ibo_setup_container .ibo-setup--header .ibo-title--icon {
border: 0;
vertical-align: middle;
margin-right: 20px;
}
#ibo_setup_container .ibo-setup--header h1 {
margin-top: 10px;
}
#ibo_setup_container .ibo-setup--body {
display: flex;
flex-direction: column;
@@ -17562,10 +17600,10 @@ body {
margin-top: 5px;
}
#ibo_setup_container .ibo-setup--body .ibo-fieldset, #ibo_setup_container .ibo-setup--body fieldset {
margin-top: 25px;
margin-top: 12px;
}
#ibo_setup_container .ibo-setup--body .ibo-fieldset ~ .ibo-fieldset, #ibo_setup_container .ibo-setup--body fieldset ~ .ibo-fieldset, #ibo_setup_container .ibo-setup--body .ibo-fieldset ~ fieldset, #ibo_setup_container .ibo-setup--body fieldset ~ fieldset {
margin-top: 25px;
margin-top: 12px;
}
#ibo_setup_container .ibo-setup--body .ibo-field {
margin-top: 5px;
@@ -17599,6 +17637,19 @@ body {
max-height: 400px;
overflow: auto;
}
#ibo_setup_container .ibo-setup--body .ibo-input, #ibo_setup_container .ibo-setup--body .ui-autocomplete-input, #ibo_setup_container .ibo-setup--body .ui-multiselect, #ibo_setup_container .ibo-setup--body .dataTables_length select, .dataTables_length #ibo_setup_container .ibo-setup--body select, #ibo_setup_container .ibo-setup--body .ui_tpicker_hour_slider > select, #ibo_setup_container .ibo-setup--body .ui_tpicker_minute_slider > select, #ibo_setup_container .ibo-setup--body .ui_tpicker_second_slider > select, #ibo_setup_container .ibo-setup--body .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"], .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content #ibo_setup_container .ibo-setup--body input[type="text"], #ibo_setup_container .ibo-setup--body .search_form_handler .sf_filter .sff_input_wrapper input[type="text"], .search_form_handler .sf_filter .sff_input_wrapper #ibo_setup_container .ibo-setup--body input[type="text"] {
width: auto;
display: inline-block;
}
#ibo_setup_container .ibo-setup--body table td {
white-space: nowrap;
line-height: 2.5rem;
padding-right: 8px;
padding-bottom: 1rem;
}
#ibo_setup_container .ibo-setup--body .setup-content-title, #ibo_setup_container .ibo-setup--body h2 {
margin-bottom: 18px;
}
.ibo-setup--button-bar {
margin-top: 16px;
}
@@ -17611,4 +17662,122 @@ body {
.ibo-setup-summary-title {
font-size: 1.17rem;
}
.setup-prefix-toggler--input--container, .setup-tls--input--container, .setup-disk-location--input--container, .setup-backup--input--container {
display: flex;
line-height: 2.5rem;
margin: 1rem 0;
}
.setup-prefix-toggler--input--container input, .setup-tls--input--container input, .setup-disk-location--input--container input, .setup-backup--input--container input {
margin: 0 8px;
}
.setup-disk-location--input--container input, .setup-backup--input--container input {
flex-grow: 1;
}
.collapsable-options {
margin-bottom: 18px;
}
.collapsable-options [data-role="setup-collapsable-options--toggler"]::before {
margin-right: 8px;
cursor: pointer;
}
.collapsable-options:not(.setup-is-opened) [data-role="setup-collapsable-options--toggler"]::before {
content: '\f078';
}
.collapsable-options.setup-is-opened [data-role="setup-collapsable-options--toggler"]::before {
content: '\f077';
}
.setup-input--hint--icon {
color: #6e7a8a;
}
.setup-invalid-field--icon {
color: #c53030;
margin-left: 8px;
}
.setup-accept-licenses {
margin-top: 18px;
}
.setup-accept-licenses input {
margin-right: 8px;
}
.module-selection-banner {
display: flex;
}
.module-selection-banner > img {
margin-right: 12px;
}
.setup-end-placeholder {
display: flex;
flex-direction: row;
align-items: center;
}
.setup-end-placeholder > div {
padding: 0px 15px;
}
.setup-end-placeholder a {
display: flex;
flex-direction: column;
align-items: center;
}
.setup-end-placeholder a svg {
max-height: 150px;
margin-bottom: 15px;
width: auto;
}
.setup-extension--icon {
margin-right: 5px;
color: #2b6bb0;
font-size: 1.33rem;
}
/* integrityCheck: end (do not remove/edit) */
/* Legacy inline stuff */
#params_summary {
overflow: auto;
}
#params_summary div {
width: 100%;
margin-top: 0;
padding-top: 0.5em;
padding-left: 0;
}
#params_summary div ul {
margin-left: 0;
padding-left: 40px;
}
#params_summary div.closed ul {
display: none;
}
#params_summary div li {
list-style: none;
width: 100%;
margin-left: 0;
padding-left: 0em;
}
.title {
padding-left: 20px;
font-weight: bold;
cursor: pointer;
}
#params_summary div.closed .title::before {
margin-right: 5px;
content: '\f078';
}
#params_summary div:not(.closed) .title::before {
margin-right: 5px;
content: '\f077';
}
#progress_content {
height: 200px;
overflow: auto;
text-align: center;
}
#installation_progress {
display: none;
}
#fresh_content {
border: 0;
min-height: 300px;
min-width: 600px;
display: none;
margin-left: auto;
margin-right: auto;
}

View File

@@ -288,10 +288,9 @@ h3.clickable.open {
fieldset {
border: none;
padding: 0;
margin: 30px 0 0 0;
margin: 15px 0 0 0;
> legend {
margin-top: 25px;
margin-bottom: 7px;
padding-bottom: 7px;
width: 100%;
@@ -367,15 +366,11 @@ body {
border-bottom: none;
border-radius: $ibo-border-radius-300 $ibo-border-radius-300 0 0;
img {
.ibo-title--icon {
border: 0;
vertical-align: middle;
margin-right: 20px;
}
h1 {
margin-top: 10px;
}
}
.ibo-setup--body {
@@ -433,10 +428,10 @@ body {
}
.ibo-fieldset {
margin-top: 25px;
margin-top: 12px;
& ~ .ibo-fieldset {
margin-top: 25px;
margin-top: 12px;
}
}
@@ -485,6 +480,22 @@ body {
overflow: auto;
}
}
.ibo-input{
width: auto;
display: inline-block;
}
table {
td{
white-space: nowrap;
line-height: 2.5rem;
padding-right: 8px;
padding-bottom: 1rem;
}
}
.setup-content-title, h2{
@extend %ibo-font-ral-nor-250;
margin-bottom: 18px;
}
}
}
@@ -506,4 +517,133 @@ body {
font-size: $ibo-font-size-150;
}
/* integrityCheck: end (do not remove/edit) */
.setup-prefix-toggler--input--container, .setup-tls--input--container, .setup-disk-location--input--container, .setup-backup--input--container {
display: flex;
line-height: 2.5rem;
margin: 1rem 0;
input{
margin: 0 8px;
}
}
.setup-disk-location--input--container, .setup-backup--input--container{
input{
flex-grow: 1;
}
}
.collapsable-options{
margin-bottom: 18px;
[data-role="setup-collapsable-options--toggler"]::before {
margin-right: 8px;
@extend %fa-solid-base;
cursor: pointer;
}
&:not(.setup-is-opened) [data-role="setup-collapsable-options--toggler"]::before{
content: '\f078';
}
&.setup-is-opened [data-role="setup-collapsable-options--toggler"]::before{
content: '\f077';
}
}
.setup-input--hint--icon{
color: $ibo-color-grey-700
}
.setup-invalid-field--icon{
color: $ibo-color-red-700;
margin-left: 8px;
}
.setup-accept-licenses{
margin-top: 18px;
input{
margin-right: 8px;
}
}
.module-selection-banner{
display: flex;
>img{
margin-right: 12px;
}
}
.setup-end-placeholder{
display: flex;
flex-direction: row;
align-items: center;
>div {
padding: 0px 15px;
}
a {
display: flex;
flex-direction: column;
align-items: center;
@extend %ibo-font-ral-nor-250;
svg{
max-height: 150px;
margin-bottom: 15px;
width: auto;
}
}
}
.setup-extension--icon{
margin-right: 5px;
color: $ibo-color-blue-700;
font-size: $ibo-font-size-200;
}
/* integrityCheck: end (do not remove/edit) */
/* Legacy inline stuff */
#params_summary {
overflow: auto;
}
#params_summary div {
width:100%;
margin-top:0;
padding-top: 0.5em;
padding-left: 0;
}
#params_summary div ul {
margin-left:0;
padding-left: 40px;
}
#params_summary div.closed ul {
display:none;
}
#params_summary div li {
list-style: none;
width: 100%;
margin-left:0;
padding-left: 0em;
}
.title {
padding-left: 20px;
font-weight: bold;
cursor: pointer;
}
#params_summary div {
&.closed .title::before {
margin-right: 5px;
@extend %fa-solid-base;
content: '\f078';
}
&:not(.closed) .title::before {
margin-right: 5px;
@extend %fa-solid-base;
content: '\f077';
}
}
#progress_content {
height: 200px;
overflow: auto;
text-align: center;
}
#installation_progress {
display: none;
}
#fresh_content{
border: 0;
min-height: 300px;
min-width: 600px;
display:none;
margin-left: auto;
margin-right: auto;
}

47
css/unauthenticated.css Normal file
View File

@@ -0,0 +1,47 @@
/*!
* Copyright (C) 2013-2020 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
body {
display: block;
}
/* Landing page */
#uwp-main-container {
margin-top: 40px;
}
#uwp-main-container #uwp-logo, #uwp-main-container #uwp-title {
vertical-align: middle;
}
#uwp-main-container #uwp-title {
margin-left: 25px;
font-size: 20px;
font-weight: bold;
}
#uwp-main-container #uwp-description {
margin-bottom: 25px;
}
#uwp-main-container .uwp-text-hint--icon {
font-size: 12px;
margin-left: 5px;
color: #939191;
}
#uwp-main-container #uwp-bottom-buttons {
margin-top: 25px;
text-align: right;
}
#uwp-main-container #uwp-bottom-buttons .btn ~ .btn {
margin-left: 8px;
}

54
css/unauthenticated.scss Normal file
View File

@@ -0,0 +1,54 @@
/*!
* Copyright (C) 2013-2020 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
body{
display: block;
}
/* Landing page */
#uwp-main-container{
margin-top: 40px;
#uwp-logo,
#uwp-title{
vertical-align: middle;
}
#uwp-title{
margin-left: 25px;
font-size: 20px;
font-weight: bold;
}
#uwp-description{
margin-bottom: 25px;
}
.uwp-text-hint--icon{
font-size: 12px;
margin-left: 5px;
color: #939191;
}
#uwp-bottom-buttons {
margin-top: 25px;
text-align: right;
.btn ~ .btn{
margin-left: 8px;
}
}
}

View File

@@ -37,5 +37,5 @@
//
Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Class:UserExternal' => 'Externí uživatel',
'Class:UserExternal+' => 'Uživatel definovaný mimo iTop',
'Class:UserExternal+' => 'Uživatel definovaný mimo '.ITOP_APPLICATION_SHORT,
));

View File

@@ -22,5 +22,5 @@
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserExternal' => 'Extern Bruger',
'Class:UserExternal+' => 'Bruger udenfor iTop',
'Class:UserExternal+' => 'Bruger udenfor '.ITOP_APPLICATION_SHORT,
));

View File

@@ -24,5 +24,5 @@
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserExternal' => 'Externer Benutzer',
'Class:UserExternal+' => 'Externe authentifizierter iTop-Benutzer',
'Class:UserExternal+' => 'Externe authentifizierter '.ITOP_APPLICATION_SHORT.'-Benutzer',
));

View File

@@ -37,5 +37,5 @@
Dict::Add('EN US', 'English', 'English', array(
'Class:UserExternal' => 'External user',
'Class:UserExternal+' => 'User authentified outside of iTop',
'Class:UserExternal+' => 'User authentified outside of '.ITOP_APPLICATION_SHORT,
));

View File

@@ -36,5 +36,5 @@
//
Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'Class:UserExternal' => 'Usuario Externo',
'Class:UserExternal+' => 'Usuario Autenticado fuera de iTop',
'Class:UserExternal+' => 'Usuario Autenticado fuera de '.ITOP_APPLICATION_SHORT,
));

View File

@@ -20,6 +20,6 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserExternal' => 'Utilisateur externe à iTop',
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur d\'iTop',
'Class:UserExternal' => 'Utilisateur externe à '.ITOP_APPLICATION_SHORT,
'Class:UserExternal+' => 'Utilisateur authentifié à l\'extérieur de '.ITOP_APPLICATION_SHORT,
));

View File

@@ -35,5 +35,5 @@
//
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:UserExternal' => 'Esterno utente',
'Class:UserExternal+' => 'Utente autenticato al di fuori di iTop',
'Class:UserExternal+' => 'Utente autenticato al di fuori di '.ITOP_APPLICATION_SHORT,
));

View File

@@ -13,5 +13,5 @@
//
Dict::Add('RU RU', 'Russian', 'Русский', array(
'Class:UserExternal' => 'Внешний пользователь',
'Class:UserExternal+' => 'Пользователь, аутентифицируемый вне iTop',
'Class:UserExternal+' => 'Пользователь, аутентифицируемый вне '.ITOP_APPLICATION_SHORT,
));

View File

@@ -36,5 +36,5 @@
//
Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Class:UserExternal' => 'Harici kullanıcı',
'Class:UserExternal+' => 'iTop dışında yetki kontrolü yapılan kullanıcı',
'Class:UserExternal+' => ITOP_APPLICATION_SHORT.' dışında yetki kontrolü yapılan kullanıcı',
));

View File

@@ -35,5 +35,5 @@
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserExternal' => '外部用户',
'Class:UserExternal+' => '用户在iTop 外部验证身份',
'Class:UserExternal+' => '用户在 '.ITOP_APPLICATION_SHORT.' 外部验证身份',
));

View File

@@ -36,8 +36,8 @@
// Class: UserLocal
//
Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Class:UserLocal' => 'interní uživatel iTop',
'Class:UserLocal+' => 'Uživatel ověřen interně v iTop',
'Class:UserLocal' => 'interní uživatel '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Uživatel ověřen interně v '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Heslo',
'Class:UserLocal/Attribute:password+' => '',

View File

@@ -21,8 +21,8 @@
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserLocal' => 'iTop-Bruger',
'Class:UserLocal+' => 'Bruger der godkendes af iTop',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.'-Bruger',
'Class:UserLocal+' => 'Bruger der godkendes af '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'Brugerens password',

View File

@@ -23,8 +23,8 @@
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserLocal' => 'iTop-Benutzer',
'Class:UserLocal+' => 'Benutzer, der von iTop authentifiziert wird',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.'-Benutzer',
'Class:UserLocal+' => 'Benutzer, der von '.ITOP_APPLICATION_SHORT.' authentifiziert wird',
'Class:UserLocal/Attribute:password' => 'Passwort',
'Class:UserLocal/Attribute:password+' => 'Benutzerpasswort',
@@ -43,5 +43,5 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort entspricht nicht dem in den Konfigurationsregeln hinterlegten RegEx-Ausdruck',
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine iTop Erweiterung'
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine '.ITOP_APPLICATION_SHORT.' Erweiterung'
));

View File

@@ -36,8 +36,8 @@
//
Dict::Add('EN US', 'English', 'English', array(
'Class:UserLocal' => 'iTop user',
'Class:UserLocal+' => 'User authentified by iTop',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' user',
'Class:UserLocal+' => 'User authentified by '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'User authentication string',

View File

@@ -35,8 +35,8 @@
// Class: UserLocal
//
Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'Class:UserLocal' => 'Usuario de iTop',
'Class:UserLocal+' => 'Usuario Autenticado vía iTop',
'Class:UserLocal' => 'Usuario de '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Usuario Autenticado vía '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Contraseña',
'Class:UserLocal/Attribute:password+' => 'Contraseña',

View File

@@ -20,8 +20,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserLocal' => 'Utilisateur iTop',
'Class:UserLocal+' => 'Utilisateur authentifié par iTop',
'Class:UserLocal' => 'Utilisateur '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Utilisateur authentifié par '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Mot de passe',
'Class:UserLocal/Attribute:password+' => '',

View File

@@ -20,7 +20,7 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:UserLocal' => 'iTop felhasználó',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' felhasználó',
'Class:UserLocal+' => '',
'Class:UserLocal/Attribute:password' => 'Jelszó',
'Class:UserLocal/Attribute:password+' => '',

View File

@@ -34,8 +34,8 @@
// Class: UserLocal
//
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:UserLocal' => 'Utente iTop',
'Class:UserLocal+' => 'Utente autenticato da iTop',
'Class:UserLocal' => 'Utente '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Utente autenticato da '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'user authentication string',

View File

@@ -21,8 +21,8 @@
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:UserLocal' => 'iTopユーザー',
'Class:UserLocal+' => 'iTopローカル認証ユーザー',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.'ユーザー',
'Class:UserLocal+' => ITOP_APPLICATION_SHORT.'ローカル認証ユーザー',
'Class:UserLocal/Attribute:password' => 'パスワード',
'Class:UserLocal/Attribute:password+' => '認証文字列',

View File

@@ -25,10 +25,10 @@
// Class: UserLocal
//
Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Class:UserLocal' => 'iTop-gebruiker',
'Class:UserLocal+' => 'Gebruiker die aanmeldt met gegevens aangemaakt in het gebruikersbeheer van iTop',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.'-gebruiker',
'Class:UserLocal+' => 'Gebruiker die aanmeldt met gegevens aangemaakt in het gebruikersbeheer van '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Wachtwoord',
'Class:UserLocal/Attribute:password+' => 'Het wachtwoord waarmee de gebruiker zich aanmeldt bij iTop',
'Class:UserLocal/Attribute:password+' => 'Het wachtwoord waarmee de gebruiker zich aanmeldt bij '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:expiration' => 'Wachtwoord verloopt',
'Class:UserLocal/Attribute:expiration+' => 'Of het wachtwoord al dan niet verlopen is (vereist een extensie vooraleer dit werkt)',

View File

@@ -12,8 +12,8 @@
// Class: UserLocal
//
Dict::Add('RU RU', 'Russian', 'Русский', array(
'Class:UserLocal' => 'Пользователь iTop',
'Class:UserLocal+' => 'Пользователь, аутентифицируемый через iTop',
'Class:UserLocal' => 'Пользователь '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Пользователь, аутентифицируемый через '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Пароль',
'Class:UserLocal/Attribute:password+' => 'Строка аутентификации пользователя',

View File

@@ -33,7 +33,7 @@
// Class: UserLocal
//
Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'Class:UserLocal' => 'iTop užívateľ',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' užívateľ',
'Class:UserLocal+' => '',
'Class:UserLocal/Attribute:password' => 'Heslo',
'Class:UserLocal/Attribute:password+' => '',

View File

@@ -35,8 +35,8 @@
// Class: UserLocal
//
Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Class:UserLocal' => 'iTop kullanıcısı',
'Class:UserLocal+' => 'Yetki kontorlünü iTop tarafından yapılan kullanıcı',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' kullanıcısı',
'Class:UserLocal+' => 'Yetki kontorlünü '.ITOP_APPLICATION_SHORT.' tarafından yapılan kullanıcı',
'Class:UserLocal/Attribute:password' => 'Şifre',
'Class:UserLocal/Attribute:password+' => 'şifre',

View File

@@ -34,8 +34,8 @@
// Class: UserLocal
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Class:UserLocal' => 'iTop 用户',
'Class:UserLocal+' => '用户由 iTop 验证身份',
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' 用户',
'Class:UserLocal+' => '用户由 '.ITOP_APPLICATION_SHORT.' 验证身份',
'Class:UserLocal/Attribute:password' => '密码',
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',

View File

@@ -4,7 +4,7 @@
<step>
<title>Configuration Management options</title>
<description><![CDATA[<h2>The options below allow you to configure the type of elements that are to be managed inside iTop.</h2>]]></description>
<banner>/images/modules.png</banner>
<banner>/images/icons/icons8-apps-tab.svg</banner>
<options type="array">
<choice>
<extension_code>itop-config-mgmt-core</extension_code>
@@ -65,7 +65,7 @@
<step>
<title>Service Management options</title>
<description><![CDATA[<h2>Select the choice that best describes the relationships between the services and the IT infrastructure in your IT environment.</h2>]]></description>
<banner>./wizard-icons/service.png</banner>
<banner>/images/icons/icons8-services.svg</banner>
<alternatives type="array">
<choice>
<extension_code>itop-service-mgmt-enterprise</extension_code>
@@ -89,7 +89,7 @@
<step>
<title>Tickets Management options</title>
<description><![CDATA[<h2>Select the type of tickets you want to use in order to respond to user requests and incidents.</h2>]]></description>
<banner>./itop-incident-mgmt-itil/images/incident-escalated.png</banner>
<banner>/images/icons/icons8-discussion-forum.svg</banner>
<alternatives type="array">
<choice>
<extension_code>itop-ticket-mgmt-simple-ticket</extension_code>
@@ -161,7 +161,7 @@
<step>
<title>Change Management options</title>
<description><![CDATA[<h2>Select the type of tickets you want to use in order to manage changes to the IT infrastructure.</h2>]]></description>
<banner>./itop-change-mgmt/images/change.png</banner>
<banner>/images/icons/icons8-change.svg</banner>
<alternatives type="array">
<choice>
<extension_code>itop-change-mgmt-simple</extension_code>
@@ -192,7 +192,7 @@
<step>
<title>Additional ITIL tickets</title>
<description><![CDATA[<h2>Pick from the list below the additional ITIL processes that are to be implemented in iTop.</h2>]]></description>
<banner>./itop-knownerror-mgmt/images/known-error.png</banner>
<banner>/images/icons/icons8-important-book.svg</banner>
<options type="array">
<choice>
<extension_code>itop-kown-error-mgmt</extension_code>

View File

@@ -40,7 +40,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -37,7 +37,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -39,7 +39,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Attachments:Error:FileTooLarge' => 'Die Datei ist zu groß für den Upload: %1$s',
'Attachments:Error:UploadedFileEmpty' => 'Die Datei ist leer und kann nicht angehängt werden.
Entweder ist die von Ihnen hochdeladene Datei leer,
oder melden Sie dem iTop Administrator diesen Fehler, weil eventuell kein ausreichender Speicherplatz zur Verfügung steht',
oder melden Sie dem '.ITOP_APPLICATION_SHORT.' Administrator diesen Fehler, weil eventuell kein ausreichender Speicherplatz zur Verfügung steht',
'Attachments:Render:Icons' => 'Als Icons anzeigen',
'Attachments:Render:Table' => 'Als Liste anzeigen',
'UI:Attachments:DropYourFileHint' => 'Dateien in diesem Bereich ablegen...',

View File

@@ -34,7 +34,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.',
'Attachments:Render:Icons' => 'Display as icons',
'Attachments:Render:Table' => 'Display as list',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area',

View File

@@ -37,7 +37,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -36,7 +36,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -16,7 +16,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Attachments:History_File_Added' => 'Вложение %1$s добавлено.',
'Attachments:History_File_Removed' => 'Вложение %1$s удалено.',
'Attachments:AddAttachment' => 'Добавить вложение:',
'Attachments:UploadNotAllowedOnThisSystem' => 'Загрузка файлов НЕ разрешена в этой системе. За подробностями обратитесь к администратору вашего iTop',
'Attachments:UploadNotAllowedOnThisSystem' => 'Загрузка файлов НЕ разрешена в этой системе. За подробностями обратитесь к администратору вашего '.ITOP_APPLICATION_SHORT,
'Attachment:Max_Go' => '(Максимальный размер файла: %1$s ГБ)',
'Attachment:Max_Mo' => '(Максимальный размер файла: %1$s МБ)',
'Attachment:Max_Ko' => '(Максимальный размер файла: %1$s кБ)',
@@ -25,7 +25,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Attachments:Error:FileTooLarge' => 'Файл слишком велик для загрузки. %1$s',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -37,7 +37,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -37,7 +37,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached.
Either you have pushed an empty file,
or ask your iTop administrator if the iTop server disk is full.~~',
or ask your '.ITOP_APPLICATION_SHORT.' administrator if the '.ITOP_APPLICATION_SHORT.' server disk is full.~~',
'Attachments:Render:Icons' => 'Display as icons~~',
'Attachments:Render:Table' => 'Display as list~~',
'UI:Attachments:DropYourFileHint' => 'Drop files anywhere in this area~~',

View File

@@ -31,7 +31,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Attachments:NoAttachment' => '没有附件. ',
'Attachments:PreviewNotAvailable' => '该附件类型不支持预览.',
'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s',
'Attachments:Error:UploadedFileEmpty' => '收到的文件为空,无法添加. 可能是因为您发送的是空文件,或者咨询 iTop 管理员服务器磁盘是否已满. ',
'Attachments:Error:UploadedFileEmpty' => '收到的文件为空,无法添加. 可能是因为您发送的是空文件,或者咨询 '.ITOP_APPLICATION_SHORT.' 管理员服务器磁盘是否已满. ',
'Attachments:Render:Icons' => '显示为图标',
'Attachments:Render:Table' => '显示为列表',
'UI:Attachments:DropYourFileHint' => '将文件拖放到此区域的任意位置',

View File

@@ -111,6 +111,11 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
public function OnFormCancel($sTempId)
{
// Protection against unfortunate massive delete of attachments when a null temp ID is passed
if (strlen($sTempId) === 0) {
return;
}
// Delete all "pending" attachments for this form
$sOQL = 'SELECT Attachment WHERE temp_id = :temp_id';
$oSearch = DBObjectSearch::FromOQL($sOQL);

View File

@@ -29,8 +29,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'bkp-status-title' => '定时备份',
'bkp-status-checks' => '设置与检查',
'bkp-mysqldump-ok' => '已找到 mysqldump : %1$s',
'bkp-mysqldump-notfound' => 'mysqldump 找不到: %1$s - 请确认它安装在正确的路径, 或者调整iTop 配置文件的选项mysql_bindir.',
'bkp-mysqldump-issue' => 'mysqldump 无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整iTop 配置文件的选项mysql_bindir',
'bkp-mysqldump-notfound' => 'mysqldump 找不到: %1$s - 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.' 配置文件的选项mysql_bindir.',
'bkp-mysqldump-issue' => 'mysqldump 无法运行 (retcode=%1$d): 请确认它安装在正确的路径, 或者调整'.ITOP_APPLICATION_SHORT.' 配置文件的选项mysql_bindir',
'bkp-missing-dir' => '目标目录 <code>%1$s</code> 找不到',
'bkp-free-disk-space' => '<b>%1$s 空闲</b> 在 <code>%2$s</code>',
'bkp-dir-not-writeable' => '%1$s 没有写入权限',

View File

@@ -1,203 +0,0 @@
<?php
/**
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
if (!defined('__DIR__')) define('__DIR__', dirname(__FILE__));
if (!defined('APPROOT'))
{
if (file_exists(__DIR__.'/../../approot.inc.php'))
{
require_once __DIR__.'/../../approot.inc.php'; // When in env-xxxx folder
}
else
{
require_once __DIR__.'/../../../approot.inc.php'; // When in datamodels/x.x folder
}
}
require_once(APPROOT.'application/application.inc.php');
require_once(APPROOT.'application/ajaxwebpage.class.inc.php');
require_once(APPROOT.'core/log.class.inc.php');
require_once(APPROOT.'application/startup.inc.php');
require_once(dirname(__FILE__).'/dbrestore.class.inc.php');
class MyDBRestore extends DBRestore
{
/** @var Page used to send log */
protected $oPage;
protected function LogInfo($sMsg)
{
$this->oPage->p($sMsg);
}
protected function LogError($sMsg)
{
$this->oPage->p('Error: '.$sMsg);
ToolsLog::Error($sMsg);
}
public function __construct($oPage)
{
$this->oPage = $oPage;
parent::__construct();
}
}
/**
* Checks if a parameter (possibly empty) was specified when calling this page
*/
function CheckParam($sParamName)
{
global $argv;
if (isset($_REQUEST[$sParamName])) return true; // HTTP parameter either GET or POST
if (!is_array($argv)) return false;
foreach($argv as $sArg)
{
if ($sArg == '--'.$sParamName) return true; // Empty command line parameter, long unix style
if ($sArg == $sParamName) return true; // Empty command line parameter, Windows style
if ($sArg == '-'.$sParamName) return true; // Empty command line parameter, short unix style
if (preg_match('/^--'.$sParamName.'=(.*)$/', $sArg, $aMatches)) return true; // Command parameter with a value
}
return false;
}
function Usage($oP)
{
$oP->p('Restore an iTop from a backup file');
$oP->p('Parameters:');
if (utils::IsModeCLI())
{
$oP->p('auth_user: login, must be administrator');
$oP->p('auth_pwd: ...');
}
$oP->p('backup_file [optional]: name of the file to store the backup into. Follows the PHP strftime format spec. The following placeholders are available: __HOST__, __DB__, __SUBNAME__');
$oP->p('mysql_bindir [optional]: specify the path for mysql executable');
if (utils::IsModeCLI())
{
$oP->p('Example: php -q restore.php --auth_user=admin --auth_pwd=myPassw0rd --backup_file=/tmp/backup.zip');
$oP->p('Known limitation: the current directory must be the directory of backup.php');
}
else
{
$oP->p('Example: .../restore.php?backup_file=/tmp/backup.zip');
}
}
function ExitError($oP, $sMessage)
{
ToolsLog::Error($sMessage);
$oP->p($sMessage);
$oP->output();
exit;
}
function ReadMandatoryParam($oP, $sParam)
{
$sValue = utils::ReadParam($sParam, null, true /* Allow CLI */, 'raw_data');
if (is_null($sValue))
{
ExitError($oP, "ERROR: Missing argument '$sParam'");
}
return trim($sValue);
}
/////////////////////////////////
// Main program
set_time_limit(0);
if (utils::IsModeCLI())
{
$oP = new CLIPage("iTop - iTop Restore");
SetupUtils::CheckPhpAndExtensionsForCli($oP);
}
else
{
$oP = new WebPage("iTop - iTop Restore");
}
try
{
utils::UseParamFile();
}
catch(Exception $e)
{
ExitError($oP, $e->GetMessage());
}
if (utils::IsModeCLI())
{
$oP->p(date('Y-m-d H:i:s')." - running backup utility");
$sAuthUser = ReadMandatoryParam($oP, 'auth_user');
$sAuthPwd = ReadMandatoryParam($oP, 'auth_pwd');
$sBackupFile = ReadMandatoryParam($oP, 'backup_file');
$bDownloadBackup = false;
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd))
{
UserRights::Login($sAuthUser); // Login & set the user's language
}
else
{
ExitError($oP, "Access restricted or wrong credentials ('$sAuthUser')");
}
if (!is_file($sBackupFile) && is_readable($sBackupFile)){
ExitError($oP, "Cannot access backup file ('$sBackupFile')");
}
}
else
{
require_once(APPROOT.'application/loginwebpage.class.inc.php');
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
}
if (!UserRights::IsAdministrator())
{
ExitError($oP, "Access restricted to administors");
}
if (CheckParam('?') || CheckParam('h') || CheckParam('help'))
{
Usage($oP);
$oP->output();
exit;
}
// Interpret strftime specifications (like %Y) and database placeholders
$oRestore = new MyDBRestore($oP);
$oRestore->SetMySQLBinDir(MetaModel::GetConfig()->GetModuleSetting('itop-backup', 'mysql_bindir', ''));
$res = false;
if (MetaModel::GetConfig()->Get('demo_mode'))
{
$oP->p("Sorry, iTop is in demonstration mode: the feature is disabled");
}
else
{
$sEnvironment = utils::ReadParam('environment', 'production', false, 'raw_data');
$oRestore->RestoreFromCompressedBackup($sBackupFile, $sEnvironment);
}
$oP->output();

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Set>
<DatabaseSchema alias="DatabaseSchema" id="20">
<name>openerpprod</name>
<name>odooprod</name>
<description></description>
<org_id>2</org_id>
<business_criticity>low</business_criticity>

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Set>
<OSVersion alias="OSVersion" id="8">
<name>Unbuntu 11.10</name>
<name>Ubuntu 20.04</name>
<osfamily_id>7</osfamily_id>
</OSVersion>
<OSVersion alias="OSVersion" id="4">
<name>Windows 2008 Server</name>
<name>Windows 2019 Server</name>
<osfamily_id>3</osfamily_id>
</OSVersion>
</Set>

View File

@@ -90,8 +90,8 @@
<brand_id>1</brand_id>
<model_id>4</model_id>
<asset_number></asset_number>
<purchase_date>2011-05-22</purchase_date>
<end_of_warranty>2013-05-21</end_of_warranty>
<purchase_date>2021-07-30</purchase_date>
<end_of_warranty>2025-07-29</end_of_warranty>
<rack_id>0</rack_id>
<enclosure_id>0</enclosure_id>
<nb_u></nb_u>

View File

@@ -3,13 +3,13 @@
<Software alias="Software" id="2">
<name>MySql</name>
<vendor>Oracle</vendor>
<version>5.3</version>
<version>8</version>
<type>DBServer</type>
</Software>
<Software alias="Software" id="1">
<name>Oracle DB engine</name>
<vendor>Oracle</vendor>
<version>11i</version>
<version>19c</version>
<type>DBServer</type>
</Software>
</Set>

View File

@@ -754,7 +754,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:LogicalVolume/Attribute:storagesystem_id+' => '',
'Class:LogicalVolume/Attribute:storagesystem_name' => 'Nom Système de stockage',
'Class:LogicalVolume/Attribute:storagesystem_name+' => '',
'Class:LogicalVolume/Attribute:servers_list' => 'Servers',
'Class:LogicalVolume/Attribute:servers_list' => 'Serveurs',
'Class:LogicalVolume/Attribute:servers_list+' => '',
'Class:LogicalVolume/Attribute:virtualdevices_list' => 'Machines virtuelles',
'Class:LogicalVolume/Attribute:virtualdevices_list+' => '',

View File

@@ -11,7 +11,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Menu:ConfigEditor' => 'Konfigurace',
'config-edit-title' => 'Editor konfiguračního souboru',
'config-edit-intro' => 'Při úpravách konfiguračního souboru buďte velice opatrní. Nesprávné nastavení může vést k nedostupnosti iTop',
'config-edit-intro' => 'Při úpravách konfiguračního souboru buďte velice opatrní. Nesprávné nastavení může vést k nedostupnosti '.ITOP_APPLICATION_SHORT,
'config-apply' => 'Použít',
'config-apply-title' => 'Použít (Ctrl+S)',
'config-cancel' => 'Zrušit',

View File

@@ -9,7 +9,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:ConfigEditor' => 'Configuration Générale',
'config-edit-title' => 'Editeur du Fichier de Configuration',
'config-edit-intro' => 'Attention: une configuration incorrecte peut rendre iTop inopérant pour tous les utilisateurs!',
'config-edit-intro' => 'Attention: une configuration incorrecte peut rendre '.ITOP_APPLICATION_SHORT.' inopérant pour tous les utilisateurs!',
'config-apply' => 'Enregistrer',
'config-apply-title' => 'Enregistrer (Ctrl+S)',
'config-cancel' => 'Annuler (restaurer)',

View File

@@ -61,7 +61,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -61,7 +61,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -24,7 +24,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopUpdate:UI:PageTitle' => 'Anwendungsupgrade',
'itop-core-update:UI:SelectUpdateFile' => 'Upgrade-Datei hochladen',
'itop-core-update:UI:ConfirmUpdate' => 'Upgrade bestätigen',
'itop-core-update:UI:UpdateCoreFiles' => 'Upgrade der iTop-Core-Dateien',
'itop-core-update:UI:UpdateCoreFiles' => 'Upgrade der '.ITOP_APPLICATION_SHORT.'-Core-Dateien',
'iTopUpdate:UI:MaintenanceModeActive' => 'Die Anwendung läuft im Wartungsmodus, Benutzerzugriffe sind nicht möglich. Führen Sie erneut ein Setup oder Restore der Anwendung aus, um in den normalen Betriebsmodus zurückzukehren.',
'itop-core-update:UI:UpdateDone' => 'Upgrade abgeschlossen',
@@ -61,7 +61,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Wegen geringem verbleibenden Speicherplatz sollte kein Backup mehr erzeugt werden.',
'iTopUpdate:UI:DiskFreeSpace' => 'Freier Speicherplatz',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop Speicherplatz',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' Speicherplatz',
'iTopUpdate:UI:DBDiskSpace' => 'Datenbankgröße',
'iTopUpdate:UI:FileUploadMaxSize' => 'Maximale Dateigröße für Uploads',
@@ -94,8 +94,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopUpdate:Error:MissingFile' => 'Fehlende Datei: %1$s',
'iTopUpdate:Error:CorruptedFile' => 'Datei %1$s ist beschädigt',
'iTopUpdate:Error:BadFileFormat' => 'Die Upgradedatei ist keine ZIP-Datei',
'iTopUpdate:Error:BadFileContent' => 'Die Upgradedatei ist kein iTop-Paket',
'iTopUpdate:Error:BadItopProduct' => 'Die Upgradedatei ist nicht mit dieser iTop-Version kompatibel.',
'iTopUpdate:Error:BadFileContent' => 'Die Upgradedatei ist kein '.ITOP_APPLICATION_SHORT.'-Paket',
'iTopUpdate:Error:BadItopProduct' => 'Die Upgradedatei ist nicht mit dieser '.ITOP_APPLICATION_SHORT.'-Version kompatibel.',
'iTopUpdate:Error:Copy' => 'Fehler, kopieren von \'%1$s\' nach \'%2$s\' nicht möglich',
'iTopUpdate:Error:FileNotFound' => 'Datei nicht gefunden',
'iTopUpdate:Error:NoFile' => 'Keine Datei angegeben',

View File

@@ -61,7 +61,7 @@ Dict::Add('EN US', 'English', 'English', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size',

View File

@@ -61,7 +61,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'iTopUpdate:UI:DoBackup:Warning' => 'El respaldo no está recomendado por el limitado espacio en el dispositivo',
'iTopUpdate:UI:DiskFreeSpace' => 'Espaciolibre en el dispositivo',
'iTopUpdate:UI:ItopDiskSpace' => 'Espacio en diso de iTop',
'iTopUpdate:UI:ItopDiskSpace' => 'Espacio en diso de '.ITOP_APPLICATION_SHORT,
'iTopUpdate:UI:DBDiskSpace' => 'Espacio en diso de base de datos',
'iTopUpdate:UI:FileUploadMaxSize' => 'Máximo tamaño de subida de archivos',

View File

@@ -61,7 +61,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -61,7 +61,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -61,7 +61,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -63,7 +63,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Een backup maken wordt afgeraden doordat er weinig schijfruimte is',
'iTopUpdate:UI:DiskFreeSpace' => 'Vrije schijfruimte',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop schijfgebruik',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' schijfgebruik',
'iTopUpdate:UI:DBDiskSpace' => 'Database schijfgebruik',
'iTopUpdate:UI:FileUploadMaxSize' => 'Maximale bestandsgrootte (upload)',

View File

@@ -61,7 +61,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup não recomendado devido ao espaço em disco limitado',
'iTopUpdate:UI:DiskFreeSpace' => 'Espaço em disco disponível',
'iTopUpdate:UI:ItopDiskSpace' => 'Espaço em disco do iTop',
'iTopUpdate:UI:ItopDiskSpace' => 'Espaço em disco do '.ITOP_APPLICATION_SHORT,
'iTopUpdate:UI:DBDiskSpace' => 'Espaço em disco da base de dados',
'iTopUpdate:UI:FileUploadMaxSize' => 'Tamanho máximo de envio de arquivos',

View File

@@ -61,7 +61,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -61,7 +61,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'iTopUpdate:UI:DoBackup:Warning' => 'Backup is not recommended due to limited available disk space~~',
'iTopUpdate:UI:DiskFreeSpace' => 'Disk free space~~',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop disk space~~',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' disk space~~',
'iTopUpdate:UI:DBDiskSpace' => 'Database disk space~~',
'iTopUpdate:UI:FileUploadMaxSize' => 'File upload max size~~',

View File

@@ -61,7 +61,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'iTopUpdate:UI:DoBackup:Warning' => '由于磁盘空间不足, 不建议备份',
'iTopUpdate:UI:DiskFreeSpace' => '磁盘剩余空间',
'iTopUpdate:UI:ItopDiskSpace' => 'iTop 的磁盘空间',
'iTopUpdate:UI:ItopDiskSpace' => ITOP_APPLICATION_SHORT.' 的磁盘空间',
'iTopUpdate:UI:DBDiskSpace' => '数据库的磁盘空间',
'iTopUpdate:UI:FileUploadMaxSize' => '文件上传大小上限',

View File

@@ -24,13 +24,13 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
// Dictionary entries go here
'Menu:iTopHub' => 'iTop Hub~~',
'Menu:iTopHub:Register' => 'Connect to iTop Hub~~',
'Menu:iTopHub:Register+' => 'Go to iTop Hub to update your iTop instance~~',
'Menu:iTopHub:Register:Description' => '<p>Get access to your community platform iTop Hub!</br>Find all the content and information you need, manage your instances through personalized tools & install more extensions.</br><br/>By connecting to the Hub from this page, you will push information about this iTop instance into the Hub.</p>~~',
'Menu:iTopHub:Register+' => 'Go to iTop Hub to update your '.ITOP_APPLICATION_SHORT.' instance~~',
'Menu:iTopHub:Register:Description' => '<p>Get access to your community platform iTop Hub!</br>Find all the content and information you need, manage your instances through personalized tools & install more extensions.</br><br/>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>~~',
'Menu:iTopHub:MyExtensions' => 'Deployed extensions~~',
'Menu:iTopHub:MyExtensions+' => 'See the list of extensions deployed on this instance of iTop~~',
'Menu:iTopHub:MyExtensions+' => 'See the list of extensions deployed on this instance of '.ITOP_APPLICATION_SHORT.'~~',
'Menu:iTopHub:BrowseExtensions' => 'Get extensions from iTop Hub~~',
'Menu:iTopHub:BrowseExtensions+' => 'Browse for more extensions on iTop Hub~~',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hubs store, your one stop place to find wonderful iTop extensions !</br>Find the ones that will help you customize and adapt iTop to your processes.</br><br/>By connecting to the Hub from this page, you will push information about this iTop instance into the Hub.</p>~~',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hubs store, your one stop place to find wonderful '.ITOP_APPLICATION_SHORT.' extensions !</br>Find the ones that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes.</br><br/>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>~~',
'iTopHub:GoBtn' => 'Go To iTop Hub~~',
'iTopHub:CloseBtn' => 'Close~~',
'iTopHub:GoBtn:Tooltip' => 'Jump to www.itophub.io~~',
@@ -46,25 +46,25 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'iTopHub:Landing:Status' => 'Deployment status~~',
'iTopHub:Landing:Install' => 'Deploying extensions...~~',
'iTopHub:CompiledOK' => 'Compilation successful.~~',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br/>iTop configuration has NOT been modified.~~',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br/>'.ITOP_APPLICATION_SHORT.' configuration has NOT been modified.~~',
'iTopHub:FailAuthent' => 'Authentication failed for this action.~~',
'iTopHub:InstalledExtensions' => 'Extensions deployed on this instance~~',
'iTopHub:ExtensionCategory:Manual' => 'Extensions deployed manually~~',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of iTop:~~',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of '.ITOP_APPLICATION_SHORT.':~~',
'iTopHub:ExtensionCategory:Remote' => 'Extensions deployed from iTop Hub~~',
'iTopHub:ExtensionCategory:Remote+' => 'The following extensions have been deployed from iTop Hub:~~',
'iTopHub:NoExtensionInThisCategory' => 'There is no extension in this category~~',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt iTop to your processes !~~',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes !~~',
'iTopHub:ExtensionNotInstalled' => 'Not installed~~',
'iTopHub:GetMoreExtensions' => 'Get extensions from iTop Hub...~~',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your iTop.~~',
'iTopHub:GoBackToITopBtn' => 'Go Back to iTop~~',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your '.ITOP_APPLICATION_SHORT.'.~~',
'iTopHub:GoBackToITopBtn' => 'Go Back to '.ITOP_APPLICATION_SHORT.'~~',
'iTopHub:Uncompressing' => 'Uncompressing extensions...~~',
'iTopHub:InstallationWelcome' => 'Installation of the extensions downloaded from iTop Hub~~',
'iTopHub:DBBackupLabel' => 'Instance backup~~',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and iTop configuration before updating~~',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and '.ITOP_APPLICATION_SHORT.' configuration before updating~~',
'iTopHub:DeployBtn' => 'Deploy !~~',
'iTopHub:DatabaseBackupProgress' => 'Instance backup...~~',
@@ -72,7 +72,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s already installed. Nothing will change.~~',
'iTopHub:InstallationEffect:Upgrade' => 'Will be <b>upgraded</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationEffect:Downgrade' => 'Will be <b>DOWNGRADED</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationProgress:DatabaseBackup' => 'iTop Instance backup...~~',
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' Instance backup...~~',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Installation of the extensions~~',
'iTopHub:InstallationEffect:MissingDependencies' => 'This extension cannot be installed because of unmet dependencies.~~',
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'The extension requires the module(s): %1$s~~',

View File

@@ -24,13 +24,13 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
// Dictionary entries go here
'Menu:iTopHub' => 'iTop Hub~~',
'Menu:iTopHub:Register' => 'Connect to iTop Hub~~',
'Menu:iTopHub:Register+' => 'Go to iTop Hub to update your iTop instance~~',
'Menu:iTopHub:Register:Description' => '<p>Get access to your community platform iTop Hub!</br>Find all the content and information you need, manage your instances through personalized tools & install more extensions.</br><br/>By connecting to the Hub from this page, you will push information about this iTop instance into the Hub.</p>~~',
'Menu:iTopHub:Register+' => 'Go to iTop Hub to update your '.ITOP_APPLICATION_SHORT.' instance~~',
'Menu:iTopHub:Register:Description' => '<p>Get access to your community platform iTop Hub!</br>Find all the content and information you need, manage your instances through personalized tools & install more extensions.</br><br/>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>~~',
'Menu:iTopHub:MyExtensions' => 'Deployed extensions~~',
'Menu:iTopHub:MyExtensions+' => 'See the list of extensions deployed on this instance of iTop~~',
'Menu:iTopHub:MyExtensions+' => 'See the list of extensions deployed on this instance of '.ITOP_APPLICATION_SHORT.'~~',
'Menu:iTopHub:BrowseExtensions' => 'Get extensions from iTop Hub~~',
'Menu:iTopHub:BrowseExtensions+' => 'Browse for more extensions on iTop Hub~~',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hubs store, your one stop place to find wonderful iTop extensions !</br>Find the ones that will help you customize and adapt iTop to your processes.</br><br/>By connecting to the Hub from this page, you will push information about this iTop instance into the Hub.</p>~~',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Look into iTop Hubs store, your one stop place to find wonderful '.ITOP_APPLICATION_SHORT.' extensions !</br>Find the ones that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes.</br><br/>By connecting to the Hub from this page, you will push information about this '.ITOP_APPLICATION_SHORT.' instance into the Hub.</p>~~',
'iTopHub:GoBtn' => 'Go To iTop Hub~~',
'iTopHub:CloseBtn' => 'Close~~',
'iTopHub:GoBtn:Tooltip' => 'Jump to www.itophub.io~~',
@@ -46,25 +46,25 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'iTopHub:Landing:Status' => 'Deployment status~~',
'iTopHub:Landing:Install' => 'Deploying extensions...~~',
'iTopHub:CompiledOK' => 'Compilation successful.~~',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br/>iTop configuration has NOT been modified.~~',
'iTopHub:ConfigurationSafelyReverted' => 'Error detected during deployment!<br/>'.ITOP_APPLICATION_SHORT.' configuration has NOT been modified.~~',
'iTopHub:FailAuthent' => 'Authentication failed for this action.~~',
'iTopHub:InstalledExtensions' => 'Extensions deployed on this instance~~',
'iTopHub:ExtensionCategory:Manual' => 'Extensions deployed manually~~',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of iTop:~~',
'iTopHub:ExtensionCategory:Manual+' => 'The following extensions have been deployed by copying them manually in the %1$s directory of '.ITOP_APPLICATION_SHORT.':~~',
'iTopHub:ExtensionCategory:Remote' => 'Extensions deployed from iTop Hub~~',
'iTopHub:ExtensionCategory:Remote+' => 'The following extensions have been deployed from iTop Hub:~~',
'iTopHub:NoExtensionInThisCategory' => 'There is no extension in this category~~',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt iTop to your processes !~~',
'iTopHub:NoExtensionInThisCategory+' => 'Browse iTop Hub to find the extensions that will help you customize and adapt '.ITOP_APPLICATION_SHORT.' to your processes !~~',
'iTopHub:ExtensionNotInstalled' => 'Not installed~~',
'iTopHub:GetMoreExtensions' => 'Get extensions from iTop Hub...~~',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your iTop.~~',
'iTopHub:GoBackToITopBtn' => 'Go Back to iTop~~',
'iTopHub:LandingWelcome' => 'Congratulations! The following extensions were downloaded from iTop Hub and deployed into your '.ITOP_APPLICATION_SHORT.'.~~',
'iTopHub:GoBackToITopBtn' => 'Go Back to '.ITOP_APPLICATION_SHORT.'~~',
'iTopHub:Uncompressing' => 'Uncompressing extensions...~~',
'iTopHub:InstallationWelcome' => 'Installation of the extensions downloaded from iTop Hub~~',
'iTopHub:DBBackupLabel' => 'Instance backup~~',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and iTop configuration before updating~~',
'iTopHub:DBBackupSentence' => 'Do a backup of the database and '.ITOP_APPLICATION_SHORT.' configuration before updating~~',
'iTopHub:DeployBtn' => 'Deploy !~~',
'iTopHub:DatabaseBackupProgress' => 'Instance backup...~~',
@@ -72,7 +72,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s already installed. Nothing will change.~~',
'iTopHub:InstallationEffect:Upgrade' => 'Will be <b>upgraded</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationEffect:Downgrade' => 'Will be <b>DOWNGRADED</b> from version %1$s to version %2$s.~~',
'iTopHub:InstallationProgress:DatabaseBackup' => 'iTop Instance backup...~~',
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' Instance backup...~~',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Installation of the extensions~~',
'iTopHub:InstallationEffect:MissingDependencies' => 'This extension cannot be installed because of unmet dependencies.~~',
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'The extension requires the module(s): %1$s~~',

View File

@@ -24,13 +24,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
// Dictionary entries go here
'Menu:iTopHub' => 'iTop Hub',
'Menu:iTopHub:Register' => 'Mit dem iTop Hub verbinden',
'Menu:iTopHub:Register+' => 'iTop-Instanzen über den iTop Hub updaten',
'Menu:iTopHub:Register:Description' => '<p>Zugriff auf die Community-Plattform iTop Hub!</br>Hier finden sie Informationen zu ihren iTop Instanzen, können diese mit personalisierten Tools verwalten und sich Erweiterungen installieren.</br><br/>Durch die Verbindung mit dem iTop Hub, werden Informationen zu Ihrer iTop Instanz zum iTop Hub übertragen.</p>',
'Menu:iTopHub:Register+' => ITOP_APPLICATION_SHORT.'-Instanzen über den iTop Hub updaten',
'Menu:iTopHub:Register:Description' => '<p>Zugriff auf die Community-Plattform iTop Hub!</br>Hier finden sie Informationen zu ihren '.ITOP_APPLICATION_SHORT.' Instanzen, können diese mit personalisierten Tools verwalten und sich Erweiterungen installieren.</br><br/>Durch die Verbindung mit dem iTop Hub, werden Informationen zu Ihrer '.ITOP_APPLICATION_SHORT.' Instanz zum iTop Hub übertragen.</p>',
'Menu:iTopHub:MyExtensions' => 'Installierte Erweiterungen',
'Menu:iTopHub:MyExtensions+' => 'Liste der auf ihrer iTop Instanz installierten Erweiterungen',
'Menu:iTopHub:MyExtensions+' => 'Liste der auf ihrer '.ITOP_APPLICATION_SHORT.' Instanz installierten Erweiterungen',
'Menu:iTopHub:BrowseExtensions' => 'Erweiterungen vom iTop Hub beziehen',
'Menu:iTopHub:BrowseExtensions+' => 'Mehr Erweiterungen auf dem iTop Hub entdecken',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Zugriff auf die Community-Plattform iTop Hub!</br>Hier finden sie Informationen zu ihren iTop Instanzen, können diese mit personalisierten Tools verwalten und sich Erweiterungen installieren.</br><br/>Durch die Verbindung mit dem iTop Hub, werden Informationen zu Ihrer iTop Instanz zum iTop Hub übertragen.</p>',
'Menu:iTopHub:BrowseExtensions:Description' => '<p>Zugriff auf die Community-Plattform iTop Hub!</br>Hier finden sie Informationen zu ihren '.ITOP_APPLICATION_SHORT.' Instanzen, können diese mit personalisierten Tools verwalten und sich Erweiterungen installieren.</br><br/>Durch die Verbindung mit dem iTop Hub, werden Informationen zu Ihrer '.ITOP_APPLICATION_SHORT.' Instanz zum iTop Hub übertragen.</p>',
'iTopHub:GoBtn' => 'Gehe zum iTop Hub',
'iTopHub:CloseBtn' => 'Schließen',
'iTopHub:GoBtn:Tooltip' => 'Gehe zu www.itophub.io',
@@ -46,7 +46,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopHub:Landing:Status' => 'Installationsstatus',
'iTopHub:Landing:Install' => 'Erweiterungen werden installiert...',
'iTopHub:CompiledOK' => 'Installation erfolgreich',
'iTopHub:ConfigurationSafelyReverted' => 'Fehler während der Installation!<br/>iTop Konfiguration wurde NICHT angepasst.',
'iTopHub:ConfigurationSafelyReverted' => 'Fehler während der Installation!<br/>'.ITOP_APPLICATION_SHORT.' Konfiguration wurde NICHT angepasst.',
'iTopHub:FailAuthent' => 'Die Authentifizierung für diese Aktion ist fehlgeschlagen.',
'iTopHub:InstalledExtensions' => 'Erweiterungen, die auf dieser Instanz installiert sind',
@@ -55,16 +55,16 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopHub:ExtensionCategory:Remote' => 'Erweiterungen vom iTop Hub',
'iTopHub:ExtensionCategory:Remote+' => 'Die folgenden Erweiterungen wurden über den iTop Hub installiert:',
'iTopHub:NoExtensionInThisCategory' => 'Es gibt keine Erweiterungen dieser Kategorie',
'iTopHub:NoExtensionInThisCategory+' => 'Besuchen Sie den iTop Hub, um Erweiterungen zu finden, die Ihnen helfen, Ihr iTop so zu erweitern, dass es besser zu Ihren Bedürfnissen passt!',
'iTopHub:NoExtensionInThisCategory+' => 'Besuchen Sie den iTop Hub, um Erweiterungen zu finden, die Ihnen helfen, Ihr '.ITOP_APPLICATION_SHORT.' so zu erweitern, dass es besser zu Ihren Bedürfnissen passt!',
'iTopHub:ExtensionNotInstalled' => 'Nicht installiert',
'iTopHub:GetMoreExtensions' => 'Erweiterungen vom iTop Hub beziehen ...',
'iTopHub:LandingWelcome' => 'Herzlichen Glückwunsch! Die folgenden Erweiterungen wurden vom iTop Hub heruntergeladen und installiert:',
'iTopHub:GoBackToITopBtn' => 'Gehe zurück zu iTop',
'iTopHub:GoBackToITopBtn' => 'Gehe zurück zu '.ITOP_APPLICATION_SHORT,
'iTopHub:Uncompressing' => 'Erweiterungen entpacken...',
'iTopHub:InstallationWelcome' => 'Installation der Erweiterungen, die vom iTop Hub heruntergeladen wurden.',
'iTopHub:DBBackupLabel' => 'Backup der iTop-Instanz',
'iTopHub:DBBackupSentence' => 'Vor dem Update ein Backup der iTop Datenbank und der iTop Konfiguration durchführen.',
'iTopHub:DBBackupLabel' => 'Backup der '.ITOP_APPLICATION_SHORT.'-Instanz',
'iTopHub:DBBackupSentence' => 'Vor dem Update ein Backup der iTop Datenbank und der '.ITOP_APPLICATION_SHORT.' Konfiguration durchführen.',
'iTopHub:DeployBtn' => 'Installieren!',
'iTopHub:DatabaseBackupProgress' => 'Backup durchführen...',
@@ -72,7 +72,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopHub:InstallationEffect:NoChange' => 'Version: %1$s ist bereits installiert. Es wird keine Änderung durchgeführt.',
'iTopHub:InstallationEffect:Upgrade' => 'Aktualisierung von Version %1$s auf Version %2$s.',
'iTopHub:InstallationEffect:Downgrade' => 'DOWNGRADE von Version %1$s auf Version %2$s.',
'iTopHub:InstallationProgress:DatabaseBackup' => 'Backup der iTop-Instanz...',
'iTopHub:InstallationProgress:DatabaseBackup' => 'Backup der '.ITOP_APPLICATION_SHORT.'-Instanz...',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'Installation der Erweiterungen',
'iTopHub:InstallationEffect:MissingDependencies' => 'Diese Erweiterung kann nicht installiert werden, da Abhängigkeiten nicht erfüllt werden.',
'iTopHub:InstallationEffect:MissingDependencies_Details' => 'The Erweiterung benötigt folgende(s) Modul(e): %1$s',

Some files were not shown because too many files have changed in this diff Show More