. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Controllers\PedigreeChartController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; use Fisharebest\Webtrees\Tree; use Symfony\Component\HttpFoundation\Request; /** * Class ChartsBlockModule */ class ChartsBlockModule extends AbstractModule implements ModuleInterface, ModuleBlockInterface { use ModuleBlockTrait; /** {@inheritdoc} */ public function title(): string { /* I18N: Name of a module/block */ return I18N::translate('Charts'); } /** {@inheritdoc} */ public function description(): string { /* I18N: Description of the “Charts” module */ return I18N::translate('An alternative way to display charts.'); } /** * Generate the HTML content of this block. * * @param Tree $tree * @param int $block_id * @param string $ctype * @param string[] $cfg * * @return string */ public function getBlock(Tree $tree, int $block_id, string $ctype = '', array $cfg = []): string { $PEDIGREE_ROOT_ID = $tree->getPreference('PEDIGREE_ROOT_ID'); $gedcomid = $tree->getUserPreference(Auth::user(), 'gedcomid'); $type = $this->getBlockSetting($block_id, 'type', 'pedigree'); $pid = $this->getBlockSetting($block_id, 'pid', Auth::check() ? ($gedcomid ?: $PEDIGREE_ROOT_ID) : $PEDIGREE_ROOT_ID); extract($cfg, EXTR_OVERWRITE); $person = Individual::getInstance($pid, $tree); if (!$person) { $pid = $PEDIGREE_ROOT_ID; $this->setBlockSetting($block_id, 'pid', $pid); $person = Individual::getInstance($pid, $tree); } $title = $this->title(); if ($person) { $content = ''; switch ($type) { case 'pedigree': $title = I18N::translate('Pedigree of %s', $person->getFullName()); $chart_url = route('pedigree-chart', [ 'xref' => $person->xref(), 'ged' => $person->tree()->name(), 'generations' => 3, 'layout' => PedigreeChartController::PORTRAIT, ]); $content = view('modules/charts/chart', [ 'block_id' => $block_id, 'chart_url' => $chart_url, ]); break; case 'descendants': $title = I18N::translate('Descendants of %s', $person->getFullName()); $chart_url = route('descendants-chart', [ 'xref' => $person->xref(), 'ged' => $person->tree()->name(), 'generations' => 2, 'chart_style' => 0, ]); $content = view('modules/charts/chart', [ 'block_id' => $block_id, 'chart_url' => $chart_url, ]); break; case 'hourglass': $title = I18N::translate('Hourglass chart of %s', $person->getFullName()); $chart_url = route('hourglass-chart', [ 'xref' => $person->xref(), 'ged' => $person->tree()->name(), 'generations' => 2, 'layout' => PedigreeChartController::PORTRAIT, ]); $content = view('modules/charts/chart', [ 'block_id' => $block_id, 'chart_url' => $chart_url, ]); break; case 'treenav': $title = I18N::translate('Interactive tree of %s', $person->getFullName()); $mod = new InteractiveTreeModule(); $tv = new TreeView(); $content .= ''; $content .= ''; [$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 ($ctype !== '') { if ($ctype === 'gedcom' && Auth::isManager($tree)) { $config_url = route('tree-page-block-edit', [ 'block_id' => $block_id, 'ged' => $tree->name(), ]); } elseif ($ctype === 'user' && Auth::check()) { $config_url = route('user-page-block-edit', [ 'block_id' => $block_id, 'ged' => $tree->name(), ]); } else { $config_url = ''; } return view('modules/block-template', [ 'block' => str_replace('_', '-', $this->getName()), 'id' => $block_id, 'config_url' => $config_url, 'title' => strip_tags($title), 'content' => $content, ]); } return $content; } /** {@inheritdoc} */ public function loadAjax(): bool { return true; } /** {@inheritdoc} */ public function isUserBlock(): bool { return true; } /** {@inheritdoc} */ public function isGedcomBlock(): bool { return true; } /** * Update the configuration for a block. * * @param Request $request * @param int $block_id * * @return void */ public function saveBlockConfiguration(Request $request, int $block_id) { $this->setBlockSetting($block_id, 'type', $request->get('type', 'pedigree')); $this->setBlockSetting($block_id, 'pid', $request->get('pid', '')); } /** * An HTML form to edit block settings * * @param Tree $tree * @param int $block_id * * @return void */ public function editBlockConfiguration(Tree $tree, int $block_id) { $PEDIGREE_ROOT_ID = $tree->getPreference('PEDIGREE_ROOT_ID'); $gedcomid = $tree->getUserPreference(Auth::user(), 'gedcomid'); $type = $this->getBlockSetting($block_id, 'type', 'pedigree'); $pid = $this->getBlockSetting($block_id, 'pid', Auth::check() ? ($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'); $individual = Individual::getInstance($pid, $tree); echo view('modules/charts/config', [ 'charts' => $charts, 'individual' => $individual, 'tree' => $tree, 'type' => $type, ]); } }