Skip to content

Commit

Permalink
Merge pull request #511 from Neriderc/max-levels
Browse files Browse the repository at this point in the history
Add limit to max levels
  • Loading branch information
Neriderc authored Oct 29, 2024
2 parents 39c6c2d + 7749174 commit e8e46c1
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 10 deletions.
6 changes: 6 additions & 0 deletions app/FormSubmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ public function load($vars, $module): array
$settings['marriage_prefix'] = $vars["marriage_prefix"];
}

foreach (Settings::USER_ROLES as $role) {
if (isset($vars['limit_levels_' . strtolower($role)])) {
$settings['limit_levels_' . strtolower($role)] = I18N::digits($vars['limit_levels_' . strtolower($role)]);
}
}

$settings['mark_not_related'] = isset($vars['mark_not_related']);
$settings['faster_relation_check'] = isset($vars['faster_relation_check']);

Expand Down
33 changes: 33 additions & 0 deletions app/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class Settings
public const OPTION_BORDER_FAMILY = 320;
public const OPTION_BORDER_VITAL_COLOUR = 330;
public const OPTION_BORDER_AGE_COLOUR = 340;
public const USER_ROLES = ['Visitor', 'Member', 'Editor', 'Moderator', 'Manager'];
const TREE_PREFIX = "_t";
const USER_PREFIX = "_u";
private array $settings_json_cache = [];
Expand Down Expand Up @@ -76,6 +77,7 @@ public function __construct(){
$this->defaultSettings['sharednote_col_data'] = '[]';
$this->defaultSettings['updated_date'] = '';
$this->defaultSettings['highlight_custom_json'] = '{}';
$this->defaultSettings['limit_levels'] = '0';

}

Expand Down Expand Up @@ -187,6 +189,7 @@ public function loadUserSettings(GVExport $module, Tree $tree, string $id = self
if (!$settings['enable_graphviz'] && $settings['graphviz_bin'] != "") {
$settings['graphviz_bin'] = "";
}
$settings['limit_levels'] = $this->getLevelLimit($tree, $settings);
return $settings;
}

Expand Down Expand Up @@ -484,13 +487,19 @@ public static function shouldSaveSetting(string $preference, int $context = self
case 'border_col_type_options':
case 'settings_sort_order_options':
case 'click_action_indi_options':
case 'limit_levels':
return false;
case 'show_debug_panel':
case 'filename':
case 'mclimit':
case 'birth_prefix':
case 'death_prefix':
case 'marriage_prefix':
case 'limit_levels_visitor':
case 'limit_levels_member':
case 'limit_levels_editor':
case 'limit_levels_moderator':
case 'limit_levels_manager':
return $context == self::CONTEXT_ADMIN;
case 'show_diagram_panel':
return $context != self::CONTEXT_NAMED_SETTING;
Expand Down Expand Up @@ -816,4 +825,28 @@ public function getSettingsName($module, $tree, $settings_id)
$userSettings = $this->loadUserSettings($module, $tree, $settings_id);
return $userSettings['save_settings_name'];
}

/**
* Find the maximum number of ancestor or descendant levels this user is allowed
*
* @param $tree
* @param $settings
* @return string
*/
private function getLevelLimit($tree, $settings)
{
if (Auth::isAdmin()) {
return '99';
} else if (Auth::isManager($tree)) {

Check warning on line 840 in app/Settings.php

View workflow job for this annotation

GitHub Actions / Qodana for PHP

Undefined class

Undefined class 'Auth'
return $settings['limit_levels_manager'];
} else if (Auth::isModerator($tree)) {
return $settings['limit_levels_moderator'];
} else if (Auth::isEditor($tree)) {
return $settings['limit_levels_editor'];
} else if (Auth::isMember($tree)) {
return $settings['limit_levels_member'];
} else {
return $settings['limit_levels_visitor'];
}
}
}
5 changes: 5 additions & 0 deletions config.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@
'birth_prefix' => '*', // Text shown on chart before the birthdate
'death_prefix' => '', // Text shown on chart before the death date
'marriage_prefix' => '', // Text shown on chart before the marriage date
'limit_levels_visitor' => '5', // How many ancestor or descendant levels a user with this privilege can select up to
'limit_levels_member' => '10', // How many ancestor or descendant levels a user with this privilege can select up to
'limit_levels_editor' => '15', // How many ancestor or descendant levels a user with this privilege can select up to
'limit_levels_moderator' => '20', // How many ancestor or descendant levels a user with this privilege can select up to
'limit_levels_manager' => '25', // How many ancestor or descendant levels a user with this privilege can select up to
'save_settings_name' => '', // Default value for text field where name of settings can be entered
'settings_sort_order' => 0, // Default value sorting the settings - default of 0 means the oldest items are first, new items go on the bottom of the list.
'show_diagram_panel' => false, // If set to true, a "Saved diagrams" section is shown at the top, that lists settings saved using the feature to save multiple versions of settings
Expand Down
6 changes: 4 additions & 2 deletions module.php
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,8 @@ public function postChartAction(ServerRequestInterface $request): ResponseInterf
try {
$temp_dir = $this->saveDOTFile($tree, $vars_data);
} catch (Exception $e) {
return Registry::responseFactory()->response('Failed to generate file', StatusCodeInterface::STATUS_NOT_ACCEPTABLE);
// Remove comments around $e below to get a proper error message. Ensure full error is not showing for prod.
return Registry::responseFactory()->response('Failed to generate file' /* . $e */, StatusCodeInterface::STATUS_NOT_ACCEPTABLE);

Check warning on line 260 in module.php

View workflow job for this annotation

GitHub Actions / Qodana for PHP

Undefined class

Undefined class 'Registry'

Check warning on line 260 in module.php

View workflow job for this annotation

GitHub Actions / Qodana for PHP

Undefined class

Undefined class 'StatusCodeInterface'
}
// If browser mode, output dot instead of selected file
$file_type = isset($_POST["browser"]) && $_POST["browser"] == "true" ? "dot" : $vars_data["output_type"];
Expand Down Expand Up @@ -349,7 +350,8 @@ function createGraphVizDump($tree, $vars_data, $temp_dir): string
$vars['temp_dir'] = $temp_dir;
}
$dot->setSettings($vars);

$dot->settings['ancestor_levels'] = min($vars['ancestor_levels'], $dot->settings['limit_levels']);
$dot->settings['descendant_levels'] = min($vars['descendant_levels'], $dot->settings['limit_levels']);
$settings = new Settings();
$settings->saveUserSettings($this, $tree,$dot->settings);
// Get out DOT file
Expand Down
3 changes: 1 addition & 2 deletions resources/css/gvexport.css
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,7 @@
}

.list_item_skinny {
width: 80%;
display: block;
width: 80% !important;
}

.list_item_content {
Expand Down
6 changes: 3 additions & 3 deletions resources/javascript/MainPage/Form.js
Original file line number Diff line number Diff line change
Expand Up @@ -531,10 +531,10 @@ const Form = {
newListItem.setAttribute("data-xref", xref);
newListItem.setAttribute("onclick", "UI.scrollToRecord('" + xref + "')");
const listItemIndi = document.createElement("span");
listItemIndi.innerHTML = contents + "<div class=\"saved-settings-ellipsis\" onclick=\"Form.indiList.removeItem(event, this.parentElement" + (colour === '' ? '' : '.parentElement') + ", '" + otherXrefId + "')\"><a class='pointer'>×</a></div>";
listItemIndi.innerHTML = contents + "<div class=\"saved-settings-ellipsis\" onclick=\"Form.indiList.removeItem(event, this.parentElement.parentElement" + ", '" + otherXrefId + "')\"><a class='pointer'>×</a></div>";
newListItem.appendChild(listItemIndi);
if (colour !== '') {
listItemIndi.setAttribute('class', 'list_item_skinny');
listItemIndi.setAttribute('class', 'list_item_skinny list_item_content');
let picker = `<input type="color" class="highlight_picker" data-xref="${xref}" value="${colour}">`;
newListItem.innerHTML = newListItem.innerHTML + picker;
newListItem.querySelector('.highlight_picker')?.addEventListener('change', Form.indiList.updateHighlightColour);
Expand Down Expand Up @@ -562,14 +562,14 @@ const Form = {
removeItem(e, element, xrefListId) {
e.stopPropagation();
let xref = element.getAttribute("data-xref").trim();
let list = document.getElementById(xrefListId);
removeFromXrefList(xref, xrefListId);
element.remove();
if (xrefListId === 'xref_list') {
mainPage.Url.changeURLXref(list.value.split(',')[0].trim());
}
updateClearAll();
if (xrefListId === 'highlight_custom_json') {
let list = document.getElementById(xrefListId);
let data = JSON.parse(list.value);
delete data[xref];
list.value = JSON.stringify(data);
Expand Down
2 changes: 1 addition & 1 deletion resources/javascript/gvexport.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ function pageLoaded(Url) {
document.addEventListener("mousedown", function(event) {

// Hide diagram context menu if clicked off a tile
if (event.target.closest('.settings_ellipsis_menu_item') == null && event.target.parent.id !== 'menu-info') {
if (event.target.closest('.settings_ellipsis_menu_item') == null && event.target.parent && event.target.parent.id !== 'menu-info') {
UI.contextMenu.clearContextMenu();
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use vendor\WebtreesModules\gvexport\MainPage;
</div>
<div class="align-middle-container">
<label for="ancestor_levels" class="col-sm-6"><?= I18N::translate('Max levels') ?></label>
<input type="number" min="0" max="99" class="cart_toggle form-control max-level-box" size="3" name="vars[ancestor_levels]" id="ancestor_levels" value="<?= I18N::digits($vars["ancestor_levels"]); ?>">
<input type="number" min="0" max="<?= $admin ? '99' : $vars['limit_levels'] ?>" class="cart_toggle form-control max-level-box" size="3" name="vars[ancestor_levels]" id="ancestor_levels" value="<?= I18N::digits($vars["ancestor_levels"]); ?>">
</div>
</div>
<div class="col-sm-6">
Expand All @@ -28,7 +28,7 @@ use vendor\WebtreesModules\gvexport\MainPage;
</div>
<div class="align-middle-container">
<label for="descendant_levels" class="col-sm-6"><?= I18N::translate('Max levels') ?></label>
<input type="number" min="0" max="99" class="cart_toggle form-control max-level-box" size="3" name="vars[descendant_levels]" id="descendant_levels"
<input type="number" min="0" max="<?= $admin ? '99' : $vars['limit_levels'] ?>" class="cart_toggle form-control max-level-box" size="3" name="vars[descendant_levels]" id="descendant_levels"
value="<?= I18N::digits($vars["descendant_levels"]); ?>">
</div>
</div>
Expand Down
14 changes: 14 additions & 0 deletions resources/views/settings.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,20 @@ $usegraphviz = $vars['graphviz_bin'] != "";
<label for="marriage_prefix"><?= I18N::translate('Marriage date prefix') ?>:</label>
<input class="form-control col-sm-6" type="text" name="vars[marriage_prefix]" id="marriage_prefix" pattern="^[A-Za-z0-9_ .*+()^%$#@!†∞-]*$" title="<?= I18N::translate('Letters, numbers, spaces, or the following symbols: ') . "_.*+()^%$#@!†∞-"; ?>" value="<?= e($vars["marriage_prefix"]); ?>">
</div>
<hr>
<label class="col-sm-4 col-form-label"><?= I18N::translate('Limit ancestor and descendant levels') ?></label>
<div class="col-sm-8 options-panel-background">
<?php
foreach (Settings::USER_ROLES as $role) {
?>
<div>
<label for="limit_levels_<?= strtolower($role); ?>"><?= I18N::translate($role) ?>:</label>
<input type="number" min="0" max="99" class="form-control max-level-box" size="3" name="vars[limit_levels_<?= strtolower($role); ?>]" id="limit_levels_<?= strtolower($role); ?>" value="<?= I18N::digits($vars["limit_levels_" . strtolower($role)]); ?>">
</div>
<?php
}
?>
</div>
</div>

<h2><?= I18N::translate('Default values for GVExport'); ?></h2>
Expand Down

0 comments on commit e8e46c1

Please sign in to comment.