summaryrefslogtreecommitdiff
path: root/src/tree.js
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
committercashmere <cashmere@autistici.org>2026-09-04 09:05:24 +0200
commit4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch)
treec296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /src/tree.js
downloadrelic-4f49b16079b27d7ce633619e4cddfdf2bffbc952.tar.gz
initial commitHEADmaster
Diffstat (limited to 'src/tree.js')
-rw-r--r--src/tree.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/tree.js b/src/tree.js
new file mode 100644
index 0000000..db4aa24
--- /dev/null
+++ b/src/tree.js
@@ -0,0 +1,72 @@
+/* Javascript to implement the file hierarchy tree.
+*/
+(function(){
+function isExpanded(ul){
+ return ul.className=='';
+}
+
+function toggleDir(ul, useInitValue){
+ if( !useInitValue ){
+ expandMap[ul.id] = !isExpanded(ul);
+ history.replaceState(expandMap, '');
+ }
+ ul.className = expandMap[ul.id] ? '' : 'collapsed';
+}
+
+function toggleAll(tree, useInitValue){
+ var lists = tree.querySelectorAll('.subdir > ul > li ul');
+ if( !useInitValue ){
+ var expand = true; /* Default action: make all sublists visible */
+ for( var i=0; lists[i]; i++ ){
+ if( isExpanded(lists[i]) ){
+ expand = false; /* Any already visible - make them all hidden */
+ break;
+ }
+ }
+ expandMap = {'*': expand};
+ history.replaceState(expandMap, '');
+ }
+ var className = expandMap['*'] ? '' : 'collapsed';
+ for( var i=0; lists[i]; i++ ){
+ lists[i].className = className;
+ }
+}
+
+function checkState(){
+ expandMap = history.state || {};
+ if( '*' in expandMap ) toggleAll(outer_ul, true);
+ for( var id in expandMap ){
+ if( id!=='*' ) toggleDir(document.getElementById(id), true);
+ }
+}
+
+function belowSubdir(node){
+ do{
+ node = node.parentNode;
+ if( node==subdir ) return true;
+ } while( node && node!=outer_ul );
+ return false;
+}
+
+var history = window.history || {};
+if( !history.replaceState ) history.replaceState = function(){};
+var outer_ul = document.querySelector('.filetree > ul');
+var subdir = outer_ul.querySelector('.subdir');
+var expandMap = {};
+checkState();
+outer_ul.onclick = function(e){
+ e = e || window.event;
+ var a = e.target || e.srcElement;
+ if( a.nodeName!='A' ) return true;
+ if( a.parentNode.parentNode==subdir ){
+ toggleAll(outer_ul);
+ return false;
+ }
+ if( !belowSubdir(a) ) return true;
+ var ul = a.parentNode.nextSibling;
+ while( ul && ul.nodeName!='UL' ) ul = ul.nextSibling;
+ if( !ul ) return true; /* This is a file link, not a directory */
+ toggleDir(ul);
+ return false;
+}
+}())