jquery-plugin-orTree.js (4057B)
1 2 import $ from "../jquery-global.js"; 3 import Workbench from "../openrat/workbench.js"; 4 import Notice from "../openrat/notice.js"; 5 6 /** 7 * Baum darstellen. 8 * 9 * Die Controls zum Öffnen/Schließen der Teilbäume werden mit Event-Listener bestückt. 10 * Beim Öffnen von Teilbäumen wird der Inhalt vom Server geladen. 11 */ 12 export default function(options) 13 { 14 // Create some defaults, extending them with any options that were provided 15 let settings = $.extend( { 16 'openAction' : function(name,action,id) { 17 } 18 }, options); 19 20 let registerTreeBranchEvents = function (viewEl) 21 { 22 Workbench.getInstance().registerDraggable(viewEl); 23 } 24 25 26 $(this).each(function (idxx, treeEl) 27 { 28 // Klick-Funktion zum Öffnen des Zweiges. 29 $(treeEl).children('.or-navtree-node-control').click( function () 30 { 31 let $node = $(this).parent('.or-navtree-node'); 32 33 if ($node.is('.or-navtree-node--is-open')) { 34 // Pfad ist offen -> schließen 35 $node.children('ul').remove(); 36 37 // Am Knoten die Klasse wechseln. 38 $node.removeClass('navtree-node--is-open').addClass('navtree-node--is-closed').find('.or-navtree-tree-icon').removeClass('image-icon--node-open').addClass('image-icon--node-closed'); 39 } 40 else { 41 // Pfad ist geschlossen -> öffnen. 42 Workbench.getInstance().startSpinner(); 43 let $link = $node.find('a'); 44 //let type = $link.data('extra-type'); 45 let id = $link.data('id'); 46 let extraId = Workbench.htmlDecode($link.data('extra')); 47 48 let loadBranchUrl = './?action=tree&subaction=branch&id=' + id + ''; 49 50 // Extra-Id ergänzen. 51 if (typeof extraId === 'string') 52 extraId = JSON.parse(extraId); 53 54 if (typeof extraId === 'object') { 55 Object.keys(extraId).forEach( (name)=> { 56 loadBranchUrl = loadBranchUrl + '&' + name + '=' + extraId[name]; 57 }); 58 } 59 else { 60 ; 61 } 62 63 console.debug( { url:loadBranchUrl } ); 64 // Die Inhalte des Zweiges laden. 65 fetch( loadBranchUrl,{ 66 method: 'GET', 67 headers: { 68 'Accept': 'text/html', 69 } 70 } ) 71 .then( response => { if (!response.ok) throw "Failed to load tree"; return response } ) 72 .then( response => response.text() ) 73 .then( html => { 74 75 // Den neuen Unter-Zweig erzeugen. 76 let $ul = $.create('ul' ).addClass('navtree-list'); 77 $(treeEl).append($ul); 78 79 $ul.html( html ); 80 $ul.find('li').orTree(settings); // All subnodes are getting event listener for open/close 81 82 /* macht linkify schon 83 $(new_li).find('.act-clickable a').click( function(event) { 84 event.preventDefault(); // Links werden per Javascript geöffnet. Beim Öffnen im neuen Tab hat das aber keine Bedeutung. 85 } );*/ 86 registerTreeBranchEvents($ul); 87 // Die Navigationspunkte sind anklickbar, hier wird der Standardmechanismus benutzt. 88 $ul.find('.or-act-clickable').orLinkify( { 89 'openAction':settings.openAction 90 } ); 91 //$ul.slideDown('fast'); // Einblenden 92 93 }).catch( cause => { 94 // Ups... aber was können wir hier schon tun, außer hässliche Meldungen anzeigen. 95 console.error( {message:'Failed to load subtree',url:loadBranchUrl,cause:cause}); 96 let notice = new Notice(); 97 notice.setStatus( 'error' ); 98 notice.msg = cause; 99 }).finally( () => { 100 // Die Loader-Animation entfernen. 101 Workbench.getInstance().stopSpinner(); 102 }); 103 104 // Am Knoten die Klasse wechseln. 105 $node.addClass('navtree-node--is-open').removeClass('navtree-node--is-closed').find('.or-navtree-tree-icon').addClass('image-icon--node-open').removeClass('image-icon--node-closed'); 106 } 107 }); 108 109 }); 110 };