xref: /webtrees/app/Module/ModuleChartTrait.php (revision e873f434551745f888937263ff89e80db3b0f785)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2023 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Module;
21
22use Fisharebest\Webtrees\Individual;
23use Fisharebest\Webtrees\Menu;
24
25/**
26 * Trait ModuleChartTrait - default implementation of ModuleChartInterface
27 */
28trait ModuleChartTrait
29{
30    /**
31     * A unique internal name for this module (based on the installation folder).
32     *
33     * @return string
34     */
35    abstract public function name(): string;
36
37    /**
38     * How should this module be identified in the control panel, etc.?
39     *
40     * @return string
41     */
42    abstract public function title(): string;
43
44    /**
45     * A menu item for this chart for an individual box in a chart.
46     *
47     * @param Individual $individual
48     *
49     * @return Menu|null
50     */
51    public function chartBoxMenu(Individual $individual): Menu|null
52    {
53        return null;
54    }
55
56    /**
57     * A main menu item for this chart.
58     *
59     * @param Individual $individual
60     *
61     * @return Menu
62     */
63    public function chartMenu(Individual $individual): Menu
64    {
65        return new Menu(
66            $this->title(),
67            $this->chartUrl($individual),
68            $this->chartMenuClass(),
69            $this->chartUrlAttributes()
70        );
71    }
72
73    /**
74     * CSS class for the menu.
75     *
76     * @return string
77     */
78    public function chartMenuClass(): string
79    {
80        return '';
81    }
82
83    /**
84     * The title for a specific instance of this chart.
85     *
86     * @param Individual $individual
87     *
88     * @return string
89     */
90    public function chartTitle(Individual $individual): string
91    {
92        return $this->title();
93    }
94
95    /**
96     * The URL for a page showing chart options.
97     *
98     * @param Individual                                $individual
99     * @param array<bool|int|string|array<string>|null> $parameters
100     *
101     * @return string
102     */
103    public function chartUrl(Individual $individual, array $parameters = []): string
104    {
105        return route('module', [
106            'module' => $this->name(),
107            'action' => 'Chart',
108            'xref'   => $individual->xref(),
109            'tree'   => $individual->tree()->name(),
110        ] + $parameters);
111    }
112
113    /**
114     * Attributes for the URL.
115     *
116     * @return array<string>
117     */
118    public function chartUrlAttributes(): array
119    {
120        return ['rel' => 'nofollow'];
121    }
122}
123