[TikiWiki-commits] [Git][tikiwiki/tiki][master] [ENH] Tracker items list: show or hide fields for non admins
"Jonny Bradley \(@jonnybradley\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <68a60443ae377_2cd6dbc57897@gitlab-sidekiq-low-urgency-cpu-bound-v2-7cf5dbccb9-z2tdr.mail> |
Jonny Bradley pushed to branch master at Tiki Wiki CMS Groupware / Tiki
Commits:
4c842c11 by Marcellin Wabo at 2025-08-20T17:14:14+00:00
[ENH] Tracker items list: show or hide fields for non admins
---
* Set saving delay to 2s instead of 5s.
* Remove unnecessary .ready
* [ENH][UX] Saves automatically after a few seconds
Remove submit button, leverage delayedExecutor function in tiki-jquery.js to save automatically
the user pref for tracker columns display after 5 seconds if change detected
* Fix: set a default value for the user pref to avoid error when it is missing
* Add support for multiple trackers col display value for a user
* Fix pipeline issues
* Save user preference (remember the shown/hidden fields) to Tiki database
* [ENH] Save user preference (remember the shown/hidden fields / columns)
* [ENH] Tracker items list: show or hide fields for non admins
This MR aims to make it possible for non-admins to show or hide tracker fields in the items list.
We add checkboxes corresponding to all the "visible" tracker fields so the user can toggle their visibility.
Context: https://avan.tech/item68453
See merge request tikiwiki/tiki!8153
- - - - -
5 changed files:
- doc/devtools/codesniffer/standards/TikiIgnore/ignore_list.json
- lib/core/Services/User/Controller.php
- lib/userprefs/userprefslib.php
- templates/tiki-view_tracker.tpl
- tiki-view_tracker.php
Changes:
=====================================
doc/devtools/codesniffer/standards/TikiIgnore/ignore_list.json
=====================================
@@ -7114,7 +7114,8 @@
"Services_User_Controller::action_get_message_count": true,
"Services_User_Controller::action_invite_tempuser": true,
"Services_User_Controller::action_upload_avatar": true,
- "Services_User_Controller::action_set_user_lock_status": true
+ "Services_User_Controller::action_set_user_lock_status": true,
+ "Services_User_Controller::action_save_column_prefs":true
},
"lib\/core\/Services\/User\/MonitorController.php": {
"Services_User_MonitorController::action_object": true,
@@ -8071,7 +8072,8 @@
"UserPrefsLib::get_user_picture_id": true,
"UserPrefsLib::get_userprefs": true,
"UserPrefsLib::get_userdistance": true,
- "UserPrefsLib::get_user_clock_pref": true
+ "UserPrefsLib::get_user_clock_pref": true,
+ "UserPrefsLib::get_user_tracker_items_col_pref": true
},
"lib\/trackers\/trackerlib.php": {
"TrackerLib::remove_field_images": true,
=====================================
lib/core/Services/User/Controller.php
=====================================
@@ -1282,4 +1282,13 @@ class Services_User_Controller
$ret = $userlib->validate_user($username, $password);
return $ret[0];
}
+
+ public function action_save_column_prefs($input)
+ {
+ global $user;
+ $columns = $input->prefs->value();
+ $tracker_name = $input->trackerName->value();
+ TikiLib::lib('tiki')->set_user_preference($user, 'trk_items_column_pref', $columns);
+ return tr('Your column preference for tracker "%0" is saved.', $tracker_name);
+ }
}
=====================================
lib/userprefs/userprefslib.php
=====================================
@@ -256,4 +256,15 @@ class UserPrefsLib extends TikiLib
}
return $use_24hr_clock;
}
+
+ /**
+ * @param $user
+ * @return string
+ */
+ public function get_user_tracker_items_col_pref($user): string
+ {
+ $tikilib = TikiLib::lib('tiki');
+ $trk_items_col_pref = $tikilib->get_user_preference($user, 'trk_items_column_pref') ?? "{}";
+ return $trk_items_col_pref;
+ }
}
=====================================
templates/tiki-view_tracker.tpl
=====================================
@@ -147,11 +147,38 @@
{if (isset($pages_count) && $pages_count > 1) or $initial}{initials_filter_links}{/if}
{if $items|@count ge '1'}
+ {* ------- list toggleable fields --- *}
+ {if $trk_items_col_pref neq ''}
+ <textarea id="savedcolpref" class="d-none">{$trk_items_col_pref}</textarea>
+ {/if}
+ <form id="savecolprefsform" method="post" action="{service controller=user action=save_column_prefs}">
+ {ticket}
+ <div class="mb-3">
+ <div class="toggle-col-warning d-none">
+ {remarksbox type="danger" title="{tr}Warning{/tr}" close="y"}
+ {tr}{"At least one column must remain visible."}{/tr}
+ {/remarksbox}
+ </div>
+ {foreach from=$listfields key=ix item=field_value}
+ {if $field_value.isTblVisible eq 'y' and ( $field_value.type ne 'x' and $field_value.type ne 'h') and ($field_value.type ne 'p' or $field_value.options_array[0] ne 'password') and $field_value.visibleInViewMode eq 'y'}
+ <div class="form-check form-check-inline">
+ <input type="checkbox" class="form-check-input toggle-col" data-col-name="{$field_value.name}" checked>
+ <label class="form-check-label">{$field_value.name|tra|truncate:255:"..."|escape|default:" "}</label>
+ </div>
+ {/if}
+ {/foreach}
+ </div>
+ <div class="mb-3">
+ <textarea name="prefs" id="prefs" class="d-none"></textarea>
+ <input name="trackerId" type="hidden" id="col_pref_trackerid" value="{$trackerId}">
+ <input name="trackerName" type="hidden" value="{tr}{$tracker_info.name}{/tr}">
+ </div>
+ </form>
{* ------- list headings --- *}
<form name="checkform" method="post">
{ticket}
<div class="{if $js}table-responsive{/if}"> {*the table-responsive class cuts off dropdown menus *}
- <table class="table table-striped table-hover">
+ <table class="table table-striped table-hover" id="trItemTable">
<tr>
{if $tracker_info.showStatus eq 'y' or ($tracker_info.showStatusAdminOnly eq 'y' and $tiki_p_admin_trackers eq 'y')}
<td class="auto" style="width:20px;"></td> {* th changed to td to prevent ARIA empty header error *}
@@ -165,7 +192,7 @@
{foreach from=$listfields key=ix item=field_value}
{if $field_value.isTblVisible eq 'y' and ( $field_value.type ne 'x' and $field_value.type ne 'h') and ($field_value.type ne 'p' or $field_value.options_array[0] ne 'password') and $field_value.visibleInViewMode eq 'y'}
- <th class="auto">
+ <th class="auto" data-col-name="{$field_value.name}">
{self_link _sort_arg='sort_mode' _sort_field='f_'|cat:$field_value.fieldId}{$field_value.name|tra|truncate:255:"..."|escape|default:" "}{/self_link}
</th>
{/if}
@@ -224,7 +251,7 @@
}
{foreach from=$items[user].field_values key=ix item=field_value}
{if $field_value.isTblVisible eq 'y' and $field_value.type ne 'x' and $field_value.type ne 'h' and ($field_value.type ne 'p' or $field_value.options_array[0] ne 'password') and $field_value.visibleInViewMode eq 'y'}
- <td class={if $field_value.type eq 'n' or $field_value.type eq 'q' or $field_value.type eq 'b'}"numeric"{else}"auto"{/if}>
+ <td class={if $field_value.type eq 'n' or $field_value.type eq 'q' or $field_value.type eq 'b'}"numeric"{else}"auto"{/if} data-col-name="{$field_value.name}">
{if $field_value.type eq 'wiki'}
<a href="tiki-index.php?page={$field_value.value|escape:"url"}">{$field_value.value}</a>
{else}
@@ -336,6 +363,73 @@
{/if}
</form>
{pagination_links count=$item_count step=$maxRecords offset=$offset}{/pagination_links}
+ {jq}
+ loadColumnPrefs();
+
+ $('.toggle-col').on('change', function () {
+ const checkedboxes = $('.toggle-col:checked');
+ let form = $('#savecolprefsform');
+
+ if (checkedboxes.length === 0) {
+ $(this).prop('checked', true);
+ $('.toggle-col-warning').removeClass('d-none');
+ return;
+ }
+ $('.toggle-col').each(function () {
+ const columnName = $(this).data('col-name');
+ const isVisible = $(this).is(':checked');
+ $('#trItemTable [data-col-name="' + columnName + '"]').toggle(isVisible);
+ });
+ $('#prefs').val(getColumnPrefs());
+ saveColsPref();
+ });
+
+ function getColumnPrefs() {
+ const prefs = {};
+ let currentSavedPrefs = JSON.parse($('#savedcolpref').val());
+ const trackerId = $('#col_pref_trackerid').val();
+ const colprefkey = 'tracker_' + trackerId;
+
+ $('.toggle-col').each(function() {
+ const columnName = $(this).data('col-name');
+ const isChecked = $(this).is(':checked');
+ prefs[columnName] = isChecked;
+ });
+ currentSavedPrefs[colprefkey] = prefs;
+ return JSON.stringify(currentSavedPrefs);
+ }
+
+ function loadColumnPrefs() {
+ let savedPrefs = $('#savedcolpref').val();
+ const trackerId = $('#col_pref_trackerid').val();
+ const colprefkey = 'tracker_' + trackerId;
+
+ if (savedPrefs) {
+ let prefs = JSON.parse(savedPrefs);
+ const actual_tracker_prefs = prefs[colprefkey];
+ Object.keys(actual_tracker_prefs).forEach(function (columnName) {
+ const checkbox = $('.toggle-col[data-col-name="' + columnName +'"]');
+ checkbox.prop('checked', actual_tracker_prefs[columnName]);
+ $('#trItemTable [data-col-name="' + columnName + '"]').toggle(actual_tracker_prefs[columnName]);
+ });
+ }
+ }
+
+ const saveColsPref = delayedExecutor(2000, function () {
+ let form = $('#savecolprefsform');
+ $.ajax({
+ url: form.attr('action'),
+ type: 'POST',
+ data: form.serialize(),
+ success: function (message) {
+ if (! message) {
+ feedback(tr('An error occured while attempting to save your column preference.'), 'error');
+ }
+ feedback(message, 'success');
+ }
+ });
+ });
+ {/jq}
{/if}
{/tab}
{/if}
=====================================
tiki-view_tracker.php
=====================================
@@ -620,6 +620,7 @@ if ($prefs['feature_jquery_validation'] == 'y') {
$userprefslib = TikiLib::lib('userprefs');
$smarty->assign('use_24hr_clock', $userprefslib->get_user_clock_pref($user));
+$smarty->assign('trk_items_col_pref', $userprefslib->get_user_tracker_items_col_pref($user));
// Display the template
$smarty->assign('mid', 'tiki-view_tracker.tpl');
$smarty->display("tiki.tpl");
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/4c842c114bd0617a2b3cbd2c992510339294ac72
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/4c842c114bd0617a2b3cbd2c992510339294ac72
You're receiving this email because of your account on gitlab.com.
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs