• File: admin.js
  • File size: 30.96 KB
  • MIME-type: text/plain
  • Charset: utf-8
/*! VFM - veno file manager main administration functions
 * ================
 *
 * @Author  Nicola Franchini
 * @Support <http://www.veno.es>
 * @Email   <support@veno.it>
 * @version 3.6.0
 * @license Exclusively sold on CodeCanyon
 */
$(document).ready(function () {

    // Init EasyEditor inside appearance
    if (typeof EasyEditor !== 'undefined') {
        new EasyEditor('.easyeditor', {
            // css: ({
            //     minHeight: '300px',
            //     maxHeight: '500px'
            // }),
            onLoaded: function(){
            //     console.log('Easy Editor Loaded!');
            },
            buttons : ['bold', 'italic', 'link', 'h2', 'h3', 'h4', 'alignleft', 'aligncenter', 'alignright', 'quote', 'source', 'x'],
            buttonsHtml: {
                'bold': '<i class="bi bi-type-bold"></i>',
                'italic': '<i class="bi bi-type-italic"></i>',
                'link': '<i class="bi bi-link-45deg"></i>',
                'align-left': '<i class="bi bi-text-left"></i>',
                'align-center': '<i class="bi bi-text-center"></i>',
                'align-right': '<i class="bi bi-text-right"></i>',
                'quote': '<i class="bi bi-quote"></i>',
                'source': '<i class="bi bi-code-slash"></i>',
                'insert-image': '<i class="bi bi-image"></i>',
                'remove-formatting': '<i class="bi bi-slash-square"></i>'
            }
        });
    }
});
//
// Clear /thumbs/ and /share/ folder
//
$(document).ready(function(){
    var regenicon = '<div class="spinner-border spinner-border-sm ms-1" role="status"><span class="visually-hidden">Loading...</span></div>';
    var successicon = '<i class="bi bi-check-lg"></i>';
    var failicon = '<i class="bi bi-x-lg"></i>';

    $('.regen-thumb').on('click', function(){

        var butt = $(this);
        var place_icon = butt.find('.place-icon');

        if (!butt.hasClass('disabled')) {

            butt.addClass('disabled');

            place_icon.html(regenicon);

            $.ajax({
                method: "GET",
                url: "admin-panel/ajax/regen-thumbnails.php",
            })
            .done(function( msg ) {
                if (msg == 'success') {
                     place_icon.html(successicon);
                } else {
                    place_icon.html(failicon);
                    console.log(msg);
                }
                butt.removeClass('disabled');
                butt.removeClass('disabled');
            })
            .fail(function() {
                butt.removeClass('disabled');
                console.log('error clearing /thumbs/ folder');
                place_icon.html('<i class="bi bi-x-lg"></i>');
            });
        }
    });

    $('.regen-share').on('click', function(){
        var butt = $(this);
        var place_icon = butt.find('.place-icon');

        if (!butt.hasClass('disabled')) {

            butt.addClass('disabled');

            place_icon.html(regenicon);

            var selected = document.querySelector(".form-select[name='lifetime']");

            $.ajax({
                method: "POST",
                url: "admin-panel/ajax/clear-share.php",
                data: { 
                    'lifetime' : selected.value
                }
            })
            .done(function( msg ) {
                if (msg == 'success') {
                    place_icon.html(successicon);
                } else {
                    place_icon.html(failicon);
                    console.log(msg);
                }
                butt.removeClass('disabled');
               
            })
            .fail(function() {
                butt.removeClass('disabled');
                console.log('error clearing /share/ folder');
                place_icon.html(failicon);
            });
        }
    });

});

//
// call taginput plugin
//
$('.tagin').each(function(){
    new Tagin($(this)[0],{
        enter: true
    });
});


$('.toggle-sidebar').on('click', function(){
    var dest = $(this).data('bs-target');
    $(dest).toggleClass('open');
});

