183 lines
4.6 KiB
PHP
183 lines
4.6 KiB
PHP
<?php
|
|
namespace nur\v\bs3\plugins;
|
|
|
|
use nur\A;
|
|
use nur\func;
|
|
use nur\v\BasePlugin;
|
|
use nur\v\js;
|
|
use nur\v\v;
|
|
use nur\v\vo;
|
|
|
|
class navtabPlugin extends BasePlugin {
|
|
const COD_KEY = null;
|
|
const TITLE_KEY = null;
|
|
|
|
const FRAGMENT_PREFIX = "#nt:";
|
|
|
|
/** @var array liste de tableaux [cod, title] */
|
|
private $tabs;
|
|
|
|
/** @var array liste des codes valides */
|
|
private $tabCods;
|
|
|
|
function __construct(?array $tabs=null) {
|
|
$this->setTabs($tabs);
|
|
}
|
|
|
|
protected function filterTab($tab, ?array $tabs=null): bool {
|
|
return false;
|
|
}
|
|
|
|
protected function getCod($tab): string {
|
|
$codKey = static::COD_KEY;
|
|
$tab = A::with($tab);
|
|
if ($codKey !== null) return A::get($tab, $codKey, "");
|
|
return A::first($tab, "");
|
|
}
|
|
|
|
protected function getTitle($tab): ?string {
|
|
$titleKey = static::TITLE_KEY;
|
|
$tab = A::with($tab);
|
|
if ($titleKey !== null) return A::get($tab, $titleKey);
|
|
else return A::second($tab);
|
|
}
|
|
|
|
private function getCodTitle($tab): array {
|
|
$cod = $this->getCod($tab);
|
|
$title = $this->getTitle($tab);
|
|
if ($title == null) $title = $cod;
|
|
return [$cod, $title];
|
|
}
|
|
|
|
function setTabs(?array $tabs=null): void {
|
|
$tabs = A::with($tabs);
|
|
$filteredTabs = [];
|
|
$tabCods = [];
|
|
foreach ($tabs as $tab) {
|
|
if ($this->filterTab($tab, $tabs)) continue;
|
|
$filteredTabs[] = $tab;
|
|
$tabCods[] = $this->getCod($tab);
|
|
}
|
|
$this->tabs = $filteredTabs;
|
|
$this->tabCods = $tabCods;
|
|
}
|
|
|
|
const HAVE_JQUERY = true;
|
|
|
|
protected function jqSetup(): void {}
|
|
protected function jqBeforeDeactivate(): void {}
|
|
protected function jqAfterActivate(): void {}
|
|
|
|
function printJquery(): void {
|
|
$tabCods = $this->tabCods;
|
|
if (!$tabCods) return;
|
|
?>
|
|
<script type="text/javascript">
|
|
<?php $this->jqSetup(); ?>
|
|
var NAV_TABS = <?=js::qvs($tabCods)?>;
|
|
function activateTab(activeTab) {
|
|
<?php $this->jqBeforeDeactivate(); ?>
|
|
for (let i in NAV_TABS) {
|
|
let tab = NAV_TABS[i];
|
|
if (tab === activeTab) continue;
|
|
$("#" + tab + "_tab").removeClass("active");
|
|
$("#" + tab + "_panel").addClass("hide");
|
|
}
|
|
$("#" + activeTab + "_panel").removeClass("hide");
|
|
$("#" + activeTab + "_tab").addClass("active");
|
|
<?php $this->jqAfterActivate(); ?>
|
|
}
|
|
<?php foreach ($tabCods as $tabCod): ?>
|
|
$(<?=js::qv("#${tabCod}_tab")?>).click(function() {
|
|
activateTab(<?=js::qv($tabCod)?>);
|
|
return false;
|
|
});
|
|
<?php endforeach; ?>
|
|
function updateTab(initial=false) {
|
|
let prefix = <?=js::qv(static::FRAGMENT_PREFIX)?>;
|
|
let hash = window.location.hash;
|
|
let hashOk = false;
|
|
if (hash.startsWith(prefix)) {
|
|
let tab = hash.slice(prefix.length);
|
|
if ($("#" + tab + "_tab").length) {
|
|
activateTab(tab);
|
|
hashOk = true;
|
|
}
|
|
}
|
|
if (!hashOk && initial) {
|
|
for (let i in NAV_TABS) {
|
|
let tab = NAV_TABS[i];
|
|
if ($("#" + tab + "_tab").length) {
|
|
activateTab(tab);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$(window).on("hashchange", function() {
|
|
updateTab();
|
|
});
|
|
updateTab(true);
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
const URL_KEY = null;
|
|
protected function getUrl($tab): ?string {
|
|
$urlKey = static::URL_KEY;
|
|
if ($urlKey !== null) return A::get($tab, $urlKey);
|
|
else return null;
|
|
}
|
|
|
|
const BADGE_KEY = null;
|
|
protected function getBadge($tab): ?string {
|
|
$badgeKey = static::BADGE_KEY;
|
|
if ($badgeKey !== null) return A::get($tab, $badgeKey);
|
|
else return null;
|
|
}
|
|
|
|
function paTabs(?string $curCod=null): void {
|
|
$tabs = $this->tabs;
|
|
if (!$tabs) return;
|
|
vo::sul(["class" => "nav nav-tabs"]);
|
|
foreach ($tabs as $tab) {
|
|
[$cod, $title] = $this->getCodTitle($tab);
|
|
vo::li([
|
|
"id" => "${cod}_tab",
|
|
"class" => $cod === $curCod? "active": null,
|
|
"role" => "presentation",
|
|
v::a([
|
|
"href" => $this->getUrl($tab),
|
|
q($title),
|
|
v::span(["class" => "badge", $this->getBadge($tab)])
|
|
]),
|
|
]);
|
|
}
|
|
vo::eul();
|
|
}
|
|
|
|
function paStartPanel($cod): void {
|
|
if (!is_string($cod)) $cod = $this->getCod($cod);
|
|
vo::sdiv(["id" => "${cod}_panel"]);
|
|
}
|
|
|
|
function paEndPanel(): void {
|
|
vo::ediv();
|
|
}
|
|
|
|
function printActions(?string $curCod, callable $printPanel, ?callable $beforePanels=null, ?callable $afterPanels=null): bool {
|
|
$tabs = $this->tabs;
|
|
if (!$tabs) return false;
|
|
$func = func::_prepare($printPanel);
|
|
$this->paTabs($curCod);
|
|
if ($beforePanels !== null) $beforePanels();
|
|
foreach ($this->tabs as $tab) {
|
|
$this->paStartPanel($tab);
|
|
func::_call($func, [$tab, $this]);
|
|
$this->paEndPanel();
|
|
}
|
|
if ($afterPanels !== null) $afterPanels();
|
|
return true;
|
|
}
|
|
}
|