. namespace core\output; use moodle_exception; use renderable; use renderer_base; use templatable; /** * Renderable class for the comboboxsearch. * * @package core_output * @copyright 2022 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class comboboxsearch implements renderable, templatable { /** @var bool $renderlater Should the dropdown render straightaway? We sometimes need to output the component without all of the * data and leave the rendering of any defaults and actual data to the caller. We will give you a basic placeholder that can * then be easily replaced.*/ protected $renderlater; /** @var string $buttoncontent What is the content of the "Button" that users will always see. */ protected $buttoncontent; /** @var null|string $dropdowncontent The content that can be passed in to render immediately. */ protected $dropdowncontent; /** @var null|string $parentclasses Any special classes to put on the HTMLElement that contains the BS events. */ protected $parentclasses; /** @var null|string $buttonclasses Any special classes to put on the HTMLElement that triggers the dropdown. */ protected $buttonclasses; /** @var null|string $dropdownclasses Any special classes to put on the HTMLElement that contains the actual dropdown. */ protected $dropdownclasses; /** @var null|string $buttonheader If the button item in the tertiary nav needs an extra top header for context. */ protected $buttonheader; /** @var boolean $usesbutton Whether to provide a A11y button. */ protected $usesbutton; /** @var null|string $label The label of the combobox. */ protected $label; /** @var null|string $name The name of the input element representing the combobox. */ protected $name; /** @var null|string $value The value of the input element representing the combobox. */ protected $value; /** * The class constructor. * * @param bool $renderlater How we figure out if we should render the template instantly. * @param string $buttoncontent What gets placed in the button. * @param ?string $dropdowncontent What will be placed in the dropdown if we are rendering now. * @param ?string $parentclasses The classes that can be added that the bootstrap events are attached to. * @param ?string $buttonclasses Any special classes that may be needed. * @param ?string $dropdownclasses Any special classes that may be needed. * @param ?string $buttonheader Sometimes we want extra context for a button before it is shown, basically a pseudo header. * @param ?bool $usebutton If we want the mustache to add the button roles for us or do we have another aria role node? * @param ?string $label The label of the combobox. * @param ?string $name The name of the input element representing the combobox. * @param ?string $value The value of the input element representing the combobox. * @throws moodle_exception If the implementor incorrectly calls this module. */ public function __construct( bool $renderlater, string $buttoncontent, ?string $dropdowncontent = null, ?string $parentclasses = null, ?string $buttonclasses = null, ?string $dropdownclasses = null, ?string $buttonheader = null, ?bool $usebutton = true, ?string $label = null, ?string $name = null, ?string $value = null ) { // Ensure implementors cant request to render the content now and not provide us any to show. if (!$renderlater && empty($dropdowncontent)) { throw new moodle_exception( 'incorrectdropdownvars', 'core', '', null, 'Dropdown content must be set to render later.' ); } if ($usebutton && !$label) { debugging( 'You have requested to use the button but have not provided a label for the combobox.', DEBUG_DEVELOPER ); } if ($usebutton && !$name) { debugging( 'You have requested to use the button but have not provided a name for the input element.', DEBUG_DEVELOPER ); } $this->renderlater = $renderlater; $this->buttoncontent = $buttoncontent; $this->dropdowncontent = $dropdowncontent; $this->parentclasses = $parentclasses; $this->buttonclasses = $buttonclasses; $this->dropdownclasses = $dropdownclasses; $this->buttonheader = $buttonheader; $this->usesbutton = $usebutton; $this->label = $label; $this->name = $name; $this->value = $value; } /** * Export the data for the mustache template. * * @param renderer_base $output renderer to be used to render the action bar elements. * @return array */ public function export_for_template(renderer_base $output): array { return [ 'renderlater' => $this->renderlater, 'buttoncontent' => $this->buttoncontent , 'dropdowncontent' => $this->dropdowncontent, 'parentclasses' => $this->parentclasses, 'buttonclasses' => $this->buttonclasses, 'dropdownclasses' => $this->dropdownclasses, 'buttonheader' => $this->buttonheader, 'usebutton' => $this->usesbutton, 'instance' => rand(), // Template uniqid is per render out so sometimes these conflict. 'label' => $this->label, 'name' => $this->name, 'value' => $this->value, ]; } /** * Returns the standard template for the dropdown. * * @return string */ public function get_template(): string { return 'core/comboboxsearch'; } }