//
// toggle allow/reject extensions
//
function switchExtensions(){
    $('.togglext').each(function(){
        var collapser = $(this).closest('.toggle-wrap').find('.toggle-collapse');
        if ($(this).is(':checked')) {
            collapser.slideDown();
        } else {
            collapser.slideUp();
        }
    });
}

//
// Show / hide user quota menu when dropdown or new input
//
function showHideQuota(togglequota){
    var getnumber = togglequota.find('.getfolder-count');

    var setnew = togglequota.find('.assignnew');
    var quota = togglequota.find('.userquota');
    if (getnumber.text() > 0 || (setnew.val() && setnew.val().length)) {
        quota.fadeIn();
    } else {
        quota.fadeOut();
    }
}

$('.togglequota').each(function(){
    showHideQuota($(this));
});


$(document).on('input', '.togglequota .assignnew', function() {
    var togglequota = $(this).closest('.togglequota');
    showHideQuota(togglequota);
});

//
// confirm user deletion
//
$(document).on('click', '.remove', function(e) {
    //e.preventDefault();
    var todelete = $(this).closest(".removegroup").find(".deleteme").val();
    var answer = confirm('Are you sure you want to delete: ' + todelete + '?');
    if (answer == true) {
        $(".remove").find(".delme").val(todelete);
    }
    return answer;
});

//
// confirm language deletion
//
$(document).on('click', '.delete', function() {
    var answer = confirm('Are you sure you want entirely to delete this language?');
    return answer;
});

//
// delete logo
//
$(document).on('click', '.deletelogo', function(e) {
    e.preventDefault();
    $(this).addClass('d-none');
    var datasetting = $(this).data('setting');
    $('input[name=remove_'+datasetting+']').val(1);
    $('.'+datasetting+'-preview').attr('src', 'admin-panel/images/placeholder.png');
});

//
// Upload custom logo
//
$(document).on('change', '.btn-file :file', function() {
    var input = $(this),
    numFiles = input.get(0).files ? input.get(0).files.length : 1,
    label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
    input.trigger('fileselect', [numFiles, label]);
});

//
// Switch audio notifications
//
$(document).on('change', '.audio-notif', function(){
    var loadmp3 = $(this).val();
    var audio_ping = new Audio(loadmp3);
    audio_ping.play();
});

//
// Show / Hide New User notification checkbox
//
function checkUserNotif(){

    $("#usernotif_again").val('');

    if ($('.newusermail').length) {
        if ($('.newusermail').val().length > 4){
            $('.usernotif').fadeIn();
        } else {
            $('.usernotif').fadeOut();
        }
    }

    if ($('#r-usermail').length) {
        if ($('#r-usermail').val().length > 4){
            $('.usernotif_again').fadeIn();
        } else {
            $('.usernotif_again').fadeOut();
        }
    }
}

//
// Update adminstration color scheme on the fly
//
function updateThemeColors(selector, hsl){
    var basecolor = Number(hsl.h) + ', ' + (Number(hsl.s)*100)+'%';
    var basecolortext = '#f8f9fa';
    if (Number(hsl.l) >= 0.6) {
        basecolortext = '#212529';
    }
    document.querySelector(":root").style.setProperty('--color-' + selector + '-text', basecolortext);
    document.querySelector(":root").style.setProperty('--base-color-' + selector, basecolor);
    document.querySelector(":root").style.setProperty('--base-l-' + selector, (hsl.l*100)+'%');
}

$(document).ready(function() {
    $(".admin-colorpicker").each(function(){
        var picker = $(this);
        var selector = picker.data('color-selector');
        picker.spectrum({
            type: "text",
            showPalette: true,
            showAlpha: false,
            showButtons: false,
            allowEmpty: false,
            preferredFormat: "hsl",
            move: function(color) {
                updateThemeColors(selector, color.toHsl());
            }
        });
    });
});

