(function($){ if (!$ || !$('#fsTree').length) return; // ======= CONFIG — edit to match your backend ======= var OPEN_URL = 'resources.php'; // page that shows folder contents var OPEN_PARAM = 'id'; // query param for folder id, e.g. ?id=123 var DELETE_URL = 'resources.php'; // page that handles delete var DELETE_PARAM = 'delete'; // query param for delete id, e.g. ?delete=123 var ENABLE_DELETE= false; // <<< controls visibility & binding var CSRF_PARAM = ''; // optional; set '' to omit var CSRF_TOKEN = ''; // optional // =================================================== // remove old namespaced handlers, then rebind fresh $('#fsTree').off('.fstree .fstreeDelete'); // ---------- helpers ---------- function setIcons($btn, open){ var $icons = $btn.find('i'); var $chev = $icons.eq(0); var $fold = $icons.eq(1); if ($chev.length){ $chev.toggleClass('fa-chevron-down', !!open) .toggleClass('fa-chevron-right', !open); } if ($fold.length){ $fold.toggleClass('fa-folder-open', !!open) .toggleClass('fa-folder', !open); } } function setOpen($btn, open){ var $children = $btn.next('ul'); if (!$children.length) return; $btn.attr('aria-expanded', String(!!open)); setIcons($btn, open); $children.toggleClass('d-none', !open); } function getId($el){ var id = $el.data('id'); return (id === undefined || id === null || id === '') ? null : String(id); } function labelText($el){ return $.trim($el.clone().children('i').remove().end().text()); } function openFolderById(id){ var url = OPEN_URL; if (id != null){ url += (url.indexOf('?') === -1 ? '?' : '&') + encodeURIComponent(OPEN_PARAM) + '=' + encodeURIComponent(id); } window.location.href = url; } function redirectDeleteById(id){ var url = DELETE_URL + (DELETE_URL.indexOf('?') === -1 ? '?' : '&') + encodeURIComponent(DELETE_PARAM) + '=' + encodeURIComponent(id); if (CSRF_PARAM && CSRF_TOKEN){ url += '&' + encodeURIComponent(CSRF_PARAM) + '=' + encodeURIComponent(CSRF_TOKEN); } window.location.href = url; } // ---------- initialize open state ---------- $('#fsTree .tree-toggle').each(function(){ var $btn = $(this), $kids = $btn.next('ul'); if (!$kids.length) return; var attr = $btn.attr('aria-expanded'); var open = (attr == null) ? !$kids.hasClass('d-none') : (attr === 'true'); setOpen($btn, open); }); // ---------- (re)render delete buttons based on ENABLE_DELETE ---------- function renderDeleteButtons(){ // start from a clean slate to avoid duplicates when toggling at runtime $('#fsTree .node-actions').remove(); if (!ENABLE_DELETE) return; $('#fsTree').find('.tree-toggle, .tree-leaf').each(function(){ var $label = $(this); var id = getId($label); if (!id) return; // no delete for Root (empty data-id) var $bar = $( '' + '' + '' ); // Keep always visible even if older CSS tried to hide it $bar.css({ opacity: 1, pointerEvents: 'auto' }); $bar.insertAfter($label); }); } // ---------- bind/unbind delete handler based on ENABLE_DELETE ---------- function bindDeleteHandler(){ // clear previous delete bindings only $('#fsTree').off('click.fstreeDelete', '.act-delete'); if (!ENABLE_DELETE) return; $('#fsTree').on('click.fstreeDelete', '.act-delete', function(e){ e.preventDefault(); e.stopPropagation(); // don't toggle/open the folder var $li = $(this).closest('li'); var $lbl = $li.children('.tree-toggle, .tree-leaf').first(); var id = getId($lbl); if (!id) return; var name = labelText($lbl); if (!confirm('Delete "' + name + '" folder?\n\nAll files/subfolders may be removed. This cannot be undone.')) return; redirectDeleteById(id); }); } // initial render according to ENABLE_DELETE renderDeleteButtons(); bindDeleteHandler(); // ---------- interactions ---------- // Click on collapsible folder label: toggle and navigate $('#fsTree').on('click.fstree', '.tree-toggle', function(e){ e.preventDefault(); e.stopPropagation(); var $btn = $(this); var id = getId($btn); var isOpen = $btn.attr('aria-expanded') === 'true'; setOpen($btn, !isOpen); openFolderById(id); // if id is null (root), opens OPEN_URL without param }); // Click on leaf: navigate $('#fsTree').on('click.fstree', '.tree-leaf', function(e){ e.preventDefault(); e.stopPropagation(); var id = getId($(this)); openFolderById(id); }); // (Optional) expose a runtime toggle if you ever need it: // window.fsTreeEnableDelete(true/false) window.fsTreeEnableDelete = function(flag){ ENABLE_DELETE = !!flag; renderDeleteButtons(); bindDeleteHandler(); }; })(window.jQuery);