Your IP : 216.73.216.219


Current Path : /home/pteabiscqq/www/media/com_akeeba/js/
Upload File :
Current File : /home/pteabiscqq/www/media/com_akeeba/js/DatabaseFilters.js

/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Object initialisation
if (typeof akeeba == "undefined")
{
    var akeeba = {};
}

if (typeof akeeba.Dbfilters == "undefined")
{
    akeeba.Dbfilters = {
        currentRoot: null,
    }
}

akeeba.Dbfilters.activeRootChanged = function ()
{
    var elRoot = document.getElementById("active_root");
    var data   = {
        root: elRoot.options[elRoot.selectedIndex].value
    };
    akeeba.Dbfilters.load(data);
};

akeeba.Dbfilters.activeTabRootChanged = function ()
{
    var elRoot = document.getElementById("active_root");
    akeeba.Dbfilters.loadTab(elRoot.options[elRoot.selectedIndex].value);
};

/**
 * Loads the contents of a database
 *
 * @param data
 */
akeeba.Dbfilters.load = function (data)
{
    // Add the verb to the data
    data.verb = "list";

    // Assemble the data array and send the AJAX request
    var new_data = {
        action: JSON.stringify(data)
    };

    akeeba.System.doAjax(new_data, function (response)
    {
        akeeba.Dbfilters.render(response);
    }, null, false, 15000);
};

/**
 * Toggles a database filter
 * @param data
 * @param caller
 */
akeeba.Dbfilters.toggle = function (data, caller, callback)
{
    akeeba.Fsfilters.toggle(data, caller, callback);
};

/**
 * Renders the Database Filters page
 * @param data
 * @return
 */
