diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/Utils/HtmlTabs.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/Utils/HtmlTabs.php | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/Utils/HtmlTabs.php b/www/wiki/extensions/SemanticMediaWiki/src/Utils/HtmlTabs.php new file mode 100644 index 00000000..8cca3bf8 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/Utils/HtmlTabs.php @@ -0,0 +1,184 @@ +<?php + +namespace SMW\Utils; + +use Html; + +/** + * @license GNU GPL v2+ + * @since 3.0 + * + * @author mwjames + */ +class HtmlTabs { + + /** + * @var [] + */ + private $tabs = []; + + /** + * @var [] + */ + private $contents = []; + + /** + * @var [] + */ + private $hidden = []; + + /** + * @var string|null + */ + private $activeTab = null; + + /** + * @var string + */ + private $group = 'tabs'; + + /** + * @since 3.0 + * + * @param string $activeTab + */ + public function setActiveTab( $activeTab ) { + $this->activeTab = $activeTab; + } + + /** + * @since 3.0 + * + * @param string $group + */ + public function setGroup( $group ) { + $this->group = $group; + } + + /** + * @since 3.0 + * + * @param array $attributes + * + * @return string + */ + public function buildHTML( array $attributes = [] ) { + + $tabs = $this->tabs; + $contents = $this->contents; + + $this->tabs = []; + $this->contents = []; + + $attributes = $this->mergeAttributes( 'smw-tabs', $attributes ); + + return Html::rawElement( + 'div', + $attributes, + implode( '', $tabs ) . implode( '', $contents ) + ); + } + + /** + * @since 3.0 + * + * @param string $id + * @param string $name + * @param array $params + * + * @return string + */ + public function html( $html, array $params = [] ) { + + if ( isset( $params['hide'] ) && $params['hide'] ) { + return; + } + + $this->tabs[] = $html; + } + + /** + * @since 3.0 + * + * @param string $id + * @param string $name + * @param array $params + * + * @return string + */ + public function tab( $id, $name = '', array $params = [] ) { + + if ( isset( $params['hide'] ) && $params['hide'] ) { + return $this->hidden[$id] = true; + } + + $isChecked = false; + + // No acive tab means, select the first tab being added + if ( $this->activeTab === null ) { + $this->activeTab = $id; + } + + if ( $id === $this->activeTab ) { + $isChecked = true; + } + + $this->tabs[] = Html::rawElement( + 'input', + [ + 'id' => "tab-$id", + 'class' => 'nav-tab', + 'type' => 'radio', + 'name' => $this->group + ] + ( $isChecked ? [ 'checked' => 'checked' ] : [] ) + ) . Html::rawElement( + 'label', + [ + 'id' => "tab-label-$id", + 'for' => "tab-$id" + ] + $this->mergeAttributes( 'nav-label', $params ), + $name + ); + } + + /** + * @since 3.0 + * + * @param string $id + * @param string $content + */ + public function content( $id, $content ) { + + // Tab hidden? + if ( isset( $this->hidden[$id] ) ) { + return; + } + + $this->contents[] = Html::rawElement( + 'section', + [ + 'id' => "tab-content-$id" + ], + $content + ); + } + + private function mergeAttributes( $class, $attr ) { + + $attributes = []; + + // A bit of attribute order + if ( isset( $attr['id'] ) ) { + $attributes['id'] = $attr['id']; + } + + if ( isset( $attr['class'] ) ) { + $attributes['class'] = $class . ' ' . $attr['class']; + } else { + $attributes['class'] = $class; + } + + return $attributes += $attr; + } + +} |