feat(cloudron): add tirreno package artifacts
- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
This commit is contained in:
		@@ -0,0 +1,466 @@
 | 
			
		||||
import {Loader} from '../Loader.js?v=2';
 | 
			
		||||
import {Tooltip} from '../Tooltip.js?v=2';
 | 
			
		||||
import {fireEvent} from '../utils/Event.js?v=2';
 | 
			
		||||
import {getQueryParams} from '../utils/DataSource.js?v=2';
 | 
			
		||||
import {handleAjaxError} from '../utils/ErrorHandler.js?v=2';
 | 
			
		||||
import {TotalTile} from '../TotalTile.js?v=2';
 | 
			
		||||
import {renderTotalFrame} from '../DataRenderers.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    MIDLINE_HELLIP,
 | 
			
		||||
} from '../utils/Constants.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class BaseGrid {
 | 
			
		||||
    constructor(gridParams) {
 | 
			
		||||
        this.config = gridParams;
 | 
			
		||||
 | 
			
		||||
        this.loader    = new Loader();
 | 
			
		||||
        this.tooltip   = new Tooltip();
 | 
			
		||||
        this.totalTile = new TotalTile();
 | 
			
		||||
 | 
			
		||||
        this.firstload = true;
 | 
			
		||||
 | 
			
		||||
        this.renderTotalsLoader = this.renderTotalsLoader.bind(this);
 | 
			
		||||
 | 
			
		||||
        this.initLoad();
 | 
			
		||||
 | 
			
		||||
        if (this.config.dateRangeGrid && !this.config.sequential) {
 | 
			
		||||
            const onDateFilterChanged = this.onDateFilterChanged.bind(this);
 | 
			
		||||
            window.addEventListener('dateFilterChanged', onDateFilterChanged, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (gridParams.choicesFilterEvents) {
 | 
			
		||||
            const onChoicesFilterChanged = this.onChoicesFilterChanged.bind(this);
 | 
			
		||||
            for (let i = 0; i < gridParams.choicesFilterEvents.length; i++) {
 | 
			
		||||
                window.addEventListener(gridParams.choicesFilterEvents[i], onChoicesFilterChanged, false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!this.config.sequential) {
 | 
			
		||||
            const onSearchFilterChanged = this.onSearchFilterChanged.bind(this);
 | 
			
		||||
            window.addEventListener('searchFilterChanged', onSearchFilterChanged, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initLoad() {
 | 
			
		||||
        const me      = this;
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
 | 
			
		||||
        $(document).ready(() => {
 | 
			
		||||
            $.extend($.fn.dataTable.ext.classes, {
 | 
			
		||||
                sStripeEven: '', sStripeOdd: ''
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            $.fn.dataTable.ext.pager.numbers_length = 9;
 | 
			
		||||
 | 
			
		||||
            $.fn.dataTable.ext.errMode = function() {};
 | 
			
		||||
            $(`#${tableId}`).on('error.dt', me.onError);
 | 
			
		||||
 | 
			
		||||
            const onBeforeLoad = me.onBeforeLoad.bind(me);
 | 
			
		||||
            $(`#${tableId}`).on('preXhr.dt', onBeforeLoad);
 | 
			
		||||
 | 
			
		||||
            const onBeforePageChange = me.onBeforePageChange.bind(me);
 | 
			
		||||
            $(`#${tableId}`).on('page.dt', onBeforePageChange);
 | 
			
		||||
 | 
			
		||||
            const config = me.getDataTableConfig();
 | 
			
		||||
            $(`#${tableId}`).DataTable(config);
 | 
			
		||||
 | 
			
		||||
            const onTableRowClick = me.onTableRowClick.bind(me);
 | 
			
		||||
            $(`#${tableId} tbody`).on('click', 'tr', onTableRowClick);
 | 
			
		||||
 | 
			
		||||
            const onDraw = me.onDraw.bind(me);
 | 
			
		||||
            $(`#${tableId}`).on('draw.dt', onDraw);
 | 
			
		||||
 | 
			
		||||
            $(`#${tableId}`).closest('.dt-container').find('nav').empty();
 | 
			
		||||
 | 
			
		||||
            document.getElementById(tableId).classList.add('hide-body');
 | 
			
		||||
 | 
			
		||||
            if (!me.config.sequential) {
 | 
			
		||||
                me.loadData();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getDataTableConfig() {
 | 
			
		||||
        const me         = this;
 | 
			
		||||
        const url        = this.config.url;
 | 
			
		||||
        const columns    = this.columns;
 | 
			
		||||
        const columnDefs = this.columnDefs;
 | 
			
		||||
        const isSortable = this.getConfigParam('isSortable');
 | 
			
		||||
        const order      = this.orderConfig;
 | 
			
		||||
 | 
			
		||||
        const config = {
 | 
			
		||||
            ajax: function(data, callback, settings) {
 | 
			
		||||
                $.ajax({
 | 
			
		||||
                    url: url,
 | 
			
		||||
                    method: 'GET',
 | 
			
		||||
                    data: data,
 | 
			
		||||
                    dataType: 'json',
 | 
			
		||||
                    success: function(response, textStatus, jqXHR) {
 | 
			
		||||
                        callback(response);
 | 
			
		||||
                        me.performAdditional(response, me.config);
 | 
			
		||||
                        me.stopAnimation();
 | 
			
		||||
                    },
 | 
			
		||||
                    error: handleAjaxError,
 | 
			
		||||
                });
 | 
			
		||||
            },
 | 
			
		||||
            processing: true,
 | 
			
		||||
            serverSide: true,
 | 
			
		||||
            deferRender: true,
 | 
			
		||||
            deferLoading: 0,
 | 
			
		||||
            pageLength: 25,
 | 
			
		||||
            autoWidth: false,
 | 
			
		||||
            lengthChange: false,
 | 
			
		||||
            searching: true,
 | 
			
		||||
            ordering: isSortable,
 | 
			
		||||
            info: false,
 | 
			
		||||
            pagingType: 'simple_numbers',
 | 
			
		||||
            language: {
 | 
			
		||||
                paginate: {
 | 
			
		||||
                    previous: '<',
 | 
			
		||||
                    next: '>',
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            layout: {
 | 
			
		||||
                topEnd: null,
 | 
			
		||||
                bottomEnd: {
 | 
			
		||||
                    paging: {
 | 
			
		||||
                        boundaryNumbers: false,
 | 
			
		||||
                        type: 'simple_numbers',
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            createdRow: function(row, data, dataIndex) {
 | 
			
		||||
                $(row).attr('data-item-id', data.id);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            drawCallback: function(settings) {
 | 
			
		||||
                me.drawCallback(settings);
 | 
			
		||||
                me.updateTableFooter(this);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            columnDefs: columnDefs,
 | 
			
		||||
            columns: columns,
 | 
			
		||||
            order: order
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    performAdditional(response, config) {
 | 
			
		||||
        if (!config.calculateTotals) {
 | 
			
		||||
            fireEvent('dateFilterChangedCompleted');
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const ids = response.data.map(item => item.id);
 | 
			
		||||
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
        const dateRange = response.dateRange;
 | 
			
		||||
 | 
			
		||||
        if (dateRange && ids.length) {
 | 
			
		||||
            const requestData = {
 | 
			
		||||
                token: token,
 | 
			
		||||
                ids: ids,
 | 
			
		||||
                type: config.totals.type,
 | 
			
		||||
                startDate: dateRange.startDate,
 | 
			
		||||
                endDate: dateRange.endDate,
 | 
			
		||||
            };
 | 
			
		||||
            let preparedBase = {};
 | 
			
		||||
            response.data.forEach(rec => {
 | 
			
		||||
                preparedBase[rec.id] = rec;
 | 
			
		||||
            });
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                type: 'GET',
 | 
			
		||||
                url: '/admin/timeFrameTotal',
 | 
			
		||||
                data: requestData,
 | 
			
		||||
                success: (data) => this.onTotalsSuccess(data, config, preparedBase),
 | 
			
		||||
                error: handleAjaxError,
 | 
			
		||||
                complete: function() {
 | 
			
		||||
                    fireEvent('dateFilterChangedCompleted');
 | 
			
		||||
                },
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            fireEvent('dateFilterChangedCompleted');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!dateRange && ids.length) {
 | 
			
		||||
            // actualy making fake response from server
 | 
			
		||||
            let data = {totals: {}};
 | 
			
		||||
            let preparedBase = {};
 | 
			
		||||
            const cols = config.totals.columns;
 | 
			
		||||
            response.data.forEach(item => {
 | 
			
		||||
                data.totals[item.id] = {};
 | 
			
		||||
                preparedBase[item.id] = {};
 | 
			
		||||
                cols.forEach(col => {
 | 
			
		||||
                    data.totals[item.id][col] = item[col];
 | 
			
		||||
                    preparedBase[item.id][col] = item[col];
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            });
 | 
			
		||||
            this.onTotalsSuccess(data, config, preparedBase);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTotalsSuccess(data, config, base) {
 | 
			
		||||
        const table = $(`#${config.tableId}`).DataTable();
 | 
			
		||||
        const columns = config.totals.columns;
 | 
			
		||||
 | 
			
		||||
        let idxs = {};
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < columns.length; i++) {
 | 
			
		||||
            idxs[columns[i]] = -1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        table.settings().init().columns.forEach((col, index) => {
 | 
			
		||||
            columns.forEach(colName => {
 | 
			
		||||
                if (col.data === colName || col.name === colName) {
 | 
			
		||||
                    idxs[colName] = index;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (Object.values(idxs).includes(-1)) return;
 | 
			
		||||
 | 
			
		||||
        let rowData;
 | 
			
		||||
        let id;
 | 
			
		||||
 | 
			
		||||
        table.rows().every(function() {
 | 
			
		||||
            rowData = this.data();
 | 
			
		||||
            id = String(rowData.id);
 | 
			
		||||
            if (id in data.totals) {
 | 
			
		||||
                for (const col in idxs) {
 | 
			
		||||
                    $(table.cell(this, idxs[col]).node()).html(renderTotalFrame(base[id][col], data.totals[id][col]));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    drawCallback(settings) {
 | 
			
		||||
        const me    = this;
 | 
			
		||||
 | 
			
		||||
        this.initTooltips();
 | 
			
		||||
 | 
			
		||||
        //this.stopAnimation();
 | 
			
		||||
 | 
			
		||||
        const params = {
 | 
			
		||||
            tableId: me.config.tableId
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if (settings && settings.iDraw > 1) {
 | 
			
		||||
            const total = settings.json.recordsTotal;
 | 
			
		||||
            const tileId  = this.config.tileId;
 | 
			
		||||
            const tableId = this.config.tableId;
 | 
			
		||||
 | 
			
		||||
            this.totalTile.update(tableId, tileId, total);
 | 
			
		||||
            this.updateTableTitle(total);
 | 
			
		||||
 | 
			
		||||
            fireEvent('tableLoaded', params);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateTableTitle(value) {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        const wrapper = document.getElementById(tableId).closest('.card');
 | 
			
		||||
 | 
			
		||||
        if (wrapper) {
 | 
			
		||||
            const span = wrapper.querySelector('header span');
 | 
			
		||||
 | 
			
		||||
            span.textContent = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    stopAnimation() {
 | 
			
		||||
        this.loader.stop();
 | 
			
		||||
        const el = document.getElementById(`${this.config.tableId}_loader`);
 | 
			
		||||
        if (el) el.remove();
 | 
			
		||||
 | 
			
		||||
        const table = document.getElementById(this.config.tableId);
 | 
			
		||||
        table.classList.remove('dim-table');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateTableFooter(dataTable) {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        const pagerSelector = `#${tableId}_wrapper .dt-paging`;
 | 
			
		||||
 | 
			
		||||
        const api = dataTable.api();
 | 
			
		||||
        if (api.ajax && typeof api.ajax.json === 'function' && api.ajax.json() === undefined) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $(`#${tableId}`).closest('.dt-container').find('nav').show();
 | 
			
		||||
        if (api.page.info().pages <= 1) {
 | 
			
		||||
            $(pagerSelector).hide();
 | 
			
		||||
        } else {
 | 
			
		||||
            $(pagerSelector).show();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initTooltips() {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        Tooltip.addTooltipsToGridRecords(tableId);
 | 
			
		||||
        Tooltip.addTooltipToSpans();
 | 
			
		||||
        Tooltip.addTooltipToParagraphs();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onBeforeLoad(e, settings, data) {
 | 
			
		||||
        if (!this.config.sequential) {
 | 
			
		||||
            this.startLoader();
 | 
			
		||||
        }
 | 
			
		||||
        this.updateTableTitle(MIDLINE_HELLIP);
 | 
			
		||||
 | 
			
		||||
        fireEvent('dateFilterChangedCaught');
 | 
			
		||||
 | 
			
		||||
        //TODO: move to events grid? Or not?
 | 
			
		||||
        const params = this.config.getParams();
 | 
			
		||||
        const queryParams = getQueryParams(params);
 | 
			
		||||
 | 
			
		||||
        for (let key in queryParams) {
 | 
			
		||||
            data[key] = queryParams[key];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
        data.token = token;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onDraw(e, settings) {
 | 
			
		||||
        if (this.firstload) {
 | 
			
		||||
            document.getElementById(this.config.tableId).classList.remove('hide-body');
 | 
			
		||||
            this.firstload = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onBeforePageChange(e, settings) {
 | 
			
		||||
        const tableId   = this.config.tableId;
 | 
			
		||||
        const pagesPath = `#${tableId}_paginate a`;
 | 
			
		||||
 | 
			
		||||
        [...document.querySelectorAll(pagesPath)].forEach(a => {
 | 
			
		||||
            a.outerHTML =
 | 
			
		||||
            a.outerHTML
 | 
			
		||||
                .replace(/<a/g, '<span')
 | 
			
		||||
                .replace(/<\/a>/g, '</span>');
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTableRowClick(event) {
 | 
			
		||||
        const selection = window.getSelection();
 | 
			
		||||
        if ('Range' === selection.type) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const row  = event.target.closest('tr');
 | 
			
		||||
        const link = row.querySelector('a');
 | 
			
		||||
 | 
			
		||||
        if (link) {
 | 
			
		||||
            event.preventDefault();
 | 
			
		||||
            if (event.ctrlKey || event.metaKey) {
 | 
			
		||||
                window.open(link.href, '_blank');
 | 
			
		||||
            } else {
 | 
			
		||||
                window.location.href = link.href;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //TODO: leave blank and move to the events table
 | 
			
		||||
    addTableRowsEvents() {
 | 
			
		||||
        const tableId    = this.config.tableId;
 | 
			
		||||
        const onRowClick = this.onRowClick.bind(this);
 | 
			
		||||
 | 
			
		||||
        if ($(this.table).DataTable().data().any()) {
 | 
			
		||||
            const rows = document.querySelectorAll(`#${tableId} tbody tr`);
 | 
			
		||||
            rows.forEach(row => row.addEventListener('click', onRowClick, false));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startLoader() {
 | 
			
		||||
        const tableId    = this.config.tableId;
 | 
			
		||||
        const loaderPath = `${tableId}_processing`;
 | 
			
		||||
 | 
			
		||||
        const loaderWrapper = document.getElementById(loaderPath);
 | 
			
		||||
        const el = document.createElement('p');
 | 
			
		||||
        el.className = 'text-loader';
 | 
			
		||||
        loaderWrapper.replaceChildren(el);
 | 
			
		||||
 | 
			
		||||
        this.loader.start(el);
 | 
			
		||||
 | 
			
		||||
        loaderWrapper.style.display = null;
 | 
			
		||||
 | 
			
		||||
        const table = document.getElementById(this.config.tableId);
 | 
			
		||||
        table.classList.add('dim-table');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onRowClick(e) {
 | 
			
		||||
        const selection = window.getSelection();
 | 
			
		||||
        if ('Range' === selection.type) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const row    = e.target.closest('tr');
 | 
			
		||||
        const itemId = row.dataset.itemId;
 | 
			
		||||
        const data   = {itemId: itemId};
 | 
			
		||||
 | 
			
		||||
        fireEvent('tableRowClicked', data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onError(e, settings, techNote, message) {
 | 
			
		||||
        if (settings.jqXHR !== undefined && 403 === settings.jqXHR.status) {
 | 
			
		||||
            window.location.href = escape('/');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //console.warn('An error has been reported by DataTables: ', message);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    loadData() {
 | 
			
		||||
        //TODO: create getter for table el: $(me.table).DataTable().ajax.reload()
 | 
			
		||||
        const me = this;
 | 
			
		||||
        $(me.table).DataTable().ajax.reload();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onDateFilterChanged() {
 | 
			
		||||
        this.loadData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onSearchFilterChanged() {
 | 
			
		||||
        this.loadData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onChoicesFilterChanged() {
 | 
			
		||||
        this.loadData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getConfigParam(key) {
 | 
			
		||||
        const cfg   = this.config;
 | 
			
		||||
        const value = ('undefined' !== typeof cfg[key]) ? cfg[key] : true;
 | 
			
		||||
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return this.getConfigParam('isSortable') ? [[1, 'desc']] : [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get table() {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        const tableEl = document.getElementById(tableId);
 | 
			
		||||
 | 
			
		||||
        return tableEl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    renderTotalsLoader(data, type, record, meta) {
 | 
			
		||||
        const span = document.createElement('span');
 | 
			
		||||
 | 
			
		||||
        const col_name = meta.settings.aoColumns[meta.col].name;
 | 
			
		||||
        if (this.config.calculateTotals && this.config.totals.columns.includes(col_name)) {
 | 
			
		||||
            span.className = 'loading-table-total';
 | 
			
		||||
            span.textContent = MIDLINE_HELLIP;
 | 
			
		||||
        } else {
 | 
			
		||||
            span.textContent = data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return span;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,115 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {fireEvent} from '../utils/Event.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class BaseGridWithPanel extends BaseGrid {
 | 
			
		||||
 | 
			
		||||
    constructor(gridParams) {
 | 
			
		||||
        super(gridParams);
 | 
			
		||||
 | 
			
		||||
        this.config = gridParams;
 | 
			
		||||
        this.markerClass = 'marker';
 | 
			
		||||
 | 
			
		||||
        this.allPanels = {
 | 
			
		||||
            'event': {
 | 
			
		||||
                id:             'event-card',
 | 
			
		||||
                closedEvent:    'eventPanelClosed',
 | 
			
		||||
                close:          'closeEventPanel',
 | 
			
		||||
                rowClicked:     'eventTableRowClicked',
 | 
			
		||||
            },
 | 
			
		||||
            'logbook': {
 | 
			
		||||
                id:             'logbook-card',
 | 
			
		||||
                closedEvent:    'logbookPanelClosed',
 | 
			
		||||
                close:          'closeLogbookPanel',
 | 
			
		||||
                rowClicked:     'logbookTableRowClicked',
 | 
			
		||||
            },
 | 
			
		||||
            'email': {
 | 
			
		||||
                id:             'email-card',
 | 
			
		||||
                closedEvent:    'emailPanelClosed',
 | 
			
		||||
                close:          'closeEmailPanel',
 | 
			
		||||
                rowClicked:     'emailTableRowClicked',
 | 
			
		||||
            },
 | 
			
		||||
            'device': {
 | 
			
		||||
                id:             'device-card',
 | 
			
		||||
                closedEvent:    'devicePanelClosed',
 | 
			
		||||
                close:          'closeDevicePanel',
 | 
			
		||||
                rowClicked:     'deviceTableRowClicked',
 | 
			
		||||
            },
 | 
			
		||||
            'phone': {
 | 
			
		||||
                id:             'phone-card',
 | 
			
		||||
                closedEvent:    'phonePanelClosed',
 | 
			
		||||
                close:          'closePhonePanel',
 | 
			
		||||
                rowClicked:     'phoneTableRowClicked',
 | 
			
		||||
            },
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.panelType = gridParams.panelType;
 | 
			
		||||
 | 
			
		||||
        this.currentPanel = this.allPanels[this.panelType];
 | 
			
		||||
 | 
			
		||||
        const onDetailsPanelClosed = this.onDetailsPanelClosed.bind(this);
 | 
			
		||||
        window.addEventListener(this.currentPanel.closedEvent, onDetailsPanelClosed, false);
 | 
			
		||||
 | 
			
		||||
        const onTableRowClicked = this.onTableRowClicked.bind(this);
 | 
			
		||||
        window.addEventListener(this.currentPanel.rowClicked, onTableRowClicked, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    drawCallback(settings) {
 | 
			
		||||
        super.drawCallback(settings);
 | 
			
		||||
 | 
			
		||||
        this.addTableRowsEvents();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onDetailsPanelClosed() {
 | 
			
		||||
        const markerClass = this.markerClass;
 | 
			
		||||
        const tableId     = this.config.tableId;
 | 
			
		||||
 | 
			
		||||
        $(`#${tableId} tbody tr`).removeClass(markerClass);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onRowClick(e) {
 | 
			
		||||
        const selection = window.getSelection();
 | 
			
		||||
        if ('Range' === selection.type) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const row    = e.target.closest('tr');
 | 
			
		||||
        const itemId = row.dataset.itemId;
 | 
			
		||||
        const data   = {itemId: itemId};
 | 
			
		||||
 | 
			
		||||
        fireEvent(this.currentPanel.rowClicked, data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTableRowClicked(e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const itemId      = e.detail.itemId;
 | 
			
		||||
        const targetRow   = this.table.querySelector(`tr[data-item-id="${itemId}"]`);
 | 
			
		||||
 | 
			
		||||
        const markerClass   = this.markerClass;
 | 
			
		||||
        const isRowMarkered = targetRow.classList.contains(markerClass);
 | 
			
		||||
 | 
			
		||||
        if (isRowMarkered) {
 | 
			
		||||
            fireEvent(this.currentPanel.close);
 | 
			
		||||
            targetRow.classList.remove(markerClass);
 | 
			
		||||
        } else {
 | 
			
		||||
            // close other panels
 | 
			
		||||
            for (const panel in this.allPanels) {
 | 
			
		||||
                if (panel !== this.panelType) {
 | 
			
		||||
                    const card = document.querySelector(`.details-card#${this.allPanels[panel].id}`);
 | 
			
		||||
                    if (card && !card.classList.contains('is-hidden')) {
 | 
			
		||||
                        fireEvent(this.allPanels[panel].closedEvent);
 | 
			
		||||
                        card.classList.add('is-hidden');
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // unmark other rows in the same table
 | 
			
		||||
            const rows = this.table.querySelectorAll('tr[data-item-id]');
 | 
			
		||||
            rows.forEach(row => row.classList.remove(markerClass));
 | 
			
		||||
 | 
			
		||||
            // mark current row
 | 
			
		||||
            targetRow.classList.add(markerClass);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,79 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderTime,
 | 
			
		||||
    renderBlacklistButtons,
 | 
			
		||||
    renderBlacklistItem,
 | 
			
		||||
    renderBlacklistType,
 | 
			
		||||
    renderClickableImportantUserWithScore,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class BlacklistGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[1, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'blacklist-user-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'blacklist-timestamp-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'blacklist-type-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'blacklist-value-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'blacklist-button-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'score',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableImportantUserWithScore(record, 'medium');
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'created',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderTime(data);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'type',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderBlacklistType(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'value',
 | 
			
		||||
                render: (data, _ype, record) => {
 | 
			
		||||
                    return renderBlacklistItem(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'entity_id',
 | 
			
		||||
                orderable: false,
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderBlacklistButtons(record);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableBotId,
 | 
			
		||||
    renderDevice,
 | 
			
		||||
    renderOs,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class BotsGrid extends BaseGrid {
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'bot-id-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'bot-type-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'bot-os-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'bot-modified-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableBotId(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'device',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDevice(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'os_name',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderOs(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'modified',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,100 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {fireEvent} from '../utils/Event.js?v=2';
 | 
			
		||||
import {renderClickableCountry} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class CountriesGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[0, 'asc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    drawCallback(settings) {
 | 
			
		||||
        super.drawCallback(settings);
 | 
			
		||||
 | 
			
		||||
        if (settings && settings.iDraw > 1) {
 | 
			
		||||
            const data = settings.json.data;
 | 
			
		||||
            fireEvent('countriesGridLoaded', {data: data});
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'country-country-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'country-iso-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'country-cnt-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'country-cnt-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'country-cnt-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 5
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'full_country',
 | 
			
		||||
                name: 'full_country',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableCountry(record, false);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'country_iso',
 | 
			
		||||
                name: 'country_iso'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_account',
 | 
			
		||||
                name: 'total_account',
 | 
			
		||||
                render: this.renderTotalsLoader,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_visit',
 | 
			
		||||
                name: 'total_visit',
 | 
			
		||||
                render: this.renderTotalsLoader,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_ip',
 | 
			
		||||
                name: 'total_ip',
 | 
			
		||||
                render: this.renderTotalsLoader,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateTableFooter(dataTable) {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        const pagerSelector = `#${tableId}_wrapper .dt-paging`;
 | 
			
		||||
 | 
			
		||||
        const api = dataTable.api();
 | 
			
		||||
        if (api.ajax && typeof api.ajax.json === 'function' && api.ajax.json() === undefined) {
 | 
			
		||||
            $(`${pagerSelector} nav`).empty();
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $(pagerSelector).hide();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
import {BaseGridWithPanel} from './BaseWithPanel.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderDevice,
 | 
			
		||||
    renderOs,
 | 
			
		||||
    renderBrowser,
 | 
			
		||||
    renderLanguage,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class DevicesGrid extends BaseGridWithPanel {
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-date-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-type-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-os-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-browser-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-language-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'device-modified-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'created',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDate(data);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'device',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDevice(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'os_name',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderOs(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'browser_name',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderBrowser(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'lang',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderLanguage(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'modified',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,131 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableDomain,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderDefaultIfEmptyElement,
 | 
			
		||||
    renderUserCounter,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class DomainsGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[6, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-domain-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-date-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'domain-cnt-col',
 | 
			
		||||
                targets: 7
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 8
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'domain',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableDomain(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'free_email_provider',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    const free_email_provider = record.free_email_provider;
 | 
			
		||||
                    return renderBoolean(free_email_provider);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'tranco_rank',
 | 
			
		||||
                name: 'tranco_rank',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    let rank = renderDefaultIfEmptyElement(data);
 | 
			
		||||
                    if (data) {
 | 
			
		||||
                        rank = data;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return rank;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'disabled',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    const unavailable = record.disabled;
 | 
			
		||||
                    return renderBoolean(unavailable);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'disposable_domains',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    const disposable = record.disposable_domains;
 | 
			
		||||
                    return renderBoolean(disposable);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'creation_date',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    const creation_date = record.creation_date;
 | 
			
		||||
 | 
			
		||||
                    if (creation_date) {
 | 
			
		||||
                        return renderDate(creation_date);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        return renderDefaultIfEmptyElement(creation_date);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_account',
 | 
			
		||||
                name: 'total_account',
 | 
			
		||||
                render: this.renderTotalsLoader,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'fraud',
 | 
			
		||||
                name: 'fraud',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserCounter(data, 1);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,118 @@
 | 
			
		||||
import {BaseGridWithPanel} from './BaseWithPanel.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderReputation,
 | 
			
		||||
    renderEmail,
 | 
			
		||||
    renderDefaultIfEmptyElement,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class EmailsGrid extends BaseGridWithPanel {
 | 
			
		||||
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-email-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-reputation-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-free-provider-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-no-breach-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-total-breaches-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-disposable-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-spam-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'email-blacklist-col',
 | 
			
		||||
                targets: 7
 | 
			
		||||
            },
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    className: 'medium-yes-no-col',
 | 
			
		||||
            //    targets: 8
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'email',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderEmail(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'reputation',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderReputation(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'free_email_provider',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            //{
 | 
			
		||||
            //    data: 'profiles',
 | 
			
		||||
            //    orderable: false,
 | 
			
		||||
            //    render: (data, type, record) => {
 | 
			
		||||
            //        // revert profiles to `no profiles`
 | 
			
		||||
            //        return renderBoolean(data === null ? null : !data);
 | 
			
		||||
            //    }
 | 
			
		||||
            //},
 | 
			
		||||
            {
 | 
			
		||||
                data: 'data_breach',
 | 
			
		||||
                orderable: false,
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    // revert data breach to `no breach`
 | 
			
		||||
                    return renderBoolean(data === null ? null : !data);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'data_breaches',
 | 
			
		||||
                render: renderDefaultIfEmptyElement
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'disposable_domains',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'blockemails',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'fraud_detected',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    data: 'alert_list',
 | 
			
		||||
            //    render: renderBoolean
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,130 @@
 | 
			
		||||
import {BaseGridWithPanel} from './BaseWithPanel.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderResourceWithQueryAndEventType,
 | 
			
		||||
    renderDeviceWithOs,
 | 
			
		||||
    renderIpType,
 | 
			
		||||
    renderIpWithCountry,
 | 
			
		||||
    renderUserForEvent,
 | 
			
		||||
    renderTimestampForEvent,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class EventsGrid extends BaseGridWithPanel {
 | 
			
		||||
    // 7, 8 - invisible time and id columns to prevent sorting buttons appearence
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return this.config.sessionGroup && !this.config.singleUser
 | 
			
		||||
            ? [[6, 'desc'], [7, 'desc'], [8, 'desc']]
 | 
			
		||||
            : [[7, 'desc'], [8, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-user-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-timestamp-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-event-type-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-ip-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-ip-type-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'event-device-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 7
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 8
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const userIdRender = (record) => {
 | 
			
		||||
            return renderUserForEvent(record, 'medium', this.config.sessionGroup, this.config.singleUser);
 | 
			
		||||
        };
 | 
			
		||||
        const timestampRender = (record) => {
 | 
			
		||||
            return renderTimestampForEvent(record, this.config.sessionGroup, this.config.singleUser);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'userid',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return userIdRender(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'time',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return timestampRender(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'type',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderResourceWithQueryAndEventType(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'ip',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderIpWithCountry(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'ip_type',
 | 
			
		||||
                name: 'ip_type',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderIpType(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'device',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDeviceWithOs(record);
 | 
			
		||||
                },
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'session_id',
 | 
			
		||||
                name: 'session_id',
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'time',
 | 
			
		||||
                name: 'time',
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,136 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderIpType,
 | 
			
		||||
    renderUserCounter,
 | 
			
		||||
    renderNetName,
 | 
			
		||||
    renderFullCountry,
 | 
			
		||||
    renderAsn,
 | 
			
		||||
    renderClickableIpWithCountry,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export class IpsGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[this.config.orderByLastseen ? 7 : 6, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-ip-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-country-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-asn-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-newtwork-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-ip-type-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-cnt-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'ip-cnt-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 7
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 8
 | 
			
		||||
            }
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    className: 'yes-no-col',
 | 
			
		||||
            //    targets: 9
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'ip',
 | 
			
		||||
                name: 'ip',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    const rec = {
 | 
			
		||||
                        ip: record.ip,
 | 
			
		||||
                        ipid: record.id,
 | 
			
		||||
                        country_iso: record.country_iso,
 | 
			
		||||
                        full_country: record.full_country,
 | 
			
		||||
                        isp_name: record.netname,
 | 
			
		||||
                    };
 | 
			
		||||
                    return renderClickableIpWithCountry(rec);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'full_country',
 | 
			
		||||
                render: renderFullCountry,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'asn',
 | 
			
		||||
                name: 'asn',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderAsn(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'netname',
 | 
			
		||||
                name: 'netname',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderNetName(record, 'short');
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'ip_type',
 | 
			
		||||
                name: 'ip_type',
 | 
			
		||||
                orderable: false,
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderIpType(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_visit',
 | 
			
		||||
                name: 'total_visit',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_account',
 | 
			
		||||
                name: 'total_account',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserCounter(data, 2);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'lastseen',
 | 
			
		||||
                name: 'lastseen',
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    data: 'alert_list',
 | 
			
		||||
            //    render: renderBoolean
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,96 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableAsn,
 | 
			
		||||
    renderNetName,
 | 
			
		||||
    renderUserCounter,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class IspsGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[3, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-asn-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-network-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-cnt-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-cnt-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-cnt-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'isp-cnt-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 6
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'asn',
 | 
			
		||||
                name: 'asn',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    record['ispid'] = record.id;
 | 
			
		||||
                    return renderClickableAsn(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'name',
 | 
			
		||||
                name: 'name',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    record.netname = data;
 | 
			
		||||
                    return renderNetName(record, 'long');
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_visit',
 | 
			
		||||
                name: 'total_visit',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_ip',
 | 
			
		||||
                name: 'total_ip',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_account',
 | 
			
		||||
                name: 'total_account',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'fraud',
 | 
			
		||||
                name: 'fraud',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserCounter(data, 1);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,66 @@
 | 
			
		||||
import {BaseGridWithPanel} from './BaseWithPanel.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderIp,
 | 
			
		||||
    renderTimeMs,
 | 
			
		||||
    renderErrorType,
 | 
			
		||||
    renderSensorErrorColumn,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class LogbookGrid extends BaseGridWithPanel {
 | 
			
		||||
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[2, 'desc'], [1, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'logbook-ip-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'logbook-timestamp-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'logbook-status-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'logbook-message-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'ip',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderIp(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'started',
 | 
			
		||||
                render: renderTimeMs,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'error_type',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderErrorType(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'error_text',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderSensorErrorColumn(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,107 @@
 | 
			
		||||
import {BaseGridWithPanel} from './BaseWithPanel.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableBotId,
 | 
			
		||||
    renderDevice,
 | 
			
		||||
    renderOs,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderPhone,
 | 
			
		||||
    renderFullCountry,
 | 
			
		||||
    renderPhoneCarrierName,
 | 
			
		||||
    renderPhoneType,
 | 
			
		||||
    renderUserCounter,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class PhonesGrid extends BaseGridWithPanel {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-phonenumber-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-invalid-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-country-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-carrier-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-type-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-users-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'phone-blacklist-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    className: 'yes-no-col',
 | 
			
		||||
            //    targets: 6
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'phonenumber',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderPhone(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'invalid',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'full_country',
 | 
			
		||||
                render: renderFullCountry
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'carrier_name',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderPhoneCarrierName(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'type',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderPhoneType(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'shared',
 | 
			
		||||
                name: 'shared',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserCounter(data, 2);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'fraud_detected',
 | 
			
		||||
                render: renderBoolean
 | 
			
		||||
            },
 | 
			
		||||
            //  TODO: return alert_list back in next release
 | 
			
		||||
            //{
 | 
			
		||||
            //    data: 'alert_list',
 | 
			
		||||
            //    render: renderBoolean
 | 
			
		||||
            //}
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,99 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableResourceWithoutQuery,
 | 
			
		||||
    renderHttpCode,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class ResourcesGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[7, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-url-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'resource-cnt-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 7
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'title',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableResourceWithoutQuery(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'http_code',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderHttpCode(record);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_account',
 | 
			
		||||
                name: 'total_account',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_country',
 | 
			
		||||
                name: 'total_country',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_ip',
 | 
			
		||||
                name: 'total_ip',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'total_visit',
 | 
			
		||||
                name: 'total_visit',
 | 
			
		||||
                render: this.renderTotalsLoader
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'suspicious',
 | 
			
		||||
                render: renderBoolean,
 | 
			
		||||
                orderable: false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,90 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderTime,
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderUserFirstname,
 | 
			
		||||
    renderUserLastname,
 | 
			
		||||
    renderUserActionButtons,
 | 
			
		||||
    renderClickableImportantUserWithScore,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class ReviewQueueGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[1, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTableRowClick(event) {}
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-user-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-timestamp-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-name-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-name-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-date-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'review-queue-button-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'score',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableImportantUserWithScore(record, 'medium');
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'added_to_review',
 | 
			
		||||
                render: renderTime
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'firstname',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserFirstname(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'lastname',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserLastname(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'created',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDate(data);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                orderable: false,
 | 
			
		||||
                data: 'actions',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserActionButtons(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {fireEvent} from '../utils/Event.js?v=2';
 | 
			
		||||
import {handleAjaxError} from '../utils/ErrorHandler.js?v=2';
 | 
			
		||||
import {renderDefaultIfEmptyElement}  from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class TopTenGrid extends BaseGrid {
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'top-ten-aggregating-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'item',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return this.config.renderItemColumn(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'value',
 | 
			
		||||
                render: renderDefaultIfEmptyElement,
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getDataTableConfig() {
 | 
			
		||||
        const me         = this;
 | 
			
		||||
        const columns    = this.columns;
 | 
			
		||||
        const columnDefs = this.columnDefs;
 | 
			
		||||
 | 
			
		||||
        const mode  = this.config.mode;
 | 
			
		||||
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
 | 
			
		||||
        const config = {
 | 
			
		||||
            ajax: function(data, callback, settings) {
 | 
			
		||||
                $.ajax({
 | 
			
		||||
                    url: `/admin/loadTopTen?mode=${mode}&token=${token}`,
 | 
			
		||||
                    method: 'GET',
 | 
			
		||||
                    data: data,
 | 
			
		||||
                    dataType: 'json',
 | 
			
		||||
                    success: function(response, textStatus, jqXHR) {
 | 
			
		||||
                        callback(response);
 | 
			
		||||
                        me.stopAnimation();
 | 
			
		||||
                    },
 | 
			
		||||
                    error: handleAjaxError,
 | 
			
		||||
                    complete: function() {
 | 
			
		||||
                        fireEvent('dateFilterChangedCompleted');
 | 
			
		||||
                    },
 | 
			
		||||
                });
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            processing: true,
 | 
			
		||||
            serverSide: true,
 | 
			
		||||
            searching: false,
 | 
			
		||||
            deferLoading: 0,
 | 
			
		||||
            pageLength: 10,
 | 
			
		||||
            paging: false,
 | 
			
		||||
            info: false,
 | 
			
		||||
            lengthChange: false,
 | 
			
		||||
            ordering: false,
 | 
			
		||||
            autoWidth: false,
 | 
			
		||||
            info: false,
 | 
			
		||||
 | 
			
		||||
            createdRow: function(row, data, dataIndex) {
 | 
			
		||||
                $(row).attr('data-item-id', data.id);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            drawCallback: function(settings) {
 | 
			
		||||
                me.drawCallback(settings);
 | 
			
		||||
                me.updateTableFooter(this);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            columnDefs: columnDefs,
 | 
			
		||||
            columns: columns
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,83 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    currentPlanRender,
 | 
			
		||||
    currentStatusRender,
 | 
			
		||||
    currentUsageRender,
 | 
			
		||||
    currentBillingEndRender,
 | 
			
		||||
    updateCardButtonRender,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export class UsageStatsGrid extends BaseGrid {
 | 
			
		||||
 | 
			
		||||
    // do not update counter tile
 | 
			
		||||
    updateTableTitle(value) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // do not use pagination
 | 
			
		||||
    updateTableFooter(dataTable) {
 | 
			
		||||
        const tableId = this.config.tableId;
 | 
			
		||||
        const pagerSelector = `#${tableId}_wrapper .dt-paging`;
 | 
			
		||||
 | 
			
		||||
        $(pagerSelector).hide();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'subscription-plan-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'subscription-status-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'subscription-usage-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'billing-date-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'action-button-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'sub_plan_api_calls',
 | 
			
		||||
                render: currentPlanRender,
 | 
			
		||||
                orderable: false,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'sub_status',
 | 
			
		||||
                render: currentStatusRender,
 | 
			
		||||
                orderable: false,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'sub_calls_used',
 | 
			
		||||
                render: currentUsageRender,
 | 
			
		||||
                orderable: false,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'sub_next_billed',
 | 
			
		||||
                render: currentBillingEndRender,
 | 
			
		||||
                orderable: false,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'sub_update_url',
 | 
			
		||||
                render: updateCardButtonRender,
 | 
			
		||||
                orderable: false,
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,104 @@
 | 
			
		||||
import {BaseGrid} from './Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderClickableImportantUserWithScore,
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderUserFirstname,
 | 
			
		||||
    renderUserId,
 | 
			
		||||
    renderUserLastname,
 | 
			
		||||
    renderUserReviewedStatus,
 | 
			
		||||
    renderTime,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export class UsersGrid extends BaseGrid {
 | 
			
		||||
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [[4, 'desc']];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-user-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-userid-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-name-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-name-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-date-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-timestamp-col',
 | 
			
		||||
                targets: 5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'user-status-col',
 | 
			
		||||
                targets: 6
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                visible: false,
 | 
			
		||||
                targets: 7
 | 
			
		||||
            }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'score',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderClickableImportantUserWithScore(record, 'medium');
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'accounttitle',
 | 
			
		||||
                render: renderUserId
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'firstname',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserFirstname(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'lastname',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserLastname(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'created',
 | 
			
		||||
                render: renderDate,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'lastseen',
 | 
			
		||||
                render: renderTime,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'fraud',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderUserReviewedStatus(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'id',
 | 
			
		||||
                name: 'id',
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,73 @@
 | 
			
		||||
import {BaseGrid} from '../Base.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderAuditField,
 | 
			
		||||
    renderAuditValue,
 | 
			
		||||
    renderAuditParent,
 | 
			
		||||
} from '../../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class FieldAuditTrailGrid extends BaseGrid {
 | 
			
		||||
    get orderConfig() {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columnDefs() {
 | 
			
		||||
        const columnDefs = [
 | 
			
		||||
            {
 | 
			
		||||
                className: 'field-audit-trail-date-col',
 | 
			
		||||
                targets: 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'field-audit-trail-field-col',
 | 
			
		||||
                targets: 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'field-audit-trail-value-col',
 | 
			
		||||
                targets: 2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'field-audit-trail-value-col',
 | 
			
		||||
                targets: 3
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                className: 'field-audit-trail-parent-col',
 | 
			
		||||
                targets: 4
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columnDefs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get columns() {
 | 
			
		||||
        const columns = [
 | 
			
		||||
            {
 | 
			
		||||
                data: 'created',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderDate(data);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'field_id',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderAuditField(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'old_value',
 | 
			
		||||
                render: renderAuditValue,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'new_value',
 | 
			
		||||
                render: renderAuditValue,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: 'parent_id',
 | 
			
		||||
                render: (data, type, record) => {
 | 
			
		||||
                    return renderAuditParent(record);
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return columns;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user