xref: /webtrees/app/Module/InteractiveTreeModule.php (revision 309092efc56540a95d8117fad7180fe470aadff6)
1<?php
2namespace Fisharebest\Webtrees;
3
4/**
5 * webtrees: online genealogy
6 * Copyright (C) 2015 webtrees development team
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19use Zend_Session;
20
21/**
22 * Class InteractiveTreeModule
23 * Tip : you could change the number of generations loaded before ajax calls both in individual page and in treeview page to optimize speed and server load
24 */
25class InteractiveTreeModule extends AbstractModule implements ModuleTabInterface {
26	var $headers; // CSS and script to include in the top of <head> section, before theme’s CSS
27	var $js; // the TreeViewHandler javascript
28
29	/** {@inheritdoc} */
30	public function getTitle() {
31		return /* I18N: Name of a module */ I18N::translate('Interactive tree');
32	}
33
34	/** {@inheritdoc} */
35	public function getDescription() {
36		return /* I18N: Description of the “Interactive tree” module */ I18N::translate('An interactive tree, showing all the ancestors and descendants of an individual.');
37	}
38
39	/** {@inheritdoc} */
40	public function defaultTabOrder() {
41		return 68;
42	}
43
44	/** {@inheritdoc} */
45	public function getTabContent() {
46		global $controller;
47
48		$tv = new TreeView('tvTab');
49		list($html, $js) = $tv->drawViewport($controller->record, 3);
50		return
51			'<script src="' . $this->js() . '"></script>' .
52			'<script src="' . WT_JQUERYUI_TOUCH_PUNCH_URL . '"></script>' .
53			'<script>' . $js . '</script>' .
54			$html;
55	}
56
57	/** {@inheritdoc} */
58	public function hasTabContent() {
59		return !Auth::isSearchEngine();
60	}
61
62	/** {@inheritdoc} */
63	public function isGrayedOut() {
64		return false;
65	}
66
67	/** {@inheritdoc} */
68	public function canLoadAjax() {
69		return true;
70	}
71
72	/** {@inheritdoc} */
73	public function getPreLoadContent() {
74		// We cannot use jQuery("head").append(<link rel="stylesheet" ...as jQuery is not loaded at this time
75		return
76			'<script>
77			if (document.createStyleSheet) {
78				document.createStyleSheet("' . $this->css() . '"); // For Internet Explorer
79			} else {
80				var newSheet=document.createElement("link");
81    		newSheet.setAttribute("rel","stylesheet");
82    		newSheet.setAttribute("type","text/css");
83   			newSheet.setAttribute("href","' . $this->css() . '");
84		    document.getElementsByTagName("head")[0].appendChild(newSheet);
85			}
86			</script>';
87	}
88
89	/** {@inheritdoc} */
90	public function modAction($mod_action) {
91		global $controller, $WT_TREE;
92
93		switch ($mod_action) {
94		case 'treeview':
95			$controller = new ChartController;
96			$tv = new TreeView('tv');
97			ob_start();
98
99			$person = $controller->getSignificantIndividual();
100
101			list($html, $js) = $tv->drawViewport($person, 4);
102
103			$controller
104				->setPageTitle(I18N::translate('Interactive tree of %s', $person->getFullName()))
105				->pageHeader()
106				->addExternalJavascript($this->js())
107				->addExternalJavascript(WT_JQUERYUI_TOUCH_PUNCH_URL)
108				->addInlineJavascript($js)
109				->addInlineJavascript('
110					if (document.createStyleSheet) {
111						document.createStyleSheet("' . $this->css() . '"); // For Internet Explorer
112					} else {
113						jQuery("head").append(\'<link rel="stylesheet" type="text/css" href="' . $this->css() . '">\');
114					}
115				');
116			echo $html;
117			break;
118
119		case 'getDetails':
120			Zend_Session::writeClose();
121			header('Content-Type: text/html; charset=UTF-8');
122			$pid = Filter::get('pid', WT_REGEX_XREF);
123			$i = Filter::get('instance');
124			$tv = new TreeView($i);
125			$individual = Individual::getInstance($pid, $WT_TREE);
126			if ($individual) {
127				echo $tv->getDetails($individual);
128			}
129			break;
130
131		case 'getPersons':
132			Zend_Session::writeClose();
133			header('Content-Type: text/html; charset=UTF-8');
134			$q = Filter::get('q');
135			$i = Filter::get('instance');
136			$tv = new TreeView($i);
137			echo $tv->getPersons($q);
138			break;
139
140		default:
141			http_response_code(404);
142			break;
143		}
144	}
145
146	/**
147	 * @return string
148	 */
149	public function css() {
150		return WT_STATIC_URL . WT_MODULES_DIR . $this->getName() . '/css/treeview.css';
151	}
152
153	/**
154	 * @return string
155	 */
156	public function js() {
157		return WT_STATIC_URL . WT_MODULES_DIR . $this->getName() . '/js/treeview.js';
158	}
159}
160