Source: browse.js

"use strict";
// SPDX-License-Identifier: GPL-3.0-or-later
// myMPD (c) 2018-2024 Juergen Mang <mail@jcgames.de>
// https://github.com/jcorporation/mympd

/** @module Browse_js */

/**
 * Initialization function for the browse view
 * @returns {void}
 */
function initBrowse() {
    for (const nav of ['BrowseDatabaseTagListTagDropdown', 'BrowseDatabaseAlbumListTagDropdown',
        'BrowsePlaylistListNavDropdown', 'BrowseFilesystemNavDropdown',
        'BrowseRadioWebradiodbNavDropdown', 'BrowseRadioFavoritesNavDropdown'])
    {
        elGetById(nav).addEventListener('click', function(event) {
            navBrowseHandler(event);
        }, false);
    }
}

/**
 * Event handler for the navigation dropdown in the browse views
 * @param {event} event triggering event
 * @returns {void}
 */
function navBrowseHandler(event) {
    if (event.target.nodeName === 'BUTTON') {
        const tag = getData(event.target, 'tag');
        if (tag === 'Playlist' ||
            tag === 'Filesystem' ||
            tag === 'Radio')
        {
            appGoto('Browse', tag, undefined);
            return;
        }

        if (app.current.card === 'Browse' &&
            app.current.tab !== 'Database')
        {
            appGoto('Browse', 'Database', app.cards.Browse.tabs.Database.active);
            return;
        }
        if (tag === 'Album') {
            elGetById('BrowseDatabaseAlbumListSearchMatch').value = 'contains';
            appGoto('Browse', 'Database', 'AlbumList',
                0, undefined, undefined, undefined, undefined, '');
            return;
        }
        // other tags
        appGoto('Browse', 'Database', 'TagList',
            0, undefined, tag, {'tag': tag, 'desc': false}, tag, '');
    }
}

/**
 * Event handler for links to browse views
 * @param {event} event triggering event
 * @returns {void}
 */
function gotoBrowse(event) {
    let target = event.target;
    let tag = getData(target, 'tag');
    if (tag === 'undefined') {
        // String undefined means do not go further down the dom
        return;
    }
    let name = getData(target, 'name');
    let i = 0;
    while (tag === undefined) {
        i++;
        target = target.parentNode;
        tag = getData(target, 'tag');
        name = getData(target, 'name');
        if (i > 2) {
            break;
        }
    }
    if (tag === '' ||
        name === '')
    {
        return;
    }
    if (settings.albumMode === 'simple' &&
        settings.tagListAlbum.includes(tag) === false)
    {
        // The tag is not available in simple album mode
        gotoSearch(tag, name);
    }
    else if (settings.tagListBrowse.includes(tag)) {
        if (tag === 'Album') {
            let albumId = getData(target, 'AlbumId');
            if (albumId === undefined) {
                albumId = getData(target.parentNode, 'AlbumId');
            }
            if (albumId !== null) {
                // Show album details
                gotoAlbum(albumId);
            }
            else {
                // Show filtered album list
                gotoAlbumList(tag, name);
            }
        }
        else {
            // Show filtered album list
            gotoAlbumList(tag, name);
        }
    }
    else {
        // The tag is not available for albums
        gotoSearch(tag, name);
    }
}

/**
 * Go's to the album detail view
 * @param {string} albumId the album id
 * @returns {void}
 */
//eslint-disable-next-line no-unused-vars
function gotoAlbum(albumId) {
    appGoto('Browse', 'Database', 'AlbumDetail', 0, undefined, albumId);
}

/**
 * Go's to a filtered album list
 * @param {string} tag tag to search
 * @param {Array} value array of values to match
 * @returns {void}
 */
//eslint-disable-next-line no-unused-vars
function gotoAlbumList(tag, value) {
    if (typeof value === 'string') {
        //convert string to array
        value = [value];
    }
    elGetById('BrowseDatabaseAlbumListSearchStr').value = '';
    let expression = '(';
    for (let i = 0, j = value.length; i < j; i++) {
        if (i > 0) {
            expression += ' AND ';
        }
        expression += '(' + tag + ' == \'' + escapeMPD(value[i]) + '\')';
    }
    expression += ')';
    appGoto('Browse', 'Database', 'AlbumList', 0, undefined, 'any', {'tag': settings.webuiSettings.browseDatabaseAlbumListSort, 'desc': false}, 'Album', expression);
}

/**
 * Go's to the filesystem view
 * @param {string} uri uri to list
 * @param {string} type "dir" or "plist"
 * @returns {void}
 */
//eslint-disable-next-line no-unused-vars
function gotoFilesystem(uri, type) {
    elGetById('BrowseFilesystemSearchStr').value = '';
    appGoto('Browse', 'Filesystem', undefined, 0, undefined, uri, {'tag':'', 'desc': false}, type, '');
}

/**
 * Go's to the search view
 * @param {string} tag tag to search
 * @param {string|Array} value value to search
 * @returns {void}
 */
function gotoSearch(tag, value) {
    const filters = [];
    if (typeof(value) === 'string') {
        filters.push(createSearchExpressionComponent(tag, '==', value));
    }
    else if (value !== undefined) {
        for (const v of value) {
            filters.push(createSearchExpressionComponent(tag, '==', v));
        }
    }
    const expression = '(' + filters.join(' AND ') + ')';
    appGoto('Search', undefined, undefined, 0, undefined, tag, {'tag':app.cards.Search.sort.tag, 'desc': false}, tag, expression);
}