akeeba.Dbfilters.render = function (data)
{
    akeeba.Dbfilters.currentRoot = data.root;

    // ----- Render the tables
    var aktables       = document.getElementById("tables");
    aktables.innerHTML = "";

    for (var table in data.tables)
    {
        if (!data.tables.hasOwnProperty(table))
        {
            continue;
        }

        dbef = data.tables[table];

        var uielement       = document.createElement("div");
        uielement.className = "table-container";

        var available_filters = ["tables", "tabledata"];

        for (var counter = 0; counter < available_filters.length; counter++)
        {
            var filter = available_filters[counter];

            var ui_icon       = document.createElement("span");
            ui_icon.className = "table-icon-container akeeba-btn--grey akeeba-btn--mini";
            ui_icon.setAttribute("title", akeeba.System.Text._("COM_AKEEBA_DBFILTER_TYPE_" + filter.toUpperCase()));

            switch (filter)
            {
                case "tables":
                    ui_icon.insertAdjacentHTML(
                        "beforeend",
                        "<span class=\"ak-toggle-button akion-close-circled\"></span>"
                    );
                    break;

                case "tabledata":
                    ui_icon.insertAdjacentHTML("beforeend", "<span class=\"ak-toggle-button akion-ios-box\"></span>");
                    break;
            }

            switch (dbef[filter])
            {
                case 2:
                    akeeba.System.removeClass(ui_icon, "akeeba-btn--grey");
                    akeeba.System.addClass(ui_icon, "akeeba-btn--red");
                    break;

                case 1:
                    akeeba.System.removeClass(ui_icon, "akeeba-btn--grey");
                    akeeba.System.addClass(ui_icon, "akeeba-btn--orange");
                // Don't break; we have to add the handler!

                case 0:
                    akeeba.System.addEventListener(ui_icon, "click", function (ui_icon, table, filter)
                    {
                        return function ()
                        {
                            var new_data = {
                                root:   data.root,
                                node:   table,
                                filter: filter,
                                verb:   "toggle"
                            };
                            akeeba.Dbfilters.toggle(new_data, ui_icon);
                        };
                    }(ui_icon, table, filter))
            }

            uielement.appendChild(ui_icon);

            /**
             * DO NOT move this before we add the akion-* span. This would make the icon the last child of the button
             * anchor tag which results in a smaller amount of margin to the right of the icon, making the buttons
             * look squished. Putting this JS call after we have rendered the icon causes the tooltip markup to be added
             * after the icon, therefore the CSS renders an equal margin to the left and right of the icon. As a result
             * the button looks nice and wide.
             */
            //akeeba.Tooltip.simpleTooltip(ui_icon);
        }


        // Add the table label
        var iconclass = "akion-link";
        var icontip   = "COM_AKEEBA_DBFILTER_TABLE_MISC";

        switch (dbef.type)
        {
            case "table":
                iconclass = "akion-ios-grid-view";
                icontip   = "COM_AKEEBA_DBFILTER_TABLE_TABLE";
                break;
            case "view":
                iconclass = "akion-android-list";
                icontip   = "COM_AKEEBA_DBFILTER_TABLE_VIEW";
                break;
            case "procedure":
                iconclass = "akion-cube";
                icontip   = "COM_AKEEBA_DBFILTER_TABLE_PROCEDURE";
                break;
            case "function":
                iconclass = "akion-ion-code";
                icontip   = "COM_AKEEBA_DBFILTER_TABLE_FUNCTION";
                break;
            case "trigger":
                iconclass = "akion-flash";
                icontip   = "COM_AKEEBA_DBFILTER_TABLE_TRIGGER";
                break;
        }

        var uiTableNameContainer = document.createElement("span");
        var uiTableSizeContainer = document.createElement("span");
        var uiTableType          = document.createElement("span");
        var uiSeparator          = document.createElement("span");

        uiTableNameContainer.className   = "table-name";
        uiTableNameContainer.textContent = table;

        uiTableSizeContainer.className = "table-rowcount";

        if (dbef.rows)
        {
            uiTableSizeContainer.textContent = dbef.rows;
            uiTableSizeContainer.setAttribute("title", akeeba.System.Text._("COM_AKEEBA_DBFILTER_TABLE_META_ROWCOUNT"));
            // uiTableSizeContainer.setAttribute("data-akeeba-tooltip-position", "left");
            // akeeba.Tooltip.simpleTooltip(uiTableSizeContainer);
        }

        uiTableType.className = "table-icon-container table-icon-noclick table-icon-small";
        uiTableType.setAttribute("title", akeeba.System.Text._(icontip));
        // uiTableType.setAttribute("data-akeeba-tooltip-position", "bottom");
        //akeeba.Tooltip.simpleTooltip(uiTableType);

        var uiTableTypeIcon       = document.createElement("span");
        uiTableTypeIcon.className = iconclass;
        uiTableType.appendChild(uiTableTypeIcon);

        uiSeparator.className       = "table-icon-container table-icon-noclick table-icon-small";
        var uiSeparatorIcon         = document.createElement("span");
        uiSeparatorIcon.className   = "akion-android-more-vertical";
        uiSeparatorIcon.style.color = "#cccccc";
        uiSeparator.appendChild(uiSeparatorIcon);

        uielement.appendChild(uiSeparator);
        uielement.appendChild(uiTableType);
        uielement.appendChild(uiTableNameContainer);
        uielement.appendChild(uiTableSizeContainer);

        // Render
        aktables.appendChild(uielement);
    }

};

/**
 * Loads the tabular view of the Database Filter for a given root
 * @param root
 * @return
 */
akeeba.Dbfilters.loadTab = function (root)
{
    var data = {
        verb: "tab",
        root: root
    };

    // Assemble the data array and send the AJAX request
    var new_data = {
        action: JSON.stringify(data)
    };

    akeeba.System.doAjax(new_data, function (response)
    {
        akeeba.Dbfilters.renderTab(response);
    }, null, false, 15000);
};

/**
 * Add a row in the tabular view of the Filesystems Filter
 * @param def
 * @param append_to_here
 * @return
 */
