Files
resourcespace/pages/admin/tabs.php
2025-07-18 16:20:14 +07:00

296 lines
11 KiB
PHP

<?php
include '../../include/boot.php';
include '../../include/authenticate.php';
if (!acl_can_manage_tabs()) {
exit($lang['error-permissiondenied']);
}
// [Sorting functionality]
$tab_orderby = getval('tab_orderby', 'ref');
$tab_sort = (strtoupper(getval('tab_sort', 'ASC')) === 'DESC') ? 'DESC' : 'ASC';
// [URL]
$admin_tabs_management_page = "{$baseurl}/pages/admin/tabs.php";
$request_params = [
'tab_orderby' => $tab_orderby,
'tab_sort' => $tab_sort,
];
$admin_tabs_management_page_url = generateURL($admin_tabs_management_page, $request_params);
// [Action] Create new record
$new_tab_name = trim(getval('new_tab_name', ''));
if ($new_tab_name !== '' && enforcePostRequest(false)) {
$new_tab_ref = create_tab(['name' => $new_tab_name]);
if ($new_tab_ref !== false) {
redirect($admin_tabs_management_page_url);
}
$admin_tabs_management_error = "{$lang['error_fail_save']} -- $new_tab_name";
}
// [Paging functionality]
$per_page = (int) getval('per_page', $default_perpage_list, true);
$list_display_array[] = $default_perpage_list;
$list_display_array[] = $default_perpage;
if ($per_page === 99999) {
// all results option - see render_table()
$list_display_array['all'] = 99999;
$allow_reorder = true;
// When viewing all, switch to order by the "order_by" column since we also enabled re-ordering
$tab_orderby = 'order_by';
$tab_sort = 'ASC';
$request_params = [];
$admin_tabs_management_page_url = generateURL($admin_tabs_management_page, $request_params);
}
$list_display_array = array_unique($list_display_array);
natsort($list_display_array);
$per_page = in_array($per_page, $list_display_array) ? $per_page : $default_perpage;
rs_setcookie('per_page', $per_page);
$offset = (int) getval('offset', 0, true);
$tab_records = get_tabs_with_usage_count([
'order_by' => [$tab_orderby, $tab_sort],
'limit' => ['per_page' => $per_page, 'offset' => $offset],
]);
$tabsfound = count($tab_records["data"]) > 0;
if (!$tabsfound) {
// No results, go to last page
$offset = floor(($tab_records['total'] - 1) / $per_page) * $per_page;
$tab_records = get_tabs_with_usage_count([
'order_by' => [$tab_orderby, $tab_sort],
'limit' => ['per_page' => $per_page, 'offset' => $offset],
]);
}
$totalpages = ceil($tab_records['total'] / $per_page);
$curpage = floor($offset / $per_page) + 1;
$table_info = [
'class' => 'SystemTabs',
'headers' => [
'reorder_handle' => ['name' => '', 'sortable' => false, 'html' => true],
'ref' => ['name' => $lang['property-reference'], 'sortable' => !isset($allow_reorder)],
'name' => ['name' => $lang['name'], 'sortable' => false, 'html' => true, 'width' => '50%'],
'usage' => ['name' => $lang['usage'], 'sortable' => false],
'tools' => ['name' => $lang['tools'], 'sortable' => false, 'width' => '20%']
],
'orderbyname' => 'tab_orderby',
'orderby' => $tab_orderby,
'sortname' => 'tab_sort',
'sort' => $tab_sort,
'defaulturl' => $admin_tabs_management_page,
'params' => $request_params,
'pager' => [
'current' => $curpage,
'total' => $totalpages,
'per_page' => $per_page,
],
'data' => [],
];
foreach ($tab_records['data'] as $tab_record) {
$tab_record['reorder_handle'] = isset($allow_reorder) ? '<i class="fas fa-sort"></i>' : '';
$tab_record['name'] = sprintf(
'<span>%s</span><input name="tab_name_inline_edit_%s" type="text" class="DisplayNone" value="%s">',
escape(i18n_get_translated($tab_record['name'])),
escape($tab_record['ref']),
escape($tab_record['name'])
);
$tab_record['usage'] = sprintf(
'%s %s, %s %s',
$tab_record['usage_rtf'],
mb_strtolower($lang['admin_resource_type_fields']),
$tab_record['usage_rt'],
mb_strtolower($lang['resourcetypes'])
);
// Allow users to delete tabs except the Default one which is always ID #1 (created by dbstruct).
if ($tab_record['ref'] > 1) {
$tab_record['tools'] = [
[
'icon' => 'fa fa-fw fa-trash',
'text' => $lang['action-delete'],
'url' => '#',
'modal' => false,
'onclick' => "return delete_tabs(this, [{$tab_record['ref']}]);",
],
];
}
$tab_record['tools'][] = [
'icon' => 'fa fa-fw fa-edit',
'text' => $lang['action-edit'],
'url' => '#',
'modal' => false,
'onclick' => "return update_tab(this, {$tab_record['ref']}, \"init_edit\");"
];
// Save & Cancel buttons for when editing a tab record
$tab_record['tools'][] = [
'icon' => 'fa fa-solid fa-xmark',
'text' => $lang['cancel'],
'url' => '#',
'url:class' => 'DisplayNone',
'modal' => false,
'onclick' => "return update_tab(this, {$tab_record['ref']}, \"cancel\");"
];
$tab_record['tools'][] = [
'icon' => 'fa fa-regular fa-floppy-disk',
'text' => $lang['save'],
'url' => '#',
'url:class' => 'DisplayNone',
'modal' => false,
'onclick' => "return update_tab(this, {$tab_record['ref']}, \"save\");"
];
$table_info['data'][] = $tab_record;
}
include '../../include/header.php';
?>
<div class="BasicsBox">
<h1><?php echo escape($lang["system_tabs"]); ?></h1>
<?php
render_top_page_error_style($admin_tabs_management_error ?? '');
renderBreadcrumbs([
['title' => $lang['systemsetup'], 'href' => "{$baseurl_short}pages/admin/admin_home.php"],
['title' => $lang['system_tabs']],
]); ?>
<p>
<?php
echo escape($lang['manage_tabs_instructions']);
render_help_link('systemadmin/manage-tabs');
?>
</p>
<?php render_table($table_info); ?>
<!-- Create new tab form -->
<form method="post" action="<?php echo $admin_tabs_management_page_url; ?>" onsubmit="return CentralSpacePost(this, false);">
<?php generateFormToken('admin_tabs'); ?>
<div class="Question">
<label for="new_tab_name"><?php echo escape($lang['tabs_create_new']); ?></label>
<div class="tickset">
<div class="Inline">
<input name="new_tab_name" type="text" value="" id="new_tab_name" class="shrtwidth">
</div>
<div class="Inline">
<input
name="action_create"
type="submit"
value="<?php echo escape($lang['create']); ?>"
onclick="return (this.form.elements[0].value != '');"
>
</div>
</div>
<div class="clearerleft"></div>
</div>
</form>
</div>
<script>
// Re-order capability
jQuery(function() {
// Disable for touch screens
if (is_touch_device()) {
return false;
}
// Make all table rows sortable (except the header)
jQuery('.BasicsBox .Listview.SystemTabs > table').sortable({
items: 'tr:not(:first-child)',
handle: 'td > i.fa-sort',
containment: 'div.SystemTabs > table',
distance: 20,
update: function(event, ui) {
let tabs_new_order = jQuery(event.target)
.find('tr:not(:first-child) > td:nth-child(2)')
.map((i, val) => parseInt(jQuery(val).text())).get();
console.debug('[Re-ordering tabs] tabs_new_order = %o', tabs_new_order);
api('reorder_tabs', {'refs': tabs_new_order}, null, <?php echo generate_csrf_js_object('reorder_tabs'); ?>);
}
});
});
function delete_tabs(el, refs) {
console.debug('Called delete_tabs(refs = %o)', refs);
if (confirm('<?php echo escape($lang["confirm-deletion"]); ?>')) {
api('delete_tabs', {'refs': refs}, function(successful) {
if (successful) {
// Remove row from table
jQuery(el).parents('tr').remove();
} else {
styledalert("<?php echo escape($lang["error"]); ?>", "<?php echo escape($lang["error-failed-to-delete"]); ?>");
}
},
<?php echo generate_csrf_js_object('delete_tabs'); ?>
);
};
return false;
}
function update_tab(el, ref, action) {
console.debug('Called update_tab(ref = %o, action = %o)', ref, action);
let el_obj = jQuery(el);
let record = el_obj.parents('tr');
let tools = el_obj.parents('div.ListTools');
let tools_edit_save_cancel = tools.find('a i.fa-edit, a i.fa-floppy-disk, a i.fa-xmark').parents('a');
let record_name_inline_edit = record.find('input[name="tab_name_inline_edit_' + ref + '"');
let record_name_translated = record_name_inline_edit.siblings().first();
if (action === 'init_edit') {
// Hide the translated tab name and show the inline edit input
record_name_translated.toggleClass('DisplayNone');
record_name_inline_edit.toggleClass('DisplayNone');
// Hide the edit tool and show the Save & Cancel ones
tools_edit_save_cancel.toggleClass('DisplayNone');
} else if (action === 'save') {
api(
'save_tab',
{
tab: {
ref: ref,
name: record_name_inline_edit.val()
}
},
function(response) {
if (response.status === 'success') {
record_name_translated.text(response.data.name_translated);
} else {
styledalert("<?php echo escape($lang["error"]); ?>", response.data.message);
}
},
<?php echo generate_csrf_js_object('save_tab'); ?>
);
// Show the translated tab name and hide the inline edit input
record_name_translated.toggleClass('DisplayNone');
record_name_inline_edit.toggleClass('DisplayNone');
// Show the edit tool and hide the Save & Cancel ones
tools_edit_save_cancel.toggleClass('DisplayNone');
} else if (action === 'cancel') {
// Show the translated tab name and hide the inline edit input
record_name_translated.toggleClass('DisplayNone');
record_name_inline_edit.toggleClass('DisplayNone');
// Show the edit tool and hide the Save & Cancel ones
tools_edit_save_cancel.toggleClass('DisplayNone');
}
}
</script>
<?php
include '../../include/footer.php';