//
// switch header logo alignment on the fly
//
$(document).on('change', '.select-logo-alignment input:radio', function() {
    var value = 'text-start';
    switch($(this).val()) {
        case 'left':
            value = 'text-start';
            break;
        case 'center':
            value = 'text-center';
            break;
        case 'right':
            value = 'text-end';
            break;
        default:
            value = 'text-start';
    }
    $('.place-main-header').removeClass('text-start').removeClass('text-center').removeClass('text-end').addClass(value);
});

//
// switch wide / boxed header image
//
$(document).on('change', '.select-banner-width input:radio', function() {
    var value = '';
    switch($(this).val()) {
        case 'wide':
            value = '';
            break;
        case 'boxed':
            value = 'boxed';
            break;
        default:
            value = '';
    }
    $('.wrap-image-header').removeClass('boxed').addClass(value);
});

//
// toggle allow/reject extensions on the fly
//
$(document).on('change', '.togglext', function() {
    switchExtensions();
});

//
// toggle percent % in progress bar on the fly
//
$(document).on('change', "#percent", function() {
    var $input = $(this);
    if ($input.is( ":checked" )) {
        $('.progress-group').addClass('fullp');
    } else {
        $('.progress-group').removeClass('fullp');
    }
}).change();

//
// change individual progress bar color on the fly
//
function updateSingleBar($newclass) {
    $('.progress-single .progress-bar').removeClass().addClass('progress-bar').addClass($newclass);
}

function updateDefaultBar($newclass) {
    $('.first-progress').data('color', $newclass);
    $('.first-progress').next().find('.progress-bar').removeClass().addClass('progress-bar').addClass($newclass);

    if ($('.first-progress').is(':checked')) {
        updateSingleBar($newclass);
    }
}
$(document).on('change', '.pro input:radio', function() {
    var newclass = $(this).data('color');
    updateSingleBar(newclass);
});

$(document).on('click', '.fake-uploader', function() {
    var target = $(this).data('up-target');
    $(target).click();
});

function checkFixedlabel(){
    var scroll = $(window).scrollTop();
    var lab = $('.fixed-label');
    var labw = lab.width();
    if (scroll > 180) {
        $('.fixed-label').addClass('open');
    } else {
        $('.fixed-label').removeClass('open');
    }
}

$(window).scroll(function (event) {
    checkFixedlabel();
});

function updateSlider(selector){
    // selector.each(function(){
        var target = selector.data('vfm-target');
        $(target).val(selector.val());
    // });
}

function updateSliderRuler(selector){
    // selector.each(function(){
        var target = selector.data('vfm-target');
        $(target).val(selector.val()).change();
    // });
}

 /** 
 * ****************************************
 * Veno file manager Admin DocReady calls
 * ****************************************
 */
