Current File : /home/pacjaorg/public_html/nsa/libraries/src/Button/ActionButton.php
<?php
/**
 * Joomla! Content Management System
 *
 * @copyright  (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

namespace Joomla\CMS\Button;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * The TaskButton class.
 *
 * @since  4.0.0
 */
class ActionButton
{
	/**
	 * The button states profiles.
	 *
	 * @var  array
	 *
	 * @since  4.0.0
	 */
	protected $states = [];

	/**
	 * Default options for unknown state.
	 *
	 * @var  array
	 *
	 * @since  4.0.0
	 */
	protected $unknownState = [
		'value'   => null,
		'task'    => '',
		'icon'    => 'question',
		'title'   => 'Unknown state',
		'options' => [
			'disabled'  => false,
			'only_icon' => false,
			'tip' => true,
			'tip_title' => '',
			'task_prefix' => '',
			'checkbox_name' => 'cb',
		],
	];

	/**
	 * Options of this button set.
	 *
	 * @var  Registry
	 *
	 * @since  4.0.0
	 */
	protected $options;

	/**
	 * The layout path to render.
	 *
	 * @var  string
	 *
	 * @since  4.0.0
	 */
	protected $layout = 'joomla.button.action-button';

	/**
	 * ActionButton constructor.
	 *
	 * @param   array  $options  The options for all buttons in this group.
	 *
	 * @since   4.0.0
	 */
	public function __construct(array $options = [])
	{
		$this->options = new Registry($options);

		// Replace some dynamic values
		$this->unknownState['title'] = Text::_('JLIB_HTML_UNKNOWN_STATE');

		$this->preprocess();
	}

	/**
	 * Configure this object.
	 *
	 * @return  void
	 *
	 * @since   4.0.0
	 */
	protected function preprocess()
	{
		// Implement this method.
	}

	/**
	 * Add a state profile.
	 *
	 * @param   integer  $value    The value of this state.
	 * @param   string   $task     The task you want to execute after click this button.
	 * @param   string   $icon     The icon to display for user.
	 * @param   string   $title    Title text will show if we enable tooltips.
	 * @param   array    $options  The button options, will override group options.
	 *
	 * @return  static  Return self to support chaining.
	 *
	 * @since   4.0.0
	 */
	public function addState(int $value, string $task, string $icon = 'ok', string $title = '', array $options = []): self
	{
		// Force type to prevent null data
		$this->states[$value] = [
			'value'   => $value,
			'task'    => $task,
			'icon'    => $icon,
			'title'   => $title,
			'options' => $options
		];

		return $this;
	}

	/**
	 * Get state profile by value name.
	 *
	 * @param   integer  $value  The value name we want to get.
	 *
	 * @return  array|null  Return state profile or NULL.
	 *
	 * @since   4.0.0
	 */
	public function getState(int $value): ?array
	{
		return $this->states[$value] ?? null;
	}

	/**
	 * Remove a state by value name.
	 *
	 * @param   integer  $value  Remove state by this value.
	 *
	 * @return  static  Return to support chaining.
	 *
	 * @since   4.0.0
	 */
	public function removeState(int $value): self
	{
		if (isset($this->states[$value]))
		{
			unset($this->states[$value]);
		}

		return $this;
	}

	/**
	 * Render action button by item value.
	 *
	 * @param   integer|null  $value    Current value of this item.
	 * @param   integer|null  $row      The row number of this item.
	 * @param   array         $options  The options to override group options.
	 *
	 * @return  string  Rendered HTML.
	 *
	 * @since   4.0.0
	 *
	 * @throws  \InvalidArgumentException
	 */
	public function render(?int $value = null, ?int $row = null, array $options = []): string
	{
		$data = $this->getState($value) ?? $this->unknownState;

		$data = ArrayHelper::mergeRecursive(
			$this->unknownState,
			$data,
			[
				'options' => $this->options->toArray()
			],
			[
				'options' => $options
			]
		);

		$data['row'] = $row;
		$data['icon'] = $this->fetchIconClass($data['icon']);

		return LayoutHelper::render($this->layout, $data);
	}

	/**
	 * Render to string.
	 *
	 * @return  string
	 *
	 * @since  4.0.0
	 */
	public function __toString(): string
	{
		try
		{
			return $this->render();
		}
		catch (\Throwable $e)
		{
			return (string) $e;
		}
	}

	/**
	 * Method to get property layout.
	 *
	 * @return  string
	 *
	 * @since  4.0.0
	 */
	public function getLayout(): string
	{
		return $this->layout;
	}

	/**
	 * Method to set property template.
	 *
	 * @param   string  $layout  The layout path.
	 *
	 * @return  static  Return self to support chaining.
	 *
	 * @since   4.0.0
	 */
	public function setLayout(string $layout): self
	{
		$this->layout = $layout;

		return $this;
	}

	/**
	 * Method to get property options.
	 *
	 * @return  array
	 *
	 * @since  4.0.0
	 */
	public function getOptions(): array
	{
		return (array) $this->options->toArray();
	}

	/**
	 * Method to set property options.
	 *
	 * @param   array  $options  The options of this button group.
	 *
	 * @return  static  Return self to support chaining.
	 *
	 * @since   4.0.0
	 */
	public function setOptions(array $options): self
	{
		$this->options = new Registry($options);

		return $this;
	}

	/**
	 * Get an option value.
	 *
	 * @param   string  $name     The option name.
	 * @param   mixed   $default  Default value if not exists.
	 *
	 * @return  mixed  Return option value or default value.
	 *
	 * @since   4.0.0
	 */
	public function getOption(string $name, $default = null)
	{
		return $this->options->get($name, $default);
	}

	/**
	 * Set option value.
	 *
	 * @param   string  $name   The option name.
	 * @param   mixed   $value  The option value.
	 *
	 * @return  static  Return self to support chaining.
	 *
	 * @since   4.0.0
	 */
	public function setOption(string $name, $value): self
	{
		$this->options->set($name, $value);

		return $this;
	}

	/**
	 * Method to get the CSS class name for an icon identifier.
	 *
	 * Can be redefined in the final class.
	 *
	 * @param   string  $identifier  Icon identification string.
	 *
	 * @return  string  CSS class name.
	 *
	 * @since   4.0.0
	 */
	public function fetchIconClass(string $identifier): string
	{
		// It's an ugly hack, but this allows templates to define the icon classes for the toolbar
		$layout = new FileLayout('joomla.button.iconclass');

		return $layout->render(array('icon' => $identifier));
	}
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!