bundle-dynamic-rows.js 3.23 KB
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

define([
    'underscore',
    'mageUtils',
    'uiRegistry',
    'Magento_Ui/js/dynamic-rows/dynamic-rows'
], function (_, utils, registry, dynamicRows) {
    'use strict';

    return dynamicRows.extend({
        defaults: {
            label: '',
            collapsibleHeader: true,
            columnsHeader: false,
            deleteProperty: false,
            addButton: false
        },

        /**
         * Set new data to dataSource,
         * delete element
         *
         * @param {Array} data - record data
         */
        _updateData: function (data) {
            var elems = _.clone(this.elems()),
                path,
                dataArr,
                optionBaseData;

            dataArr = this.recordData.splice(this.startIndex, this.recordData().length - this.startIndex);
            dataArr.splice(0, this.pageSize);
            elems = _.sortBy(this.elems(), function (elem) {
                return ~~elem.index;
            });

            data.concat(dataArr).forEach(function (rec, idx) {
                if (elems[idx]) {
                    elems[idx].recordId = rec[this.identificationProperty];
                }

                if (!rec.position) {
                    rec.position = this.maxPosition;
                    this.setMaxPosition();
                }

                path = this.dataScope + '.' + this.index + '.' + (this.startIndex + idx);
                optionBaseData = _.pick(rec, function (value) {
                    return !_.isObject(value);
                });
                this.source.set(path, optionBaseData);
                this.source.set(path + '.bundle_button_proxy', []);
                this.source.set(path + '.bundle_selections', []);
                this.removeBundleItemsFromOption(idx);
                _.each(rec['bundle_selections'], function (obj, index) {
                    this.source.set(path + '.bundle_button_proxy' + '.' + index, rec['bundle_button_proxy'][index]);
                    this.source.set(path + '.bundle_selections' + '.' + index, obj);
                }, this);
            }, this);

            this.elems(elems);
        },

        /**
         *  Removes nested dynamic-rows-grid rendered records from option
         *
         * @param {Number|String} index - element index
         */
        removeBundleItemsFromOption: function (index) {
            var bundleSelections = registry.get(this.name + '.' + index + '.' + this.bundleSelectionsName),
                bundleSelectionsLength = (bundleSelections.elems() || []).length,
                i;

            if (bundleSelectionsLength) {
                for (i = 0; i < bundleSelectionsLength; i++) {
                    bundleSelections.elems()[0].destroy();
                }
            }
        },

        /**
        * {@inheritdoc}
        */
        processingAddChild: function (ctx, index, prop) {
            var recordIds = _.map(this.recordData(), function (rec) {
                return parseInt(rec['record_id'], 10);
            }),
            maxRecordId = _.max(recordIds);

            prop = maxRecordId > -1 ? maxRecordId + 1 : prop;
            this._super(ctx, index, prop);
        }
    });
});