$(document).ready(function () {

    $('.newusermail').keyup(function() {
        checkUserNotif();
    });

    $('#r-usermail').keyup(function() {
        checkUserNotif();
    });

    $(document).ready(function() {
        checkUserNotif();
    });

    $('.notify_again').on( 'click', function(){
        var form = $(this).closest('form');
        $("#usernotif_again").val('1');
        form.submit();
    });

    $('.easyeditor-wrapper .easyeditor').addClass('header-bg');

    $('#toggle-navbar-brand-view').on("change", function() {
        if($(this)[0].checked){
            $('.nav-brand-group').addClass('d-none');
        } else {
            $('.nav-brand-group').removeClass('d-none');
        }
    });

    $('.show-brand-text').on('click', function(){
        $(this).closest('.nav-brand-group').find('#navbar-brand-text').removeClass('d-none');
    });

    $('#dark_header').on("change", function() {
        if($(this)[0].checked){
            $('.easyeditor-wrapper .easyeditor, .header-bg').css({
                'background-color': 'var(--color-dark-lighter)',
                'color': 'var(--color-dark-text)'
            });
        } else {
            $('.easyeditor-wrapper .easyeditor, .header-bg').css({
                'background-color': 'transparent',
                'color': 'var(--color-light-text)'
            });
        }
    });

    // save settings fixed label
    $('.fixed-label').removeClass('d-none').addClass('animated');

    checkFixedlabel();

    $('.fixed-label').on('click', function(){
        $('#settings-form').submit();
    });

    //
    // toggle allow/reject extensions
    //
    switchExtensions();

    updateSlider($('.set-slider'));

    //
    // slider
    //
    $('.set-slider').on("change", function() {
        updateSlider($(this));
    });

    $('.get-slider').on("input", function() {
        updateSliderRuler($(this));
    });

    // change header padding preview
    var header_padding = $('input[name=header_padding]');

    $('.place-main-header').css({
        'padding-top': header_padding.val()+'px',
        'padding-bottom': header_padding.val()+'px'
    });

    header_padding.on("change", function(slideEvt) {
        $('.place-main-header').css({
            'padding-top': $(this).val()+'px',
            'padding-bottom': $(this).val()+'px'
        });
    });

    // change logo margin preview
    var logo_margin = $('input[name=logo_margin]');

    $('.logo-preview').css({
        'margin-bottom': logo_margin.val()+'px'
    });
    logo_margin.on("change", function(slideEvt) {
        $('.logo-preview').css({
            'margin-bottom': $(this).val()+'px'
        });
    });

    //
    // preview image
    //
    $('.logo-selector').on('change', function(){
        var file = $(this).prop("files")[0];
        var previewclass = $(this).data('target');
        var preview = $(previewclass);
        var reader  = new FileReader();
        reader.onloadend = function () {
            preview.closest('.placeheader').find('.deletelogo').removeClass('d-none');
            preview.closest('.nav-brand-group').find('#navbar-brand-text').addClass('d-none').removeClass('d-flex');
            preview.attr('src', reader.result);
            preview.removeClass('d-none');
        };
        if (file) {
            reader.readAsDataURL(file);
        } else {
            preview.closest('.placeheader').find('.deletelogo').addClass('d-none');
            preview.closest('.nav-brand-group').find('#navbar-brand-text').removeClass('d-none').addClass('d-flex');
            preview.attr('src', 'admin-panel/images/placeholder.png');
        }
    });

    //
    // toggle users panel
    //
    $('.toggle').each(function(){
        if (!$(this).find('input[type=checkbox]').prop('checked')){
            $(this).closest('.toggle').next().slideToggle();
        }
    });
    $('.toggle').find('input[type=checkbox]').change(function(){
        if($(this).closest('.toggle').next().length) {
            $(this).closest('.toggle').next().slideToggle();
        } else {
            $(this).closest('.toggle').parent('.toggle').next().slideToggle();
        }
    });

    $('.toggle-reverse').each(function(){
        if ($(this).find('input[type=checkbox]').prop('checked')){
            $(this).closest('.toggle-reverse').prev().slideToggle();
        }
    });
    $('.toggle-reverse').find('input[type=checkbox]').change(function(){
        $(this).closest('.toggle-reverse').prev().slideToggle();
    });

    $('.toggle-reverse-next').each(function(){
        if ($(this).find('input[type=checkbox]').prop('checked')){
            $(this).closest('.toggle-reverse-next').next().slideToggle();
        }
    });
    $('.toggle-reverse-next').find('input[type=checkbox]').change(function(){
        $(this).closest('.toggle-reverse-next').next().slideToggle();
    });

    //
    // activate tooltips
    //
    $('.tooltipper').tooltip();

    //
    // info (?) popover 
    //
    $('.pop').popover();

    //
    // logo uploader
    //
    $('.pop').popover();
    $('.btn-file :file').on('fileselect', function (event, numFiles, label) {
        var input = $(this).parents('.input-group').find(':text');  
        input.val(label);
    });
});


/**
 * VFMupdater plugin
 */
