function renderBrowseItem(node, parent) { console.debug("Calling renderBrowseItem(node = %o, parent = %o)", node, parent); var parentid = parent.attr('data-browse-id'); var newlevel = parent.attr("data-browse-level"); newlevel++; var indent = "
 
"; var refreshel = ""; var refreshel = refreshel.replace("%BROWSE_ID%",node.id); if(node.expandable != "false") { var expand = "
"; expand = expand.replace("%BROWSE_ID%",node.id); } else { expand = ""; } var rowindent = ""; for (i = 0; i < newlevel; i++) { rowindent += indent; } var brwstmplt = jQuery('#BrowseBarTemplate').html(); brwstmplt = brwstmplt.replace("%BROWSE_DROP%", node.drop ? "BrowseBarDroppable" : ""); brwstmplt = brwstmplt.replace("%BROWSE_NAME%",node.name); brwstmplt = brwstmplt.replace("%BROWSE_LEVEL%",newlevel); brwstmplt = brwstmplt.replace("%BROWSE_INDENT%",rowindent); brwstmplt = brwstmplt.replace("%BROWSE_EXPAND%",expand); if(node.link != "") { if(node.modal) { linkfunction = "browsereload=\"" + parentid + "\";return ModalLoad(this,false,true);"; } else { linkfunction = "return CentralSpaceLoad(this,true);"; } link = "
%ICON_HTML%
"; link = link.replace("%BROWSE_CLASS%",node.class); link = link.replace("%BROWSE_LINK%",node.link); link = link.replace("%BROWSE_NAME%",node.name); iconhtml = ""; if(node.icon) { iconhtml = node.icon; } link = link.replace("%ICON_HTML%",iconhtml); brwstmplt = brwstmplt.replace("%BROWSE_TEXT%",link); } else { var text = "
"; text = text.replace("%BROWSE_CLASS%",node.class); text = text.replace("%BROWSE_NAME%",node.name); brwstmplt = brwstmplt.replace("%BROWSE_TEXT%",text); } brwstmplt = brwstmplt.replace("%BROWSE_PARENT%",parentid); brwstmplt = brwstmplt.replace("%BROWSE_ID%",node.id); brwstmplt = brwstmplt.replace("%BROWSE_REFRESH%",refreshel); parent.after(brwstmplt); } function toggleBrowseElements(browse_id, reload, useraction) { console.debug("toggleBrowseElements(browse_id = %o, reload = %o, useraction = %o)", browse_id, reload, useraction); if (typeof reload === 'undefined') {reload = false;} if (typeof useraction === 'undefined') {useraction = false;} if (browse_clicked && useraction) { return false; } if(useraction) { browse_clicked=true; } if(typeof b_loading === 'undefined') { b_loading = new Array(); } var loadindex = b_loading.indexOf(browse_id); if (loadindex > -1) { // Already in progress return true; } if(typeof browse_toload === 'undefined') { browse_toload = new Array(); } if(typeof browse_reloaded === 'undefined' || useraction) { // Used to ensure we don't get into an endless loop of loading parents and looking for non-existent child elements browse_reloaded = new Array(); } var curel = jQuery(".BrowseBarItem[data-browse-id='" + browse_id + "']"); if(!curel.length) { // Node not present, load parent first var item_elements = browse_id.split('-'); item_elements.pop(); if (item_elements.length < 1) { // This is the root node and is not present, give up browse_clicked = false; curel.stop(true, false); return false; } var parentitem = item_elements.join('-'); // Add this id so that it is loaded after the parent has completed if(typeof browsepostload[parentitem] === "undefined") { browsepostload[parentitem] = new Array(); } browsepostload[parentitem].push(browse_id); toggleBrowseElements(parentitem, true); browse_clicked = false; return true; } var loaded =curel.attr("data-browse-loaded"); var openclose = curel.find("a.browse_expand"); var refreshicon = curel.find("a.BrowseRefresh i"); if(typeof browseopen === 'undefined') { browseopen = new Array(); } var curstatus = curel.attr("data-browse-status"); if(curstatus == "open" && !reload) { // Hide the children and close, close all child items also jQuery(".BrowseBarItem[data-browse-parent|='" + browse_id + "']").find("a.browse_expand").removeClass("browse_expanded").addClass("browse_closed"); jQuery(".BrowseBarItem[data-browse-parent|='" + browse_id + "']").removeClass("BrowseOpen").attr("data-browse-status","closed").slideUp("fast",function() { browse_clicked = false; }); openclose.removeClass("browse_expanded"); openclose.addClass("browse_closed"); curel.attr("data-browse-status","closed"); curel.removeClass("BrowseOpen"); remaining = browseopen.filter(function(value, index, arr) { return value.substring(0, browse_id.length) != browse_id; }); browseopen = remaining; SetCookie('browseopen',encodeURIComponent(browseopen)); return true; } if(loaded == 1 && !reload) { // Show the child items jQuery("[data-browse-parent='" + browse_id + "']").slideDown("fast",function() { browse_clicked = false; }); openclose.removeClass("browse_closed"); openclose.addClass("browse_expanded"); curel.attr("data-browse-status","open"); curel.addClass("BrowseOpen"); browseopen.push(browse_id); return true; } refreshicon.addClass("fa-spin"); b_loading.push(browse_id); console.debug("b_loading = %o", b_loading); if(typeof browsepostload === "undefined") { browsepostload = new Array(); } if(typeof browsepostload[browse_id] === "undefined") { browsepostload[browse_id] = new Array(); } // Remove any current child items before load/reload jQuery("[data-browse-parent|='" + browse_id + "']").remove(); url = baseurl_short+"pages/ajax/browsebar_load.php"; var post_data = { id: browse_id, }; jQuery.ajax({ type:"GET", url: url, data: post_data, dataType: "json" }).done(function(response, status, xhr) { // Load completed // Parse response items //console.log(response); // Reverse so each can be appended in turn and still appear in correct order response.items.reverse(); response.items.forEach(function (item) { renderBrowseItem(item, curel); }); // Show all immediate children jQuery("[data-browse-parent='" + browse_id + "']").slideDown(); curel.attr("data-browse-status","open"); curel.attr("data-browse-loaded","1"); if (browseopen.indexOf(browse_id)==-1) { browseopen.push(browse_id); SetCookie('browseopen',encodeURIComponent(browseopen)); } openclose.removeClass("browse_closed"); openclose.addClass("browse_expanded"); curel.addClass("BrowseOpen"); refreshicon.removeClass("fa-spin"); var loadindex = b_loading.indexOf(browse_id); if (loadindex > -1) { b_loading.splice(loadindex, 1); } var toloadindex = browse_toload.indexOf(browse_id); if (toloadindex > -1) { browse_toload.splice(toloadindex, 1); } if(typeof browsepostload[parentitem] === "undefined") { browsepostload[parentitem] = new Array(); } browsepostload[browse_id].forEach(function (childitem) { if(!browse_reloaded.includes(childitem)) { console.debug("Finished loading %o, loading child item %o", browse_id, childitem); toggleBrowseElements(childitem, true); browse_reloaded.push(childitem); } }); if(browse_toload.length == 0) { console.debug("Finished browse_bar reload, initialising drop"); BrowseBarInit(); browse_clicked = false; } else { console.debug("Still to load: %o", browse_toload); } }) .fail(function(xhr, status, error) { if (xhr.status=="403") { window.location = baseurl_short + "login.php"; } else { var loadindex = b_loading.indexOf(browse_id); if (loadindex > -1) { b_loading.splice(loadindex, 1); } browse_clicked = false; styledalert(' ' + xhr.status, ' : ' + error); refreshicon.removeClass("fa-spin"); } }); browse_reloaded.push(browse_id); return true; } function ReloadBrowseBar() { console.debug("ReloadBrowseBar()"); var allopen = jQuery.cookie("browseopen") ? decodeURIComponent(jQuery.cookie("browseopen")).split(/,/) : new Array(); console.debug("allopen = %o", allopen); browse_toload = allopen; console.debug("browse_toload = %o", browse_toload); allopen.forEach(function (item) { toggleBrowseElements(item, true); }); } function BrowseBarInit() { if(!jQuery('#BrowseBar')) { jQuery('#CentralSpaceContainer').removeClass('BrowseMode'); jQuery('#Footer').removeClass('BrowseMode'); } jQuery(".BrowseBarDroppable").droppable({ accept: ".ResourcePanel, .CollectionPanelShell", drop: function(event, ui) { // Get the dragged resource id dropped = jQuery(ui.draggable); var resource_id = dropped.attr("id"); resource_id = resource_id.replace("ResourceShell", ""); // Get the drop target browsetarget = jQuery(this).attr("data-browse-id"); item_elements = browsetarget.split('-'); droptype = item_elements[0]; switch(droptype) { case 'R': tgt_rt = item_elements[1].replace('RT:',''); if(dropped.hasClass('ResourceType' + tgt_rt)) { nodeid = item_elements[item_elements.length - 1].replace('N:',''); var post_data = { action: 'add_node', node: nodeid, resource: resource_id, }; BrowseAction(post_data,jQuery(this).find("a.browse_droplink")); } else { styledalert('',''); browse_err = document.createElement( "div" ), jQuery(browse_err).html(''); jQuery(browsetarget).append(browse_err); jQuery(browse_err).fadeOut('slow'); } break; case 'FC': case 'C': cid = item_elements[item_elements.length - 1].replace('C:',''); AddResourceToCollection(event, ui, resource_id, '', cid); jQuery(this).find(".BrowseBarLink a").fadeTo(100, 0.3, function() { jQuery(this).fadeTo(500, 1.0); }); break; default: } }, tolerance: "pointer" }); if(typeof browsereload !== "undefined") { setTimeout(function() {jQuery("[data-browse-id='" + browsereload + "']")[0].scrollIntoView({ behavior: "smooth",block: "start"});browsereload = undefined;}, 200); } } function BrowseAction(post_data,browselink) { url = baseurl_short+"pages/ajax/browse_action.php"; jQuery.ajax({ type:'POST', url: url, data: post_data, dataType: "json", async:true }) .done(function(response, status, xhr) { // Load completed browselink.fadeTo(300, 0.3, function() {jQuery(this).fadeTo(1000, 1.0); }); }) .fail(function(xhr) { //console.log(response); if(typeof xhr.responseJSON.message !== "undefined") { styledalert('',xhr.responseJSON.message); } else { styledalert('', xhr.status + ' ' + xhr.statusText + ' ' + xhr.responseText); } }); }