Add ButtonGroup block

This commit is contained in:
Molkobain
2021-03-24 18:32:35 +01:00
parent 85d3cc92c4
commit 318d8ce3c9
10 changed files with 768 additions and 362 deletions

View File

@@ -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());
}
}

View File

@@ -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;
}
}