diff options
| author | Greg Roach <fisharebest@webtrees.net> | 2019-04-11 23:11:52 +0100 |
|---|---|---|
| committer | Greg Roach <fisharebest@webtrees.net> | 2019-04-11 23:13:20 +0100 |
| commit | 2ebb07b4bd8cf7010946ea4d75bb6160666157f6 (patch) | |
| tree | 1a2d6800033f777f15151d45a763a112f8b1c38a /modules_v4 | |
| parent | a0801ffbb59d5bed474fc7a91bf1863ebca47791 (diff) | |
| download | webtrees-2ebb07b4bd8cf7010946ea4d75bb6160666157f6.tar.gz webtrees-2ebb07b4bd8cf7010946ea4d75bb6160666157f6.tar.bz2 webtrees-2ebb07b4bd8cf7010946ea4d75bb6160666157f6.zip | |
Move treeview css/js from modules_v4 to resources
Diffstat (limited to 'modules_v4')
| -rw-r--r-- | modules_v4/tree/css/treeview.css | 336 | ||||
| -rw-r--r-- | modules_v4/tree/css/vline.gif | bin | 67 -> 0 bytes | |||
| -rw-r--r-- | modules_v4/tree/css/vline_b.gif | bin | 82 -> 0 bytes | |||
| -rw-r--r-- | modules_v4/tree/css/vline_t.gif | bin | 131 -> 0 bytes | |||
| -rw-r--r-- | modules_v4/tree/images/compact.png | bin | 295 -> 0 bytes | |||
| -rw-r--r-- | modules_v4/tree/js/treeview.js | 362 | ||||
| -rw-r--r-- | modules_v4/tree/module.php | 22 |
7 files changed, 0 insertions, 720 deletions
diff --git a/modules_v4/tree/css/treeview.css b/modules_v4/tree/css/treeview.css deleted file mode 100644 index 896df55e6f..0000000000 --- a/modules_v4/tree/css/treeview.css +++ /dev/null @@ -1,336 +0,0 @@ -/** - * webtrees: online genealogy - * Copyright (C) 2019 webtrees development team - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -.tv_out { - position: relative; - overflow: hidden; - height: 100%; - border: thin solid #CCCCCC; /* customizable */ - min-height: 350px; /* customizable, not mandatory, but should be set to have allways something to display */ - max-height: 95vh; /* customizable, not mandatory, but should be set not too high to limit the size of ajax requests and not too low to enable whole big trees printing */ - background: #E6E6E6; /* customizable */ - display: -webkit-box; - display: -moz-box; - display: flex; - align-items: center; - justify-content: center; -} -.tv_out img { - border: 0; -} - -.tv_in { - clear: both; - cursor: move; - display: inline-block; /* prevent from blinking on IE */ -} - -.tv_in table.tv_tree, -.tv_in table.tv_tree tbody, -.tv_in table.tv_tree tr, -.tv_in table.tv_tree td { - border: 0 none; - padding: 0; - margin: 0; - background: none; - font-size: 11px; -} -.tv_in table.tv_tree { - border-collapse: collapse; -} - -/* Border (also have class table.tv_tree) */ -table#tvTreeBorder td#tv_tree_topleft { - background: none; -} -table#tvTreeBorder td#tv_tree_top { - background: none; -} -table#tvTreeBorder td#tv_tree_top div{ - font-family: Arial,Verdana,sans-serif; - font-size: 18px; -} -table#tvTreeBorder td#tv_tree_topright { - background: none; -} -table#tvTreeBorder td#tv_tree_left { - background: none; -} -table#tvTreeBorder td#tv_tree_right { - background: none; -} -table#tvTreeBorder td#tv_tree_bottomleft { - background: none; -} -table#tvTreeBorder td#tv_tree_bottom { - background: none; -} -table#tvTreeBorder td#tv_tree_bottomright { - background: none; -} -/* tree */ -table#tvTreeBorder td, -#tv_tree { - background: none; -} - -/* horizontal and vertical lines color */ -#tv_tree div.tv_vline, -#tv_tree div.tv_hline { - background-color: #81A9CB; /* customizable :should be the same color than in background images of td.tv_vline_x */ -} - -/* TD container for a vertical line */ -#tv_tree table.tv_tree td.tv_vline { - width: 1px; - background: repeat-x 50% 50%; - height: 100%; /* required */ -} -#tv_tree table.tv_tree td.tv_vline_h { - background-image: url(vline.gif); /* customizable: image color must be the same color than div.tv_vline and div.tv_hline */ -} -#tv_tree table.tv_tree td.tv_vline_t { - vertical-align: bottom; - background-image: url(vline_t.gif); /* customizable: image color must be the same color than div.tv_vline and div.tv_hline */ -} -#tv_tree table.tv_tree td.tv_vline_b { - vertical-align: top; - background-image: url(vline_b.gif); /* customizable: image color must be the same color than div.tv_vline and div.tv_hline */ -} -#tv_tree table.tv_tree td.tv_vline_c, -.tv_in table.tv_tree td.tv_vline_h { - vertical-align: middle; -} -#tv_tree table.tv_tree td.tv_vline_c { - height: 1px; -} -/* vertical line drawing */ -#tv_tree table.tv_tree div.tv_vline { - width: 1px; -} -#tv_tree table.tv_tree div.tv_vline_t, -#tv_tree table.tv_tree div.tv_vline_b { - height: 50%; -} -#tv_tree table.tv_tree div.tv_vline_c { - height: 1px; - overflow: hidden; /* required for IE */ -} -#tv_tree table.tv_tree div.tv_vline_h { - height: 100%; -} - -/* horizontal line drawing */ -#tv_tree td.tv_hline, -#tv_tree div.tv_hline { - overflow: hidden; /* required for IE */ - width: 8px; /* customizable */ -} -#tv_tree div.tv_hline { - height: 1px; -} - -/* Person or couple(s) box style */ -#tv_tree div.tv_box { - border: thin outset #81A9CB; /* customizable */ - background: #fffdfd; /* customizable */ - margin-top: 2px; - margin-bottom: 2px; - padding: 0; - width: 180px; /* customizable:initial box width */ - cursor: help; /* customizable */ - border-collapse: collapse; /* required */ - border-radius: 4px; /* customizable */ - box-shadow: 1px 1px 2px #cfcfdf; /* customizable */ -} -#tv_tree div.boxExpanded { - width: 250px; /* customizable:initial expanded box width */ -} -#tv_tree div.tv_box div.tvM { - background: #f5fdff; /* customizable */ - color: #220000; /* customizable */ -} -#tv_tree div.tv_box div.tvF { - background: #fff8f5; /* customizable */ - color: #000022; /* customizable */ -} -#tv_tree div.tv_box span.tvSexSymbol { - font-weight: bold; - font-family: x-large, serif; /*Arial Unicode MS, monospace; /* customizable, BUT test required for ALL browsers */ - vertical-align: top; - margin: 1px; -} -#tv_tree div.tv_box span.tvM { - color: #8f8fdf; /* customizable */ -} -#tv_tree div.tv_box span.tvF { - color: #df8f8f; /* customizable */ -} - -#tv_tree div.tv_box div.tvM, -#tv_tree .tv_box div.tvF { - clear: both; - border: 0; - margin: 0; - padding: 1px 4px; - border-radius: 4px; /* customizable */ -} -#tv_tree div.tv_box i.dates { - float: right; - font-size: 75%; - margin-left: 4px; -} -#tv_tree div.tv_box img.tv_treelink { - height: 15px; - width: 15px; - float: right; -} -#tv_tree div.tv_box img.tv_box_loading { - height: 12px; - width: 12px; - margin: 2px; - float: right; -} -#tv_tree div.tv_box div.tv_person_expanded { - min-height: 55px; - padding: 2px; -} -#tv_tree div.tv_box img { - float: left; - margin: 2px; - max-height: 50px; - max-width: 80px; - width: auto; -} -[dir=rtl] #tv_tree div.tv_box img { - float: right; -} -#tv_tree div.tv_box .icon-silhouette-M, -#tv_tree div.tv_box .icon-silhouette-F, -#tv_tree div.tv_box .icon-silhouette-U { - float: left; -} -[dir=rtl] #tv_tree div.tv_box .icon-silhouette-M, -[dir=rtl] #tv_tree div.tv_box .icon-silhouette-F, -[dir=rtl] #tv_tree div.tv_box .icon-silhouette-U { - float: right; -} - -#tv_tree div.tv_box div.tv_person_expanded a { - font-weight: bold; -} - -/* The toolbox style. Button's images come from the active theme */ -#tv_tools, -#tvStylesSubmenu { - display: inline-block; - position: absolute; - left: 0; - top: 0; - padding: 0; - margin: 0; /* required */ - z-index: 90; /* should be < 100 because 100 is the z-index of WT menus */ - background-color: #efefef; /* customizable */ - border: 1px outset #dfdfdf; /* customizable */ - border-radius: 4px; /* customizable */ - box-shadow: 1px 1px 2px #cfcfdf; /* customizable */ -} - -/* styles submenu */ -#tvStylesSubmenu { - display: none; - left: 0; - top: 0; - z-index: 91; /* just over tv_tools */ -} - -#tv_tools ul { - list-style: none; - margin: 0; - padding: 0; /* required */ -} -#tv_tools li.tv_button { - float: left; - position: relative; - padding: 0; /* required */ - margin: 0; - width: 24px; - height: 24px; - text-align: center; - vertical-align: middle; - border: thin solid #efefef; /* customizable */ - background-color: #efefef; /* customizable */ - border-radius: 4px; -} -#tvStylesSubmenu li.tv_button { - float : none; -} -#tv_tools li.tv_button a { - margin: 0; - display: block; -} -#tv_tools li.tv_button:hover { - background: #fffdfd; /* customizable */ - border: thin outset #fdfffd; /* customizable */ - cursor: pointer; -} -#tv_tools li.tvPressed { - border: thin inset #ffffff; /* customizable */ -} -#tv_tools ul li img { - border: none; - margin: 0; - padding: 0; - width: 22px; - height: 22px; - cursor: pointer; - text-align: center; - vertical-align: middle; -} -#tv_tools ul li a.help img.icon { - margin: 3px 0 0; - padding: 0; - width: 15px; - height: 15px; -} - -#tvToolsHandler { - float: left; - cursor: move; - height: 22px; - width: 2px; - border: thin inset #f6f6f6; /* customizable */ - margin: 2px; - overflow: hidden; /* required for IE */ -} - -#tvToolsHandler:hover { - border: thin outset #f6f6f6; /* customizable */ -} - - -#tv_tree div.tv_box div.tvM, -#tv_tree div.tv_box div.tvF { - background: none; - color: #000; - border: 0; - margin: 0; - padding: 0 4px; -} - -.tvM {background-color: #DDF !important;} -.tvF {background-color: #FDD !important;} - -.dashed {border-top: thin dashed #81A9CB !important;} diff --git a/modules_v4/tree/css/vline.gif b/modules_v4/tree/css/vline.gif Binary files differdeleted file mode 100644 index 22ea74d62e..0000000000 --- a/modules_v4/tree/css/vline.gif +++ /dev/null diff --git a/modules_v4/tree/css/vline_b.gif b/modules_v4/tree/css/vline_b.gif Binary files differdeleted file mode 100644 index c29c4106d7..0000000000 --- a/modules_v4/tree/css/vline_b.gif +++ /dev/null diff --git a/modules_v4/tree/css/vline_t.gif b/modules_v4/tree/css/vline_t.gif Binary files differdeleted file mode 100644 index f37cf7d9f5..0000000000 --- a/modules_v4/tree/css/vline_t.gif +++ /dev/null diff --git a/modules_v4/tree/images/compact.png b/modules_v4/tree/images/compact.png Binary files differdeleted file mode 100644 index 07b092d1ed..0000000000 --- a/modules_v4/tree/images/compact.png +++ /dev/null diff --git a/modules_v4/tree/js/treeview.js b/modules_v4/tree/js/treeview.js deleted file mode 100644 index b625d43f30..0000000000 --- a/modules_v4/tree/js/treeview.js +++ /dev/null @@ -1,362 +0,0 @@ -/** - * webtrees: online genealogy - * Copyright (C) 2019 webtrees development team - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -function TreeViewHandler(treeview_instance, ged) { - var tv = this; // Store "this" for usage within jQuery functions where "this" is not this ;-) - - this.treeview = $("#" + treeview_instance + "_in"); - this.loadingImage = $("#" + treeview_instance + "_loading"); - this.toolbox = $("#tv_tools"); - this.buttons = $(".tv_button:first", this.toolbox); - this.zoom = 100; // in percent - this.boxWidth = 180; // default family box width - this.boxExpandedWidth = 250; // default expanded family box width - this.cookieDays = 3; // lifetime of preferences memory, in days - this.ajaxUrl = "index.php?route=module&module=tree&ged=" + encodeURIComponent(ged) + "&instance=" + treeview_instance + "&action="; - - this.container = this.treeview.parent(); // Store the container element ("#" + treeview_instance + "_out") - this.auto_box_width = false; - this.updating = false; - - // Restore user preferences - if (readCookie("compact") === "true") { - tv.compact(); - } - - /////////////////////////////////////////////// - // Based on https://codepen.io/chriscoyier/pen/zdsty - (function($) { - $.fn.drags = function(opt) { - var $el = this; - - return $el.css('cursor', 'move').on("mousedown", function(e) { - var $drag = $(this); - var drg_h = $drag.outerHeight(); - var drg_w = $drag.outerWidth(); - var pos_y = $drag.offset().top + drg_h - e.pageY; - var pos_x = $drag.offset().left + drg_w - e.pageX; - - $drag.addClass('draggable'); - - $(document) - .on("mousemove", function(e) { - $('.draggable').offset({ - top:e.pageY + pos_y - drg_h, - left:e.pageX + pos_x - drg_w - }).on("mouseup", function() { - $drag.removeClass('draggable'); - }); - }).on("mouseup", function() { - $drag.removeClass('draggable'); - tv.updateTree(); - }); - e.preventDefault(); - }); - - } - })(jQuery); - - tv.treeview.drags(); - /////////////////////////////////////////////// - - // Add click handlers to buttons - tv.toolbox.find("#tvbCompact").each(function (index, tvCompact) { - tvCompact.onclick = function () { - tv.compact(); - }; - }); - // If we click the "hide/show all partners" button, toggle the setting before reloading the page - tv.toolbox.find("#tvbAllPartners").each(function (index, tvAllPartners) { - tvAllPartners.onclick = function () { - createCookie("allPartners", readCookie("allPartners") === "true" ? "false" : "true", tv.cookieDays); - document.location = document.location; - }; - }); - tv.toolbox.find("#tvbOpen").each(function (index, tvbOpen) { - var b = $(tvbOpen, tv.toolbox); - tvbOpen.onclick = function () { - b.addClass("tvPressed"); - tv.setLoading(); - var e = jQuery.Event("click"); - tv.treeview.find(".tv_box:not(.boxExpanded)").each(function (index, box) { - var pos = $(box, tv.treeview).offset(); - if (pos.left >= tv.leftMin && pos.left <= tv.leftMax && pos.top >= tv.topMin && pos.top <= tv.topMax) { - tv.expandBox(box, e); - } - }); - b.removeClass("tvPressed"); - tv.setComplete(); - }; - }); - tv.toolbox.find("#tvbClose").each(function (index, tvbClose) { - var b = $(tvbClose, tv.toolbox); - tvbClose.onclick = function () { - b.addClass("tvPressed"); - tv.setLoading(); - tv.treeview.find(".tv_box.boxExpanded").each(function (index, box) { - $(box).css("display", "none").removeClass("boxExpanded").parent().find(".tv_box.collapsedContent").css("display", "block"); - }); - b.removeClass("tvPressed"); - tv.setComplete(); - }; - }); - - tv.centerOnRoot(); // fire ajax update if needed, which call setComplete() when all is loaded -} -/** - * Class TreeView setLoading method - */ -TreeViewHandler.prototype.setLoading = function () { - this.treeview.css("cursor", "wait"); - this.loadingImage.css("display", "block"); -}; -/** - * Class TreeView setComplete method - */ -TreeViewHandler.prototype.setComplete = function () { - this.treeview.css("cursor", "move"); - this.loadingImage.css("display", "none"); -}; - -/** - * Class TreeView getSize method - * Store the viewport current size - */ -TreeViewHandler.prototype.getSize = function () { - var tv = this; - // retrieve the current container bounding box - var container = tv.container.parent(); - var offset = container.offset(); - tv.leftMin = offset.left; - tv.leftMax = tv.leftMin + container.innerWidth(); - tv.topMin = offset.top; - tv.topMax = tv.topMin + container.innerHeight(); - /* - var frm = $("#tvTreeBorder"); - tv.treeview.css("width", frm.width()); - tv.treeview.css("height", frm.height());*/ -}; - -/** - * Class TreeView updateTree method - * Perform ajax requests to complete the tree after drag - * param boolean @center center on root person when done - */ -TreeViewHandler.prototype.updateTree = function (center, button) { - var tv = this; // Store "this" for usage within jQuery functions where "this" is not this ;-) - var to_load = []; - var elts = []; - this.getSize(); - - // check which td with datafld attribute are within the container bounding box - // and therefore need to be dynamically loaded - tv.treeview.find("td[abbr]").each(function (index, el) { - el = $(el, tv.treeview); - var pos = el.offset(); - if (pos.left >= tv.leftMin && pos.left <= tv.leftMax && pos.top >= tv.topMin && pos.top <= tv.topMax) { - to_load.push(el.attr("abbr")); - elts.push(el); - } - }); - // if some boxes need update, we perform an ajax request - if (to_load.length > 0) { - tv.updating = true; - tv.setLoading(); - jQuery.ajax({ - url: tv.ajaxUrl + "Persons", - dataType: "json", - data: "q=" + to_load.join(";"), - success: function (ret) { - var nb = elts.length; - var root_element = $(".rootPerson", this.treeview); - var l = root_element.offset().left; - for (var i = 0; i < nb; i++) { - elts[i].removeAttr("abbr").html(ret[i]); - } - // we now ajust the draggable treeview size to its content size - tv.getSize(); - }, - complete: function () { - if (tv.treeview.find("td[abbr]").length) { - tv.updateTree(center, button); // recursive call - } - // the added boxes need that in mode compact boxes - if (tv.auto_box_width) { - tv.treeview.find(".tv_box").css("width", "auto"); - } - tv.updating = true; // avoid an unuseful recursive call when all requested persons are loaded - if (center) { - tv.centerOnRoot(); - } - if (button) { - button.removeClass("tvPressed"); - } - tv.setComplete(); - tv.updating = false; - }, - timeout: function () { - if (button) { - button.removeClass("tvPressed"); - } - tv.updating = false; - tv.setComplete(); - } - }); - } else { - if (button) { - button.removeClass("tvPressed"); - } - tv.setComplete(); - } - return false; -}; - -/** - * Class TreeView compact method - */ -TreeViewHandler.prototype.compact = function () { - var tv = this; - var b = $("#tvbCompact", tv.toolbox); - tv.setLoading(); - if (tv.auto_box_width) { - var w = tv.boxWidth * (tv.zoom / 100) + "px"; - var ew = tv.boxExpandedWidth * (tv.zoom / 100) + "px"; - tv.treeview.find(".tv_box:not(boxExpanded)", tv.treeview).css("width", w); - tv.treeview.find(".boxExpanded", tv.treeview).css("width", ew); - tv.auto_box_width = false; - if (readCookie("compact")) { - createCookie("compact", false, tv.cookieDays); - } - b.removeClass("tvPressed"); - } else { - tv.treeview.find(".tv_box").css("width", "auto"); - tv.auto_box_width = true; - if (!readCookie("compact")) { - createCookie("compact", true, tv.cookieDays); - } - if (!tv.updating) { - tv.updateTree(); - } - b.addClass("tvPressed"); - } - tv.setComplete(); - return false; -}; - -/** - * Class TreeView centerOnRoot method - */ -TreeViewHandler.prototype.centerOnRoot = function () { - this.loadingImage.css("display", "block"); - var tv = this; - var tvc = this.container; - var tvc_width = tvc.innerWidth() / 2; - if (isNaN(tvc_width)) { - return false; - } - var tvc_height = tvc.innerHeight() / 2; - var root_person = $(".rootPerson", this.treeview); - - if (!this.updating) { - tv.setComplete(); - } - return false; -}; - -/** - * Class TreeView expandBox method - * param string @box the person box element - * param string @event the call event - * param string @pid the person id - * - * called ONLY for elements which have NOT the class tv_link to avoid unuseful requests to the server - */ -TreeViewHandler.prototype.expandBox = function (box, event) { - var t = $(event.target); - if (t.hasClass("tv_link")) { - return false; - } - - var box = $(box, this.treeview); - var bc = box.parent(); // bc is Box Container - var pid = box.attr("abbr"); - var tv = this; // Store "this" for usage within jQuery functions where "this" is not this ;-) - var expanded; - var collapsed; - - if (bc.hasClass("detailsLoaded")) { - collapsed = bc.find(".collapsedContent"); - expanded = bc.find(".tv_box:not(.collapsedContent)"); - } else { - // Cache the box content as an hidden person's box in the box's parent element - expanded = box; - collapsed = box.clone(); - bc.append(collapsed.addClass("collapsedContent").css("display", "none")); - // we add a waiting image at the right side of the box - var loading_image = this.loadingImage.find("img").clone().addClass("tv_box_loading").css("display", "block"); - box.prepend(loading_image); - tv.updating = true; - tv.setLoading(); - // perform the Ajax request and load the result in the box - box.load(tv.ajaxUrl + "Details&pid=" + pid, function () { - // If Lightbox module is active, we reinitialize it for the new links - if (typeof CB_Init === "function") { - CB_Init(); - } - box.css("width", tv.boxExpandedWidth * (tv.zoom / 100) + "px"); - loading_image.remove(); - bc.addClass("detailsLoaded"); - tv.setComplete(); - tv.updating = false; - }); - } - if (box.hasClass("boxExpanded")) { - expanded.css("display", "none"); - collapsed.css("display", "block"); - box.removeClass("boxExpanded"); - } else { - expanded.css("display", "block"); - collapsed.css("display", "none"); - expanded.addClass("boxExpanded"); - } - // we must ajust the draggable treeview size to its content size - this.getSize(); - return false; -}; - -function createCookie(name, value, days) { - if (days) { - var date = new Date(); - date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); - document.cookie = name + "=" + value + "; expires=" + date.toGMTString() + "; path=/"; - } else { - document.cookie = name + "=" + value + "; path=/"; - } -} - -function readCookie(name) { - var name_equals = name + "="; - var ca = document.cookie.split(';'); - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) === ' ') { - c = c.substring(1, c.length); - } - if (c.indexOf(name_equals) === 0) { - return c.substring(name_equals.length, c.length); - } - } - return null; -} diff --git a/modules_v4/tree/module.php b/modules_v4/tree/module.php deleted file mode 100644 index 8cbf0ebe8c..0000000000 --- a/modules_v4/tree/module.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/** - * webtrees: online genealogy - * Copyright (C) 2019 webtrees development team - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -declare(strict_types=1); - -namespace Fisharebest\Webtrees; - -use Fisharebest\Webtrees\Module\InteractiveTreeModule; - -return new InteractiveTreeModule(); |