akeeba.Dbfilters.addRow = function (def, append_to_here)
{
    // Turn def.type into something human readable
    var type_text = akeeba.System.Text._("COM_AKEEBA_DBFILTER_TYPE_" + def.type.toUpperCase());

    if (type_text == null)
    {
        type_text = def.type;
    }

    var elRow        = document.createElement("tr");
    var elFilterType = document.createElement("td");
    var elFilterItem = document.createElement("td");

    elRow.className = "ak_filter_row";

    // Filter title
    elFilterType.className   = "ak_filter_type";
    elFilterType.textContent = type_text;

    // Filter item
    elFilterItem.className = "ak_filter_item";

    // delete button, edit button, filter name
    var elDeleteContainer = document.createElement("span");
    var elEditContainer   = document.createElement("span");
    var elFilterName      = document.createElement("span");

    elDeleteContainer.className = "ak_filter_tab_icon_container akeeba-btn--mini akeeba-btn--red";
    akeeba.System.addEventListener(elDeleteContainer, "click", function ()
    {
        if (def.node == "")
        {
            // An empty filter is normally not saved to the database; it's a new record row which has to be removed...
            var elRemove = this.parentNode.parentNode;
            elRemove.parentNode.removeChild(elRemove);

            return;
        }

        var elRoot   = document.getElementById("active_root");
        var new_data = {
            root:   elRoot.options[elRoot.selectedIndex].value,
            node:   def.node,
            filter: def.type,
            verb:   "remove"
        };

        akeeba.Dbfilters.toggle(new_data, this, function (response, caller)
        {
            if (response.success)
            {
                var elRemove = caller.parentNode.parentNode;
                elRemove.parentNode.removeChild(elRemove);
            }
        });
    });

    var elDeleteIcon       = document.createElement("span");
    elDeleteIcon.className = "ak-toggle-button icon-trash deletebutton";
    elDeleteContainer.appendChild(elDeleteIcon);

    elEditContainer.className = "ak_filter_tab_icon_container akeeba-btn--mini akeeba-btn--teal";
    akeeba.System.addEventListener(elEditContainer, "click", function ()
    {
        // If I'm editing there's an input box appended to the parent element of this edit button
        var inputBox = this.parentNode.querySelector("input");

        // So, if I'm already editing quit; we mustn't show multiple edit boxes!
        if (inputBox != null)
        {
            return;
        }

        // Hide the text label
        this.parentNode.querySelector("span.ak_filter_name").style.display = "none";

        var elInput = document.createElement("input");
        elInput.setAttribute("type", "text");
        elInput.setAttribute("size", 60);
        elInput.value = this.parentNode.querySelector("span.ak_filter_name").textContent;
        this.parentNode.appendChild(elInput);

        akeeba.System.addEventListener(elInput, "blur", function ()
        {
            var new_value = this.value;
            var that      = this;

            if (new_value == "")
            {
                // Well, if the user meant to remove the filter, let's help him!
                akeeba.System.triggerEvent(that.parentNode.querySelector("span.deletebutton"), "click");

                return;
            }

            // First, remove the old filter
            var elRoot   = document.getElementById("active_root");
            var new_data = {
                root:     elRoot.options[elRoot.selectedIndex].value,
                old_node: def.node,
                new_node: new_value,
                filter:   def.type,
                verb:     "swap"
            };

            var elEditContainer = that.parentNode.querySelector("span.editcontainer");

            akeeba.Dbfilters.toggle(
                new_data,
                elEditContainer,
                function (response, caller)
                {
                    // Remove the editor
                    var elFilterName           = that.parentNode.querySelector("span.ak_filter_name");
                    elFilterName.style.display = "inline-block";
                    elFilterName.textContent   = new_value;

                    that.parentNode.removeChild(that);
                    def.node = new_value;
                }
            );
        });

        elInput.focus();
    });

    elEditIcon           = document.createElement("span");
    elEditIcon.className = "ak-toggle-button akion-edit editbutton";
    elEditContainer.appendChild(elEditIcon);

    elFilterName.className   = "ak_filter_name";
    elFilterName.textContent = def.node;

    elFilterItem.appendChild(elDeleteContainer);
    elFilterItem.appendChild(elEditContainer);
    elFilterItem.appendChild(elFilterName);

    elRow.appendChild(elFilterType);
    elRow.appendChild(elFilterItem);

    append_to_here.appendChild(elRow);
};