var VFMupdater = (function(){
    "use strict";

    function updateOutput(message){
        const wrapper = document.querySelector('.update-output');        
        wrapper.innerHTML += message + '<br>';
    }

    function updateOutputError(message){
        const wrapper = document.querySelector('.update-output-error');
        const content = wrapper.querySelector('pre');
        wrapper.classList.remove('d-none');
        content.innerHTML += message + '\n';
    }

    function actionCallback(response = false, callback = false){
        if (response) {
            if (response.error) {
                if (Array.isArray(response.error)) {
                    for(var error of response.error){
                        updateOutputError(error);
                    }
                } else {
                    updateOutputError(response.error);
                }
            }
            if (response.result) {
                updateOutput(response.result);
                if (callback) {
                    setTimeout(function() {
                        callback();
                    }, 1000);
                }
            } else {
                console.log(response);
                action('end');
                updateOutput('Update aborted');
            }
        }
    }

    function action(action = false, callback = false){
        if (action) {
            var formData = new FormData();
            formData.append("action", action);
            var xhr = new XMLHttpRequest();
            xhr.responseType = 'json';
            xhr.open("POST", 'admin-panel/updater/ajax.php', true);
            xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
            xhr.onreadystatechange = function() { // Call a function when the state changes.
                if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
                    if (action == 'getkey') {
                        toggleKey(this.response);
                    } else {
                        actionCallback(this.response, callback);                        
                    }
                }
            };
            xhr.send(formData);
        }
    }

    function downloadPackage(){
        action('download', expandPackage);
    }

    function expandPackage(){
        action('expand', preparePackage);
    }

    function preparePackage(){
        action('prepare', replaceFiles);
    }

    function replaceFiles(){
        action('replace', endProcess);
    }

    function endProcess(){
        window.onbeforeunload = null;
        action('end', reloadPage);
        // action('end');
    }

    function reloadPage(){

        const output_error = document.querySelector('.update-output-error');

        if (output_error.classList.contains('d-none')) {
            var timeleft = 3;
            var downloadTimer = setInterval(function(){
              if(timeleft <= 0){
                clearInterval(downloadTimer);
                window.location.reload(true);
              } else {
                document.querySelector(".countdown").innerHTML = "The page will reload after: " + timeleft + " seconds";
              }
              timeleft -= 1;
            }, 1000);
        }
    }

    function toggleKey(key){
        if (key) {
            var key_input = document.querySelector('#purchase-code');
            key_input.value = key;
        }
    }

    function init(){
        var startupdate = document.querySelector('.start-update');
        if (startupdate) {
            startupdate.addEventListener('click', function(e){
                this.classList.add('d-none');

                window.onbeforeunload = function() {
                    return 'Please do not leave this page during the upgrade.';
                };
                downloadPackage();
            });
        }

        var update_btn = document.querySelector('.update-purchase-code');
        var key_input = document.querySelector('#purchase-code');

        if (key_input && update_btn) {
            key_input.addEventListener('input', function(e){
                update_btn.disabled = false;
            });

            var fake_key = document.querySelector('.fake-key');

            key_input.addEventListener('focus', function(e){
                fake_key.classList.add('d-none');
                key_input.classList.add('d-block');
            });
            key_input.addEventListener('blur', function(e){
                fake_key.classList.remove('d-none');
                key_input.classList.remove('d-block');
            });
            action('getkey');
        }
    }

    return {
        init
    };
}());

VFMupdater.init();

/**
 * VFMuserManager plugin
 */
