Skip to content

Commit 7e00ec8

Browse files
authored
Merge pull request #38 from VitexSoftware/fix/formgroup-bootstrap5
Port FormGroup to Bootstrap 5
2 parents fdbaded + 4d4678a commit 7e00ec8

3 files changed

Lines changed: 115 additions & 25 deletions

File tree

composer.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Ease/TWB5/Navbar.php

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,20 @@ class Navbar extends NavTag
4242
* Brand link destination.
4343
*/
4444
public string $mainpage = '#';
45+
46+
/**
47+
* Render the collapsible menu as an Offcanvas drawer instead of a
48+
* Bootstrap collapse. Enable in a subclass before finalize().
49+
*/
50+
public bool $offcanvas = false;
51+
52+
/**
53+
* Offcanvas drawer placement when $offcanvas is enabled.
54+
*/
55+
public string $offcanvasPlacement = 'end';
4556
private string $navBarName = 'nav';
4657
private \Ease\Html\DivTag $containerFluid;
58+
private ButtonTag $toggler;
4759

4860
/**
4961
* App Menu.
@@ -70,7 +82,8 @@ public function __construct($brand = null, $name = 'navbar', $properties = [])
7082
$this->leftContent = new UlTag(null, ['class' => 'navbar-nav flex-nowrap mb-2 mb-lg-0', 'style' => '--bs-scroll-height: 100px;']);
7183
$this->rightContent = new UlTag(null, ['class' => 'navbar-nav ms-auto flex-nowrap mb-2 mb-lg-0']);
7284

73-
$this->containerFluid = $this->addItem(new \Ease\Html\DivTag([new ATag($this->mainpage, $brand, ['class' => 'navbar-brand']), $this->navBarToggler()], ['class' => 'container-fluid']));
85+
$this->toggler = $this->navBarToggler();
86+
$this->containerFluid = $this->addItem(new \Ease\Html\DivTag([new ATag($this->mainpage, $brand, ['class' => 'navbar-brand']), $this->toggler], ['class' => 'container-fluid']));
7487
}
7588

7689
/**
@@ -136,12 +149,49 @@ public function navBarCollapse()
136149
return new \Ease\Html\DivTag($this->leftContent, ['class' => 'collapse navbar-collapse', 'id' => $this->navBarName]);
137150
}
138151

152+
/**
153+
* Wrap the menu in an Offcanvas drawer (responsive offcanvas-in-navbar).
154+
*
155+
* @see https://getbootstrap.com/docs/5.3/components/navbar/#offcanvas
156+
*
157+
* @return \Ease\Html\DivTag Offcanvas drawer
158+
*/
159+
public function navBarOffcanvas()
160+
{
161+
$ocId = 'offcanvas'.$this->navBarName;
162+
163+
$header = new \Ease\Html\DivTag([
164+
new \Ease\Html\H5Tag(_('Menu'), ['class' => 'offcanvas-title', 'id' => $ocId.'Label']),
165+
new ButtonTag('', ['class' => 'btn-close', 'data-bs-dismiss' => 'offcanvas', 'aria-label' => _('Close')]),
166+
], ['class' => 'offcanvas-header']);
167+
168+
$body = new \Ease\Html\DivTag($this->leftContent, ['class' => 'offcanvas-body']);
169+
170+
return new \Ease\Html\DivTag([$header, $body], [
171+
'class' => 'offcanvas offcanvas-'.$this->offcanvasPlacement,
172+
'tabindex' => '-1',
173+
'id' => $ocId,
174+
'aria-labelledby' => $ocId.'Label',
175+
]);
176+
}
177+
139178
/**
140179
* Finalize NavBar.
141180
*/
142181
public function finalize(): void
143182
{
144-
$this->containerFluid->addItem($this->navbarCollapse());
183+
if ($this->offcanvas) {
184+
$ocId = 'offcanvas'.$this->navBarName;
185+
$this->toggler->setTagProperties([
186+
'data-bs-toggle' => 'offcanvas',
187+
'data-bs-target' => '#'.$ocId,
188+
'aria-controls' => $ocId,
189+
]);
190+
$this->containerFluid->addItem($this->navBarOffcanvas());
191+
} else {
192+
$this->containerFluid->addItem($this->navbarCollapse());
193+
}
194+
145195
parent::finalize();
146196
}
147197

src/Ease/TWB5/OffCanvas.php

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,65 @@
1919
use Ease\Html\DivTag;
2020
use Ease\Html\H5Tag;
2121

22+
/**
23+
* Bootstrap Offcanvas slide-in panel.
24+
*
25+
* @see https://getbootstrap.com/docs/5.3/components/offcanvas/
26+
*
27+
* @author Vítězslav Dvořák <info@vitexsoftware.cz>
28+
*/
2229
class OffCanvas extends DivTag
2330
{
24-
public function __construct($id, $title, $bodyContent)
25-
{
26-
$header = new DivTag(
27-
[
28-
new H5Tag($title, ['class' => 'offcanvas-title', 'id' => $id.'Label']),
29-
new ButtonTag('', ['class' => 'btn-close', 'data-bs-dismiss' => 'offcanvas', 'aria-label' => 'Close']),
30-
],
31-
['class' => 'offcanvas-header'],
32-
);
33-
34-
$body = new DivTag($bodyContent, ['class' => 'offcanvas-body']);
35-
36-
parent::__construct([$header, $body], [
37-
'class' => 'offcanvas offcanvas-start show',
31+
public DivTag $header;
32+
public DivTag $body;
33+
34+
/**
35+
* Bootstrap Offcanvas.
36+
*
37+
* @param string $id Unique offcanvas ID
38+
* @param mixed $title Header title
39+
* @param mixed $bodyContent Offcanvas body content
40+
* @param string $placement start|end|top|bottom
41+
* @param array<string, string> $properties Additional offcanvas div properties
42+
*/
43+
public function __construct(
44+
string $id,
45+
$title = null,
46+
$bodyContent = null,
47+
string $placement = 'start',
48+
array $properties = []
49+
) {
50+
parent::__construct(null, array_merge([
3851
'tabindex' => '-1',
39-
'id' => $id,
4052
'aria-labelledby' => $id.'Label',
53+
], $properties));
54+
$this->addTagClass('offcanvas offcanvas-'.$placement);
55+
$this->setTagID($id);
56+
57+
$this->header = new DivTag([
58+
new H5Tag($title, ['class' => 'offcanvas-title', 'id' => $id.'Label']),
59+
new ButtonTag('', ['class' => 'btn-close', 'data-bs-dismiss' => 'offcanvas', 'aria-label' => 'Close']),
60+
], ['class' => 'offcanvas-header']);
61+
62+
$this->body = new DivTag($bodyContent, ['class' => 'offcanvas-body']);
63+
64+
$this->addItem($this->header);
65+
$this->addItem($this->body);
66+
}
67+
68+
/**
69+
* Returns a button that toggles this offcanvas.
70+
*
71+
* @param mixed $label Button label
72+
* @param string $type primary|secondary|success|danger|warning|info|light|dark
73+
*/
74+
public function triggerButton($label, string $type = 'primary'): ButtonTag
75+
{
76+
return new ButtonTag($label, [
77+
'class' => 'btn btn-'.$type,
78+
'data-bs-toggle' => 'offcanvas',
79+
'data-bs-target' => '#'.$this->getTagID(),
80+
'aria-controls' => $this->getTagID(),
4181
]);
4282
}
4383
}

0 commit comments

Comments
 (0)