akeeba.Dbfilters.addNew = function (filtertype)
{
    // Add a row below ourselves
    var new_def = {
        type: filtertype,
        node: ""
    };
    akeeba.Dbfilters.addRow(new_def, document.getElementById("ak_list_table").children[1]);

    var trList = document.getElementById("ak_list_table").children[1].children;
    var lastTr = trList[trList.length - 1];
    akeeba.System.triggerEvent(lastTr.querySelector("span.editbutton"), "click");
};

/**
 * Renders the tabular view of the Database Filter
 * @param data
 * @return
 */
akeeba.Dbfilters.renderTab = function (data)
{
    var tbody       = document.getElementById("ak_list_contents");
    tbody.innerHTML = "";

    for (var counter = 0; counter < data.length; counter++)
    {
        var def = data[counter];

        akeeba.Dbfilters.addRow(def, tbody);
    }
};

/**
 * Activates the exclusion filters for non-CMS tables
 */
akeeba.Dbfilters.excludeNonCMS = function ()
{
    var tables = document.getElementById("tables").children;

    for (counter = 0; counter < tables.length; counter++)
    {
        var element = tables[counter];

        // Get the table name
        var tablename = element.querySelector("span.table-name").textContent;
        var prefix    = tablename.substr(0, 3);

        // If the prefix is not #__ it's a core table and I have to exclude it
        if (prefix != "#__")
        {
            var iconContainer = element.querySelector("span.table-icon-container");
            var icon          = iconContainer.querySelector("span.ak-toggle-button");

            if (iconContainer.className.indexOf("akeeba-btn--orange") == -1)
            {
                akeeba.System.triggerEvent(icon, "click");
            }
        }
    }
};

/**
 * Wipes out the database filters
 * @return
 */
akeeba.Dbfilters.nuke = function ()
{
    var data     = {
        root: akeeba.Dbfilters.currentRoot,
        verb: "reset"
    };
    var new_data = {
        action: JSON.stringify(data)
    };
    akeeba.System.doAjax(new_data, function (response)
    {
        akeeba.Dbfilters.render(response);
    }, null, false, 15000);
};

akeeba.Loader.add(['akeeba.System', 'akeeba.Ajax'], function ()
{
    var guiData                  = akeeba.System.getOptions("akeeba.DatabaseFilters.guiData", null);
    var viewType                 = akeeba.System.getOptions("akeeba.DatabaseFilters.viewType", null);

    // Take into account the different view types
    if (viewType === "list")
    {
        // List view
        akeeba.System.addEventListener("active_root", "change", akeeba.Dbfilters.activeRootChanged);
        akeeba.Dbfilters.render(guiData);
    }
    else
    {
        // Tabular view
        akeeba.System.addEventListener("active_root", "change", akeeba.Dbfilters.activeTabRootChanged);
        akeeba.Dbfilters.renderTab(guiData);
    }

    akeeba.System.addEventListener("comAkeebaDatabaseFiltersExcludeNonCMS", "click", function ()
    {
        akeeba.Dbfilters.excludeNonCMS();

        return false;
    });

    akeeba.System.addEventListener("comAkeebaDatabaseFiltersNuke", "click", function ()
    {
        akeeba.Dbfilters.nuke();

        return false;
    });

    akeeba.System.addEventListener("comAkeebaDatabaseFiltersAddNewTables", "click", function ()
    {
        akeeba.Dbfilters.addNew("tables");

        return false;
    });

    akeeba.System.addEventListener("comAkeebaDatabaseFiltersAddNewTableData", "click", function ()
    {
        akeeba.Dbfilters.addNew("tabledata");

        return false;
    });
});