view.js

/**
 * @file Manage the view saving & loading.
 * @author Guillaume Brioudes
 * @copyright MIT License ANR HyperOtlet
 */

/**
 * Take 'view' object values & encode them on base64
 * (no ACSII caracters are allowed)
 * @returns {string} - base64 string
 */

function registerView() {
    const activeFiltersNames = getActiveFilterNames();

    const viewObj = {
        recordId: view.openedRecordId,
        filters: ((activeFiltersNames.length === 0) ? undefined : activeFiltersNames)
    }

    if (focus.focusedNodeId) {
        viewObj.focus = {
            fromRecordId: focus.focusedNodeId,
            level: focus.range.value
        };
    }

    let key = JSON.stringify(viewObj);
    key = window.btoa(key);
    key = encodeURIComponent(key);
    return key;
}

/**
 * Copy registerView() output on clipboard
 */

function saveView() {
    const tempInput = document.createElement('input');
    document.body.appendChild(tempInput);
    tempInput.value = registerView();
    tempInput.select();
    document.execCommand('copy');
    document.body.removeChild(tempInput);
}

/**
 * Update 'view' object values from a encoded base64 string
 * @param {HTMLElement} viewBtn - The HTML button, container of the view data
 */

function changeView(viewBtn) {
    if (viewBtn.dataset.active === "true") {
        viewBtn.dataset.active = false;
        setFilters(getFilterNames());
        focus.disable();
        return;
    }

    viewBtn.dataset.active = true;

    let key = viewBtn.dataset.view;
    // base64 string contain an encoded image from the 'view' object
    key = decodeURIComponent(key);
    key = window.atob(key);
    key = JSON.parse(key);

    if (key.filters) {
        setFilters(key.filters); }
    
    if (key.focus) {
        // console.log(key.focus);
        openRecord(key.focus.fromRecordId, false);
        focus.init(key.focus.fromRecordId);
        focus.set(key.focus.level);

        return;
    }

    if (key.recordId) {
        openRecord(key.recordId, false); }
}