[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:"&nbsp;"}</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:"&nbsp;"}{/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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.