diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 83c1158e4..b8be30a29 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -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; @@ -2947,6 +2951,91 @@ EOF } } + /** + * Select the derived class to create + * @param string $sClass + * @param \WebPage $oP + * @param \ApplicationContext $oAppContext + * @param array $sStateCode + * @param array $aPossibleClasses + * + * @return array + * @throws \CoreException + * @throws \DictExceptionMissingString + */ + 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 diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index 493ba7bce..0f9c44a48 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -4,6 +4,8 @@ * @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'); @@ -899,26 +901,17 @@ JS } } - $sDialogTitle = ''; - $oPage->add('