Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/vendor/magento/module-ui/view/base/web/js/grid/sticky/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/vendor/magento/module-ui/view/base/web/js/grid/sticky/sticky.js
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

/**
 * @api
 */
define([
    'Magento_Ui/js/lib/view/utils/async',
    'underscore',
    'uiComponent',
    'Magento_Ui/js/lib/view/utils/raf'
], function ($, _, Component, raf) {
    'use strict';

    return Component.extend({
        defaults: {
            listingSelector: '${ $.listingProvider }::not([data-role = "sticky-el-root"])',
            toolbarSelector: '${ $.toolbarProvider }::not([data-role = "sticky-el-root"])',
            bulkRowSelector: '[data-role = "data-grid-bulk-row"]',
            bulkRowHeaderSelector: '.data-grid-info-panel:visible',
            tableSelector: 'table',
            columnSelector: 'thead tr th',
            rowSelector: 'tbody tr',
            toolbarCollapsiblesSelector: '[data-role="toolbar-menu-item"]',
            toolbarCollapsiblesActiveClass: '_active',
            template: 'ui/grid/sticky/sticky',
            stickyContainerSelector: '.sticky-header',
            stickyElementSelector: '[data-role = "sticky-el-root"]',
            leftDataGridCapSelector: '.data-grid-cap-left',
            rightDataGridCapSelector: '.data-grid-cap-right',
            visible: false,
            enableToolbar: true,
            enableHeader: true,
            modules: {
                toolbar: '${ $.toolbarProvider }',
                listing: '${ $.listingProvider }'
            },
            otherStickyElsSize: 77,
            containerNode: null,
            listingNode: null,
            toolbarNode: null,
            stickyListingNode: null,
            stickyToolbarNode: null,
            storedOriginalToolbarElements: [],
            cache: {},
            flags: {},
            dirtyFlag: 'dirty'
        },

        /**
         * Initializes Sticky component.
         *
         * @returns {Object} Chainable.
         */
        initialize: function () {
            this._super();
            _.bindAll(this,
                'adjustStickyElems',
                'initListingNode',
                'initToolbarNode',
                'initContainerNode',
                'initColumns',
                'initStickyListingNode',
                'initStickyToolbarNode',
                'initLeftDataGridCap',
                'initRightDataGridCap'
            );

            $.async(this.listingSelector,
                this.initListingNode);
            $.async(this.toolbarSelector,
                this.initToolbarNode);

            $.async(this.stickyContainerSelector,
                this,
                this.initContainerNode);

            return this;
        },

        /**
         * Init observables
         *
         * @returns {Object} Chainable.
         */
        initObservable: function () {
            this._super()
                .track('visible');

            return this;
        },

        /**
         * Init original listing node
         *
         * @param {HTMLElement} node
         */
        initListingNode: function (node) {
            if ($(node).is(this.stickyElementSelector)) {
                return;
            }
            this.listingNode = $(node);
            $.async(this.columnSelector, node, this.initColumns);
        },

        /**
         * Init original toolbar node
         *
         * @param {HTMLElement} node
         */
        initToolbarNode: function (node) {
            if ($(node).is(this.stickyElementSelector)) {
                return;
            }
            this.toolbarNode = $(node);
        },

        /**
         * Init sticky listing node
         *
         * @param {HTMLElement} node
         */
        initStickyListingNode: function (node) {
            this.stickyListingNode = $(node);
            this.checkPos();
            this.initListeners();
        },

        /**
         * Init sticky toolbar node
         *
         * @param {HTMLElement} node
         */
        initStickyToolbarNode: function (node) {
            this.stickyToolbarNode = $(node);
        },

        /**
         * Init sticky header container node
         *
         * @param {HTMLElement} node
         */
        initContainerNode: function (node) {
            this.containerNode = $(node);

            $.async(this.leftDataGridCapSelector,
                node,
                this.initLeftDataGridCap);
            $.async(this.rightDataGridCapSelector,
                node,
                this.initRightDataGridCap);

            $.async(this.stickyElementSelector,
                this.listing(),
                this.initStickyListingNode);
            $.async(this.stickyElementSelector,
                this.toolbar(),
                this.initStickyToolbarNode);
        },

        /**
         * Init columns (each time when amount of columns is changed)
         *
         */
        initColumns: function () {
            this.columns = this.listingNode.find(this.columnSelector);
        },

        /**
         * Init left DataGridCap
         *
         * @param {HTMLElement} node
         */
        initLeftDataGridCap: function (node) {
            this.leftDataGridCap = $(node);
        },

        /**
         * Init right DataGridCap
         *
         * @param {HTMLElement} node
         */
        initRightDataGridCap: function (node) {
            this.rightDataGridCap = $(node);
        },

        /**
         * Init listeners
         *
         * @returns {Object} Chainable.
         */
        initListeners: function () {
            this.adjustStickyElems();
            this.initOnResize()
                .initOnScroll()
                .initOnListingScroll();

            return this;
        },

        /**
         * Start to listen to window scroll event
         *
         * @returns {Object} Chainable.
         */
        initOnScroll: function () {
            this.lastHorizontalScrollPos = $(window).scrollLeft();
            document.addEventListener('scroll', function () {
                this.flags.scrolled = true;
            }.bind(this));

            return this;
        },

        /**
         * Start to listen to original listing scroll event
         *
         * @returns {Object} Chainable.
         */
        initOnListingScroll: function () {
            $(this.listingNode).on('scroll', function (e) {
                this.flags.listingScrolled = true;
                this.flags.listingScrolledValue = $(e.target).scrollLeft();
            }.bind(this));

            return this;
        },

        /**
         * Start to listen to window resize event
         *
         * @returns {Object} Chainable.
         */
        initOnResize: function () {
            $(window).on('resize', function () {
                this.flags.resized = true;
            }.bind(this));

            return this;
        },

        /**
         * Adjust sticky header elements according to flags of the events that have happened in the endless RAF loop
         */
        adjustStickyElems: function () {
            if (this.flags.resized ||
                this.flags.scrolled) {
                this.checkPos();
            }

            if (this.visible) {
                this.checkTableElemsWidth();

                if (this.flags.originalWidthChanged) {
                    this.adjustContainerElemsWidth();
                }

                if (this.flags.resized) {
                    this.onResize();
                }

                if (this.flags.scrolled) {
                    this.onWindowScroll();
                }

                if (this.flags.listingScrolled) {
                    this.onListingScroll(this.flags.listingScrolledValue);
                }
            }
            _.each(this.flags, function (val, key) {
                if (val === this.dirtyFlag) {
                    this.flags[key] = false;
                } else if (val) {
                    this.flags[key] = this.dirtyFlag;
                }
            }, this);

            raf(this.adjustStickyElems);
        },

        /**
         * Handles window scroll
         */
        onWindowScroll: function () {
            var scrolled = $(window).scrollLeft(),
                horizontal = this.lastHorizontalScrollPos !== scrolled;

            if (horizontal) {
                this.adjustOffset()
                    .adjustDataGridCapPositions();
                this.lastHorizontalScrollPos = scrolled;
            } else {
                this.checkPos();
            }
        },

        /**
         * Handles original listing scroll
         *
         * @param {Number} scrolled
         */
        onListingScroll: function (scrolled) {
            this.adjustOffset(scrolled);
        },

        /**
         * Handles window resize
         */
        onResize: function () {
            this.checkPos();
            this.adjustContainerElemsWidth()
                .adjustDataGridCapPositions();
        },

        /**
         * Check if original table or columns change it dimensions and sets appropriate flag
         */
        checkTableElemsWidth: function () {
            var newWidth = this.getTableWidth();

            if (this.cache.tableWidth !== newWidth) {
                this.cache.tableWidth = newWidth;
                this.flags.originalWidthChanged = true;
            } else if (this.cache.colChecksum !== this.getColsChecksum()) {
                this.cache.colChecksum = this.getColsChecksum();
                this.flags.originalWidthChanged = true;
            }
        },

        /**
         * Get the checksum of original columns width
         *
         * @returns {Number}.
         */
        getColsChecksum: function () {
            return _.reduce(this.columns,
            function (pv, cv) {
                return ($(pv).width() || pv) + '' + $(cv).width();
            });
        },

        /**
         * Get the width of the sticky table wrapper
         *
         * @returns {Number}.
         */
        getListingWidth: function () {
            return this.listingNode.width();
        },

        /**
         * Get the width of the original table
         *
         * @returns {Number}.
         */
        getTableWidth: function () {
            return this.listingNode.find(this.tableSelector).width();
        },

        /**
         * Get the top elem: header or toolbar
         *
         * @returns {HTMLElement}.
         */
        getTopElement: function () {
            return this.toolbarNode || this.listingNode;
        },

        /**
         * Get the height of the other sticky elem (Page header)
         *
         * @returns {Number}.
         */
        getOtherStickyElementsSize: function () {
            return this.otherStickyElsSize;
        },

        /**
         * Get original bulk row height, if is visible
         *
         * @returns {Number}.
         */
        getBulkRowHeight: function () {
            return this.listingNode.find(this.bulkRowSelector).filter(':visible').height();
        },

        /**
         * Get top Y coord of the sticky header
         *
         * @returns {Number}.
         */
        getListingTopYCoord: function () {
            var bulkRowHeight = this.getBulkRowHeight();

            return this.listingNode.find('tbody').offset().top -
                this.containerNode.height() -
                $(window).scrollTop() +
                bulkRowHeight;
        },

        /**
         * Check if sticky header must be visible
         *
         * @returns {Boolean}.
         */
        getMustBeSticky: function () {
            var stickyTopCondition = this.getListingTopYCoord() - this.getOtherStickyElementsSize(),
                stickyBottomCondition = this.listingNode.offset().top +
                    this.listingNode.height() -
                    $(window).scrollTop() +
                    this.getBulkRowHeight() -
                    this.getOtherStickyElementsSize();

            return stickyTopCondition < 0 && stickyBottomCondition > 0;
        },

        /**
         * Resize sticky header and cols
         *
         * @returns {Object} Chainable.
         */
        adjustContainerElemsWidth: function () {
            this.resizeContainer()
                .resizeCols()
                .resizeBulk();

            return this;
        },

        /**
         * Resize sticky header
         *
         * @returns {Object} Chainable.
         */
        resizeContainer: function () {
            var listingWidth = this.getListingWidth();

            this.stickyListingNode.innerWidth(listingWidth);
            this.stickyListingNode.find(this.tableSelector).innerWidth(this.getTableWidth());

            if (this.stickyToolbarNode) {
                this.stickyToolbarNode.innerWidth(listingWidth);
            }

            return this;
        },

        /**
         * Resize sticky cols
         *
         * @returns {Object} Chainable.
         */
        resizeCols: function () {
            var cols = this.listingNode.find(this.columnSelector);

            this.stickyListingNode.find(this.columnSelector).each(function (ind) {
                var originalColWidth =  $(cols[ind]).width();

                $(this).width(originalColWidth);
            });

            return this;
        },

        /**
         * Resize bulk row header
         *
         * @returns {Object} Chainable.
         */
        resizeBulk: function () {
            var bulk = this.containerNode.find(this.bulkRowHeaderSelector)[0];

            if (bulk) {
                $(bulk).innerWidth(this.getListingWidth());
            }

            return this;
        },

        /**
         * Reset viewport to the top of listing
         */
        resetToTop: function () {
            var posOfTopEl = this.getTopElement().offset().top - this.getOtherStickyElementsSize() || 0;

            $(window).scrollTop(posOfTopEl);
        },

        /**
         * Adjust sticky header offset
         *
         * @param {Number} val
         * @returns {Object} Chainable.
         */
        adjustOffset: function (val) {
            val = val || this.listingNode.scrollLeft();
            this.stickyListingNode.offset({
                left: this.listingNode.offset().left - val
            });

            return this;
        },

        /**
         * Adjust both DataGridCap position
         *
         * @returns {Object} Chainable.
         */
        adjustDataGridCapPositions: function () {
            this.adjustLeftDataGridCapPos()
                .adjustRightDataGridCapPos();

            return this;
        },

        /**
         * Adjust left DataGridCap position
         *
         * @returns {Object} Chainable.
         */
        adjustLeftDataGridCapPos: function () {
            this.leftDataGridCap.offset({
                left: this.listingNode.offset().left - this.leftDataGridCap.width()
            });

            return this;
        },

        /**
         * Adjust right DataGridCap position
         *
         * @returns {Object} Chainable.
         */
        adjustRightDataGridCapPos: function () {
            this.rightDataGridCap.offset({
                left: this.listingNode.offset().left + this.listingNode.width()
            });

            return this;
        },

        /**
         * Hides the oiginal toolbar opened dropdowns/collapsibles etc
         */
        collapseOriginalElements: function () {
            this.toolbarNode
                .find(this.toolbarCollapsiblesSelector)
                .css('visibility', 'hidden');
            $(this.listingNode.find(this.bulkRowSelector)[0]).css('visibility', 'hidden');
        },

        /**
         * Restores the oiginal toolbar opened dropdowns/collapsibles etc
         */
        restoreOriginalElements: function () {
            this.toolbarNode
                .find(this.toolbarCollapsiblesSelector)
                .css('visibility', 'visible');
            $(this.listingNode.find(this.bulkRowSelector)[0]).css('visibility', 'visible');
        },

        /**
         * Toggle the visibility of sticky header
         *
         * @returns {Object} Chainable.
         */
        toggleContainerVisibility: function () {
            this.visible = !this.visible;

            return this;
        },

        /**
         * Checks position of the listing to know if need to show/hide sticky header
         *
         * @returns {Boolean} whether the visibility of the sticky header was toggled.
         */
        checkPos: function () {
            var isSticky = this.visible,
                mustBeSticky = this.getMustBeSticky(),
                needChange = isSticky !== mustBeSticky;

            if (needChange) {
                if (mustBeSticky) {
                    this.collapseOriginalElements();
                    this.toggleContainerVisibility();
                    this.adjustContainerElemsWidth()
                        .adjustOffset()
                        .adjustDataGridCapPositions();

                } else {
                    this.toggleContainerVisibility();
                    this.restoreOriginalElements();
                }
            }

            return needChange;
        }
    });
});

Spamworldpro Mini