var VFMuserManager = (function(){
    "use strict";

    const archivemap = document.querySelector('.archive-map');
    /**
     * Folder tree toggler
     */
    function treeToggler(close = false){
        // Toggle single folder
        $('.toggle-tree').on('click', function(){
            $(this).next('ul').slideToggle();
            $(this).find('.tree-toggler').toggleClass("bi-dash-square bi-plus-square");
        });

        // Toggle all folders
        $('.toggle-all-tree').on('click', function(){
            var treetoggler = $(this).find('.tree-toggler');
            treetoggler.toggleClass("bi-dash-square-fill bi-plus-square-fill");

            if (treetoggler.hasClass('bi-dash-square-fill')) {
                $('.toggle-tree').each(function(){
                    $(this).next('ul').show();
                    $(this).find('.tree-toggler').removeClass('bi-plus-square').addClass('bi-dash-square');
                });
            } else {
                $('.toggle-tree').each(function(){
                    $(this).next('ul').hide();
                    $(this).find('.tree-toggler').removeClass('bi-dash-square').addClass('bi-plus-square');
                });
            }
        });

        if (close == true) {
            $('.toggle-all-tree').trigger('click');
        }
    }

    function highLightMainFolder(){
        
        const rootfolders = archivemap.querySelectorAll('li.level-1');

        rootfolders.forEach(function(rootfolder){
            const highlight = rootfolder.querySelector('.highlight');
            if (highlight) {
                highlight.classList.add('d-none');
            }
        });

        const checkeds = archivemap.querySelectorAll('.setuserfolder:checked');

        checkeds.forEach(function(checked){

            const parentli = archivemap.querySelector(checked.dataset.target);
            const thisrootfolder = checked.closest('.level-1');
            const highlight = thisrootfolder.querySelector('.highlight');
            const rootcheck = thisrootfolder.querySelector('.setuserfolder');

            if (thisrootfolder && thisrootfolder !== parentli && !rootcheck.checked) {
                if (highlight) {
                    highlight.classList.remove('d-none');
                }
            }
        });
    }

    function updateCheckValues(opentree){
        let exclude_folders = [];
        let folder_values = [];

        const checkeds = archivemap.querySelectorAll('.setuserfolder:checked');
        checkeds.forEach(function(checked){
            const thisparentlist = checked.closest('li');
            const thischildren = thisparentlist.querySelector('ul');
            if (thischildren) {
                const thischildrenli = thischildren.querySelectorAll('.setuserfolder');
                thischildrenli.forEach(function(child){
                    child.checked = checked.checked;
                    child.disabled = checked.checked;
                    if (child.checked) {
                        exclude_folders.push(child.value);
                    }
                    
                });
            }

            if (!exclude_folders.includes(checked.value) ) {
                folder_values.push(decodeURIComponent(checked.value));
            }

        });
        highLightMainFolder();
        updateFoldertreeBtn(opentree, folder_values);
    }

    function updateCheckFolder(treefolder, opentree){
        const thisparentlist = treefolder.closest('li');
        const thischildren = thisparentlist.querySelector('ul');
        if (thischildren) {
            const thischildrenli = thischildren.querySelectorAll('.setuserfolder');
            thischildrenli.forEach(function(child){
                child.checked = treefolder.checked;
                child.disabled = treefolder.checked;
            });
        }
        updateCheckValues(opentree);
    }

    //
    // Select user folders
    //
    function initFolderTree(opentree){

        const treefolders = archivemap.querySelectorAll('.setuserfolder');

        treefolders.forEach(function(treefolder){
            treefolder.addEventListener('change', function(e){
                updateCheckFolder(treefolder, opentree);
            });
        });
        updateCheckValues(opentree);
        highLightMainFolder();
    }

    function callFiletree(opentree) {

        const wrapresult = archivemap.querySelector('.modal-result');
        const selected = opentree.querySelector('.getfolder');

        archivemap.addEventListener('hidden.bs.modal', event => {
            wrapresult.innerHTML = "";
            wrapresult.classList.remove('loaded', 'fade', 'show');
        });

        if (!wrapresult.classList.contains('loaded')) {
            wrapresult.innerHTML = '<div class="position-relative w-100 h-100 top-0 start-0 d-flex justify-content-center align-items-center" style="min-height: 160px;"><div class="spinner-border"><span class="visually-hidden">Loading...</span></div></div>';
            var request = $.ajax({
                url: "ajax/get-filetree.php",
                method: "POST",
                data: { 
                    // 'action' : action,
                    'currentdir' : '', 
                    '__root' : '',
                    'checkbox' : true,
                    'selected' : selected.value
                }
            });

            request.done(function( msg ) {

                wrapresult.classList.add('d-none', 'fade');

                wrapresult.innerHTML = JSON.parse(msg);
treeToggler(false);
                initFolderTree(opentree);

                wrapresult.classList.remove('d-none');
                wrapresult.classList.add('loaded', 'show');

            });

            request.fail(function( jqXHR, textStatus ) {
                wrapresult.innerHTML = "Request failed: " + textStatus;
            });


        }
    }

    /*
     * Update Folders button and input
     */
    function updateFoldertreeBtn(opentree, values){
        const getfolder = opentree.querySelector(".getfolder");
        const foldercount = opentree.querySelector(".getfolder-count");
        getfolder.value = JSON.stringify(values);
        foldercount.textContent = values.length;
        var togglequota = getfolder.closest('.togglequota');
        showHideQuota($(togglequota));
    }

    /*
     * Setup Folders button and input from settings
     */
    function initFolderTreeBtn() {
        const opentrees = document.querySelectorAll('.foldertree-btn');
        opentrees.forEach(function(opentree){
            const values = opentree.querySelector('.getfolder').value;
            if (values) {
                updateFoldertreeBtn(opentree, JSON.parse(values));
            }
        });

        // Open modal archive map
        let fileTreeModal = new bootstrap.Modal(document.getElementById("archive-map"), {});
        opentrees.forEach(function(opentree){
            const btn = opentree.querySelector('button');
            btn.addEventListener('click', function(){
                callFiletree(opentree);
                fileTreeModal.show();
            });
        });

    }

    function populateUserFields(){
        const modaluser = document.querySelector('#modaluser');

        if (!modaluser) {
            return false;
        }

        const usrblocks = document.querySelectorAll('.usrblock');
        const getuserfields = modaluser.querySelectorAll('.getuser');
        const objectConstructor = ({}).constructor;

        // Reset modal fields
        getuserfields.forEach(function(userfield){
            userfield.value = "";
        });

        usrblocks.forEach(function(usrblock){
            usrblock.addEventListener('click', function(e){
                e.preventDefault();
                let username = '';
                const thisRow = usrblock.closest('.userrow');
                const senduserdata = thisRow.querySelectorAll('.send-userdata');
                senduserdata.forEach(function(userdata){
                    const key = userdata.dataset.key;
                    const getvals = modaluser.querySelectorAll(".getuser-" + key);

                    // popuplate modal-user values
                    getvals.forEach(function(getval){
                        if (key === 'disabled') {
                            if (userdata.value == 1) {
                                getval.checked = true;
                            } else {
                                getval.checked = false;
                            }
                        } else {
                            if (key === 'name') {
                                username = userdata.value;
                            }
                            var json = false;
                            try {  
                                json = JSON.parse(userdata.value);  
                            } catch (e) {  
                                // console.log('invalid json');
                            }
                            if (json.constructor === objectConstructor) {
                                json.forEach(function(value, index){
                                    const thisfield = modaluser.querySelector(".getuser-"+key+ " option[value='" + value + "']")
                                    if (thisfield) {
                                        thisfield.selected = true;
                                    }
                                });
                            } else {
                                if (getval) {
                                    getval.value = userdata.value;
                                }   
                            }
                        }
                    });
                });

                const modaltitle = modaluser.querySelector(".modal-title .modalusername")
                modaltitle.innerText = username;

                const getpass = modaluser.querySelector("#r-userpassnew");
                getpass.value = "";

                // Populate user-modal folders
                let data = [];
                const hiddenfolders = thisRow.querySelectorAll(".s-userfolders");
                hiddenfolders.forEach(function(hiddenfolder){
                    data.push(hiddenfolder.value);
                });

                const btn = modaluser.querySelector('.foldertree-btn');
                updateFoldertreeBtn(btn, data);      

                checkUserNotif();
            });
        });
    }

    function init(){
        initFolderTreeBtn();
        populateUserFields();
    }

    return {
        init
    };
}());

VFMuserManager.init();