. */ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Bootstrap4; use Fisharebest\Webtrees\Controller\HourglassController; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\FontAwesome; use Fisharebest\Webtrees\Functions\FunctionsEdit; use Fisharebest\Webtrees\Functions\FunctionsPrint; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; use Fisharebest\Webtrees\Theme; /** * Class ChartsBlockModule */ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface { /** {@inheritdoc} */ public function getTitle() { return /* I18N: Name of a module/block */ I18N::translate('Charts'); } /** {@inheritdoc} */ public function getDescription() { return /* I18N: Description of the “Charts” module */ I18N::translate('An alternative way to display charts.'); } /** * Generate the HTML content of this block. * * @param int $block_id * @param bool $template * @param string[] $cfg * * @return string */ public function getBlock($block_id, $template = true, $cfg = []) { global $WT_TREE, $ctype, $controller; $PEDIGREE_ROOT_ID = $WT_TREE->getPreference('PEDIGREE_ROOT_ID'); $gedcomid = $WT_TREE->getUserPreference(Auth::user(), 'gedcomid'); $type = $this->getBlockSetting($block_id, 'type', 'pedigree'); $pid = $this->getBlockSetting($block_id, 'pid', Auth::check() ? ($gedcomid ? $gedcomid : $PEDIGREE_ROOT_ID) : $PEDIGREE_ROOT_ID); foreach (['type', 'pid'] as $name) { if (array_key_exists($name, $cfg)) { $$name = $cfg[$name]; } } $person = Individual::getInstance($pid, $WT_TREE); if (!$person) { $pid = $PEDIGREE_ROOT_ID; $this->setBlockSetting($block_id, 'pid', $pid); $person = Individual::getInstance($pid, $WT_TREE); } $id = $this->getName() . $block_id; $class = $this->getName() . '_block'; if ($ctype == 'gedcom' && Auth::isManager($WT_TREE) || $ctype == 'user' && Auth::check()) { $title = FontAwesome::linkIcon('preferences', I18N::translate('Preferences'), ['class' => 'btn btn-link', 'href' => 'block_edit.php?block_id=' . $block_id . '&ged=' . $WT_TREE->getNameHtml() . '&ctype=' . $ctype]) . ' '; } else { $title = ''; } if ($person) { $content = ''; switch ($type) { case 'pedigree': $title .= I18N::translate('Pedigree of %s', $person->getFullName()); $chartController = new HourglassController($person->getXref()); $controller->addInlineJavascript($chartController->setupJavascript()); $content .= ''; $content .= ''; $content .= ''; $content .= '
'; ob_start(); FunctionsPrint::printPedigreePerson($person); $content .= ob_get_clean(); $content .= ''; ob_start(); $chartController->printPersonPedigree($person, 1); $content .= ob_get_clean(); $content .= '
'; break; case 'descendants': $title .= I18N::translate('Descendants of %s', $person->getFullName()); $chartController = new HourglassController($person->getXref()); $controller->addInlineJavascript($chartController->setupJavascript()); ob_start(); $chartController->printDescendency($person, 1, false); $content .= ob_get_clean(); break; case 'hourglass': $title .= I18N::translate('Hourglass chart of %s', $person->getFullName()); $chartController = new HourglassController($person->getXref()); $controller->addInlineJavascript($chartController->setupJavascript()); $content .= ''; $content .= ''; $content .= ''; $content .= '
'; ob_start(); $chartController->printDescendency($person, 1, false); $content .= ob_get_clean(); $content .= ''; ob_start(); $chartController->printPersonPedigree($person, 1); $content .= ob_get_clean(); $content .= '
'; break; case 'treenav': $title .= I18N::translate('Interactive tree of %s', $person->getFullName()); $mod = new InteractiveTreeModule(WT_MODULES_DIR . 'tree'); $tv = new TreeView; $content .= ''; $content .= ''; list($html, $js) = $tv->drawViewport($person, 2); $content .= $html . ''; break; } } else { $content = I18N::translate('You must select an individual and a chart type in the block preferences'); } if ($template) { return Theme::theme()->formatBlock($id, $title, $class, $content); } else { return $content; } } /** {@inheritdoc} */ public function loadAjax() { return true; } /** {@inheritdoc} */ public function isUserBlock() { return true; } /** {@inheritdoc} */ public function isGedcomBlock() { return true; } /** * An HTML form to edit block settings * * @param int $block_id */ public function configureBlock($block_id) { global $WT_TREE, $controller; $PEDIGREE_ROOT_ID = $WT_TREE->getPreference('PEDIGREE_ROOT_ID'); $gedcomid = $WT_TREE->getUserPreference(Auth::user(), 'gedcomid'); if (Filter::postBool('save') && Filter::checkCsrf()) { $this->setBlockSetting($block_id, 'type', Filter::post('type', 'pedigree|descendants|hourglass|treenav', 'pedigree')); $this->setBlockSetting($block_id, 'pid', Filter::post('pid', WT_REGEX_XREF)); } $type = $this->getBlockSetting($block_id, 'type', 'pedigree'); $pid = $this->getBlockSetting($block_id, 'pid', Auth::check() ? ($gedcomid ? $gedcomid : $PEDIGREE_ROOT_ID) : $PEDIGREE_ROOT_ID); $charts = [ 'pedigree' => I18N::translate('Pedigree'), 'descendants' => I18N::translate('Descendants'), 'hourglass' => I18N::translate('Hourglass chart'), 'treenav' => I18N::translate('Interactive tree'), ]; uasort($charts, 'Fisharebest\Webtrees\I18N::strcasecmp'); ?>
'type', 'name' => 'type']) ?>
'pid', 'name' => 'pid']) ?>