mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-24 11:08:45 +02:00
Add ButtonGroup block
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2021 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\Application\UI\Base\Component\ButtonGroup;
|
||||
|
||||
|
||||
use Combodo\iTop\Application\UI\Base\Component\Button\Button;
|
||||
use Combodo\iTop\Application\UI\Base\iUIBlock;
|
||||
use Combodo\iTop\Application\UI\Base\UIBlock;
|
||||
|
||||
/**
|
||||
* Class ButtonGroup
|
||||
*
|
||||
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
|
||||
* @package Combodo\iTop\Application\UI\Base\Component\ButtonGroup
|
||||
* @since 3.0.0
|
||||
*/
|
||||
class ButtonGroup extends UIBlock
|
||||
{
|
||||
// Overloaded constants
|
||||
/** @inheritDoc */
|
||||
public const BLOCK_CODE = 'ibo-button-group';
|
||||
/** @inheritDoc */
|
||||
public const DEFAULT_HTML_TEMPLATE_REL_PATH = 'base/components/button-group/layout';
|
||||
|
||||
/** @var \Combodo\iTop\Application\UI\Base\Component\Button\Button[] Buttons to be displayed as a group */
|
||||
protected $aButtons;
|
||||
/** @var \Combodo\iTop\Application\UI\Base\iUIBlock[] Extra blocks used in the group (eg. PopoverMenu toggled by one of the static::$aButtons) */
|
||||
protected $aExtraBlocks;
|
||||
|
||||
/**
|
||||
* Button constructor.
|
||||
*
|
||||
* @param string $sLabel
|
||||
* @param string|null $sId
|
||||
* @param string $sTooltip
|
||||
* @param string $sIconClass
|
||||
* @param string $sActionType
|
||||
* @param string $sColor
|
||||
* @param string $sJsCode
|
||||
* @param string $sOnClickJsCode
|
||||
*/
|
||||
public function __construct(array $aButtons = [], ?string $sId = null)
|
||||
{
|
||||
parent::__construct($sId);
|
||||
|
||||
$this->SetButtons($aButtons);
|
||||
$this->aExtraBlocks = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace all existing buttons with $aButtons
|
||||
*
|
||||
* @param array $aButtons
|
||||
*
|
||||
* @return $this
|
||||
* @uses static::$aButtons
|
||||
*/
|
||||
public function SetButtons(array $aButtons)
|
||||
{
|
||||
$this->aButtons = [];
|
||||
$this->AddButtons($aButtons);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Combodo\iTop\Application\UI\Base\Component\Button\Button[]
|
||||
* @use static::$aButtons
|
||||
*/
|
||||
public function GetButtons()
|
||||
{
|
||||
return $this->aButtons;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add $oButton, replacing any button with the same ID
|
||||
*
|
||||
* @param \Combodo\iTop\Application\UI\Base\Component\Button\Button $oButton
|
||||
*
|
||||
* @return $this
|
||||
* @uses static::$aButtons
|
||||
*/
|
||||
public function AddButton(Button $oButton)
|
||||
{
|
||||
$this->aButtons[$oButton->GetId()] = $oButton;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all $aButtons, replacing any button with the same IDs
|
||||
*
|
||||
* @param \Combodo\iTop\Application\UI\Base\Component\Button\Button[] $aButtons
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function AddButtons(array $aButtons)
|
||||
{
|
||||
foreach ($aButtons as $oButton) {
|
||||
$this->AddButton($oButton);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the button with the $sId. if no button with that ID, proceed silently.
|
||||
*
|
||||
* @param string $sId
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function RemoveButton(string $sId)
|
||||
{
|
||||
if (array_key_exists($sId, $this->aButtons)) {
|
||||
unset($this->aButtons[$sId]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Combodo\iTop\Application\UI\Base\iUIBlock $oBlock
|
||||
*
|
||||
* @return $this
|
||||
* @uses static::$aExtraBlocks
|
||||
*/
|
||||
public function AddExtraBlock(iUIBlock $oBlock)
|
||||
{
|
||||
$this->aExtraBlocks[$oBlock->GetId()] = $oBlock;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Combodo\iTop\Application\UI\Base\iUIBlock[]
|
||||
* @uses static::$aExtraBlocks
|
||||
*/
|
||||
public function GetExtraBlocks(): array
|
||||
{
|
||||
return $this->aExtraBlocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function GetSubBlocks(): array
|
||||
{
|
||||
return array_merge($this->GetButtons(), $this->GetExtraBlocks());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2021 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\Application\UI\Base\Component\ButtonGroup;
|
||||
|
||||
use Combodo\iTop\Application\UI\Base\AbstractUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Button\Button;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonJS;
|
||||
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
|
||||
|
||||
/**
|
||||
* Class ButtonGroupUIBlockFactory
|
||||
*
|
||||
* @internal
|
||||
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
|
||||
* @package Combodo\iTop\Application\UI\Base\Component\Button
|
||||
* @since 3.0.0
|
||||
*/
|
||||
class ButtonGroupUIBlockFactory extends AbstractUIBlockFactory
|
||||
{
|
||||
public const TWIG_TAG_NAME = 'UIButtonGroup';
|
||||
public const UI_BLOCK_CLASS_NAME = ButtonGroup::class;
|
||||
|
||||
/**
|
||||
* Make a button that has a primary action ($oButton) but also an options menu ($oMenu) on the side
|
||||
*
|
||||
* @param \Combodo\iTop\Application\UI\Base\Component\Button\Button $oButton
|
||||
* @param \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu $oMenu
|
||||
*
|
||||
* @return \Combodo\iTop\Application\UI\Base\Component\ButtonGroup\ButtonGroup
|
||||
*/
|
||||
public static function MakeButtonWithOptionsMenu(Button $oButton, PopoverMenu $oMenu)
|
||||
{
|
||||
$oButtonGroup = new ButtonGroup();
|
||||
|
||||
// Add base button
|
||||
$oButtonGroup->AddButton($oButton);
|
||||
|
||||
// Add options menu
|
||||
$oMenuToggler = new ButtonJS('');
|
||||
$oMenuToggler->SetIconClass('fas fa-fw, fa-caret-down')
|
||||
->AddCSSClass('ibo-button-for-options-menu')
|
||||
->SetColor($oButton->GetColor())
|
||||
->SetActionType($oButton->GetActionType());
|
||||
|
||||
$oMenu->SetTogglerFromBlock($oMenuToggler);
|
||||
$oButtonGroup->AddButton($oMenuToggler)
|
||||
->AddExtraBlock($oMenu);
|
||||
|
||||
return $oButtonGroup;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user