Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ToggleSwitchRenderer
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 2
30
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 render
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2declare( strict_types = 1 );
3
4/**
5 * ToggleSwitchRenderer.php
6 *
7 * This file is part of the Codex PHP library, which provides a PHP-based interface for creating
8 * UI components consistent with the Codex design system.
9 *
10 * The `ToggleSwitchRenderer` class leverages the `TemplateParser` and `Sanitizer` utilities to ensure the
11 * component object is rendered according to Codex design system standards.
12 *
13 * @category Renderer
14 * @package  Codex\Renderer
15 * @since    0.1.0
16 * @author   Doğu Abaris <abaris@null.net>
17 * @license  https://www.gnu.org/copyleft/gpl.html GPL-2.0-or-later
18 * @link     https://doc.wikimedia.org/codex/main/ Codex Documentation
19 */
20
21namespace Wikimedia\Codex\Renderer;
22
23use InvalidArgumentException;
24use Wikimedia\Codex\Component\ToggleSwitch;
25use Wikimedia\Codex\Contract\Component;
26use Wikimedia\Codex\Contract\ILocalizer;
27use Wikimedia\Codex\Contract\Renderer;
28use Wikimedia\Codex\Parser\TemplateParser;
29use Wikimedia\Codex\Utility\Sanitizer;
30
31/**
32 * ToggleSwitchRenderer is responsible for rendering the HTML markup
33 * for a ToggleSwitch component using a Mustache template.
34 *
35 * This class uses the `TemplateParser` and `Sanitizer` utilities to manage
36 * the template rendering process, ensuring that the component object's HTML
37 * output adheres to the Codex design system's standards.
38 *
39 * @category Renderer
40 * @package  Codex\Renderer
41 * @since    0.1.0
42 * @author   Doğu Abaris <abaris@null.net>
43 * @license  https://www.gnu.org/copyleft/gpl.html GPL-2.0-or-later
44 * @link     https://doc.wikimedia.org/codex/main/ Codex Documentation
45 */
46class ToggleSwitchRenderer extends Renderer {
47
48    /**
49     * Constructor to initialize the ToggleSwitchRenderer with a sanitizer and a template parser.
50     *
51     * @since 0.1.0
52     * @param Sanitizer $sanitizer The sanitizer instance used for content sanitization.
53     * @param TemplateParser $templateParser The template parser instance.
54     * @param ILocalizer $localizer The localizer instance used for i18n messages.
55     */
56    public function __construct(
57        Sanitizer $sanitizer,
58        private readonly TemplateParser $templateParser,
59        private readonly ILocalizer $localizer
60    ) {
61        parent::__construct( $sanitizer );
62    }
63
64    /**
65     * Renders the HTML for a ToggleSwitch component.
66     *
67     * @since 0.1.0
68     * @param Component $component The ToggleSwitch component to render.
69     * @return string The rendered HTML string for the component.
70     */
71    public function render( Component $component ): string {
72        if ( !$component instanceof ToggleSwitch ) {
73            throw new InvalidArgumentException( "Expected instance of ToggleSwitch, got " . get_class( $component ) );
74        }
75
76        $label = $component->getLabel();
77        $labelData = null;
78
79        if ( $label ) {
80            $labelData = [
81                'id' => $label->getId(),
82                'coreClass' => 'cdx-toggle-switch__label',
83                'labelText-html' => $this->sanitizer->sanitizeText( $label->getLabelText() ),
84                'optionalFlag' => $label->isOptional() ?
85                    $this->localizer->msg( 'cdx-label-optional-flag' ) :
86                    null,
87                'isVisuallyHidden' => $label->isVisuallyHidden(),
88                'inputId' => $component->getInputId(),
89                'description-html' => $this->sanitizer->sanitizeText( $label->getDescription() ),
90                'descriptionId' => $label->getDescriptionId() ?? '',
91                'isDisabled' => $label->isDisabled(),
92                'iconClass' => $label->getIconClass() ?? '',
93                'extraClasses' => $this->getExtraClasses( $label->getAttributes() ),
94                'attributes' => $this->getOtherAttributes( $label->getAttributes() ),
95            ];
96        }
97
98        $toggleData = [
99            'name' => $component->getName(),
100            'value' => $component->getValue(),
101            'inputId' => $component->getInputId(),
102            'isChecked' => $component->isChecked(),
103            'isDisabled' => $component->isDisabled(),
104            'ariaDescribedby' => $label?->getDescriptionId() ?? '',
105            'inputExtraClasses' => $this->getExtraClasses( $component->getInputAttributes() ),
106            'inputAttributes' => $this->getOtherAttributes( $component->getInputAttributes() ),
107            'wrapperExtraClasses' => $this->getExtraClasses( $component->getWrapperAttributes() ),
108            'wrapperAttributes' => $this->getOtherAttributes( $component->getWrapperAttributes() ),
109            'label' => $labelData,
110        ];
111
112        return $this->templateParser->processTemplate( 'toggle-switch', $toggleData );
113    }
114}