![]() 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/form/components/ |
/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** * @api */ define([ 'jquery', './insert', 'mageUtils', 'underscore' ], function ($, Insert, utils, _) { 'use strict'; return Insert.extend({ defaults: { externalListingName: '${ $.ns }.${ $.ns }', behaviourType: 'simple', externalFilterMode: false, requestConfig: { method: 'POST' }, externalCondition: 'nin', settings: { edit: { imports: { 'onChangeRecord': '${ $.editorProvider }:changed' } }, filter: { exports: { 'requestConfig': '${ $.externalProvider }:requestConfig' } } }, imports: { onSelectedChange: '${ $.selectionsProvider }:selected', 'update_url': '${ $.externalProvider }:update_url', 'indexField': '${ $.selectionsProvider }:indexField' }, exports: { externalFiltersModifier: '${ $.externalProvider }:params.filters_modifier' }, listens: { externalValue: 'updateExternalFiltersModifier updateSelections', indexField: 'initialUpdateListing' }, modules: { selections: '${ $.selectionsProvider }', externalListing: '${ $.externalListingName }' } }, /** * Invokes initialize method of parent class, * contains initialization logic */ initialize: function () { this._super(); _.bindAll(this, 'updateValue', 'updateExternalValueByEditableData'); return this; }, /** @inheritdoc */ initConfig: function (config) { var defaults = this.constructor.defaults; if (config.behaviourType === 'edit') { defaults.editableData = {}; _.map(defaults.settings.edit.imports, function (value, key) { this.imports[key] = value; }, defaults); } if (config.externalFilterMode === true) { _.map(defaults.settings.filter.exports, function (value, key) { this.exports[key] = value; }, defaults); } return this._super(); }, /** @inheritdoc */ initObservable: function () { return this._super() .observe([ 'externalValue' ]); }, /** @inheritdoc */ destroyInserted: function () { if (this.isRendered && this.externalListing()) { this.externalListing().source.storage().clearRequests(); this.externalListing().delegate('destroy'); } return this._super(); }, /** * Store data from edited record * * @param {Object} record */ onChangeRecord: function (record) { this.updateEditableData(record); if (!this.dataLinks.imports) { return; } this.updateExternalValueByEditableData(); }, /** * Updates externalValue every time row is selected, * if it is configured by 'dataLinks.imports' * Also suppress dataLinks so import/export of selections will not activate each other in circle * */ onSelectedChange: function () { if (!this.dataLinks.imports || this.suppressDataLinks || _.isBoolean(this.initialExportDone) && !this.initialExportDone ) { this.suppressDataLinks = false; return; } this.suppressDataLinks = true; this.updateExternalValue(); }, /** * Stores data from editor in editableData * @param {Object} record * */ updateEditableData: function (record) { var id = _.keys(record[0])[0]; this.editableData[id] = record[0][id]; }, /** * Updates externalValue by data from editor (already stored in editableData) * */ updateExternalValueByEditableData: function () { var updatedExtValue; if (!(this.behaviourType === 'edit') || _.isEmpty(this.editableData) || _.isEmpty(this.externalValue())) { return; } updatedExtValue = this.externalValue(); updatedExtValue.map(function (item) { _.extend(item, this.editableData[item[this.indexField]]); }, this); this.setExternalValue(updatedExtValue); }, /** * Updates externalValue, from selectionsProvider data (if it is enough) * or ajax request to server * * @returns {Object} result - deferred that will be resolved when value is updated */ updateExternalValue: function () { var result = $.Deferred(), provider = this.selections(), selections, totalSelected, itemsType, rows; if (!provider) { return result; } selections = provider && provider.getSelections(); totalSelected = provider.totalSelected(); itemsType = selections && selections.excludeMode ? 'excluded' : 'selected'; rows = provider && provider.rows(); if (this.canUpdateFromClientData(totalSelected, selections.selected, rows)) { this.updateFromClientData(selections.selected, rows); this.updateExternalValueByEditableData(); result.resolve(); } else { this.updateFromServerData(selections, itemsType).done(function () { this.updateExternalValueByEditableData(); result.resolve(); }.bind(this)); } return result; }, /** * Check if the selected rows data can be taken from selectionsProvider data * (which only stores data of the current page rows) * + from already saved data * * @param {Boolean} totalSelected - total rows selected (include rows that were filtered out) * @param {Array} selected - ids of selected rows * @param {Object} rows */ canUpdateFromClientData: function (totalSelected, selected, rows) { var alreadySavedSelectionsIds = _.pluck(this.externalValue(), this.indexField), rowsOnCurrentPageIds = _.pluck(rows, this.indexField); return totalSelected === selected.length && _.intersection(_.union(alreadySavedSelectionsIds, rowsOnCurrentPageIds), selected).length === selected.length; }, /** * Updates externalValue, from selectionsProvider data * (which only stores data of the current page rows) * + from already saved data * so we can avoid request to server * * @param {Array} selected - ids of selected rows * @param {Object} rows */ updateFromClientData: function (selected, rows) { var value, rowIds, valueIds; if (!selected || !selected.length) { this.setExternalValue([]); return; } value = this.externalValue(); rowIds = _.pluck(rows, this.indexField); valueIds = _.pluck(value, this.indexField); value = _.map(selected, function (item) { if (_.contains(rowIds, item)) { return _.find(rows, function (row) { return row[this.indexField] === item; }, this); } else if (_.contains(valueIds, item)) { return _.find(value, function (row) { return row[this.indexField] === item; }, this); } }, this); this.setExternalValue(value); }, /** * Updates externalValue, from ajax request to grab selected rows data * * @param {Object} selections * @param {String} itemsType * * @returns {Object} request - deferred that will be resolved when ajax is done */ updateFromServerData: function (selections, itemsType) { var filterType = selections && selections.excludeMode ? 'nin' : 'in', selectionsData = {}, request; _.extend(selectionsData, this.params || {}, selections.params); if (selections[itemsType] && selections[itemsType].length) { selectionsData.filters = {}; selectionsData['filters_modifier'] = {}; selectionsData['filters_modifier'][this.indexField] = { 'condition_type': filterType, value: selections[itemsType] }; } selectionsData.paging = { notLimits: 1 }; request = this.requestData(selectionsData, { method: this.requestConfig.method }); request .done(function (data) { this.setExternalValue(data.items || data); this.loading(false); }.bind(this)) .fail(this.onError); return request; }, /** * Set listing rows data to the externalValue, * or if externalData is configured with the names of particular columns, * filter rows data to have only these columns, and then set to the externalValue * * @param {Object} newValue - rows data * */ setExternalValue: function (newValue) { var keys = this.externalData, value = this.externalValue(), selectedIds = _.pluck(newValue, this.indexField); if (_.isArray(keys) && !_.isEmpty(keys)) { newValue = _.map(newValue, function (item) { return _.pick(item, keys); }, this); } else if (keys && _.isString(keys) && !_.isEmpty(newValue)) { newValue = newValue[0][keys]; } if (this.externalFilterMode) { newValue = _.union(newValue, _.filter(value, function (item) { return !_.contains(selectedIds, item[this.indexField]); }, this)); } this.set('externalValue', newValue); }, /** * Updates external filter (if externalFilterMode is on) * every time, when value is updated, * so grid is re-filtered to exclude or include selected rows only * * @param {Object} items */ updateExternalFiltersModifier: function (items) { var provider, filter = {}; if (!this.externalFilterMode) { return; } provider = this.selections(); if (!provider) { this.needInitialListingUpdate = true; return; } filter[this.indexField] = { 'condition_type': this.externalCondition, value: _.pluck(items, this.indexField) }; this.set('externalFiltersModifier', filter); }, /** * Updates grid selections * every time, when extenalValue is updated, * so grid is re-selected according to externalValue updated * Also suppress dataLinks so import/export of selections will not activate each other in circle * * @param {Object} items */ updateSelections: function (items) { var provider, ids; if (!this.dataLinks.exports || this.suppressDataLinks) { this.suppressDataLinks = false; this.initialExportDone = true; return; } provider = this.selections(); if (!provider) { this.needInitialListingUpdate = true; return; } this.suppressDataLinks = true; provider.deselectAll(); if (_.isString(items)) { provider.selected([items] || []); } else { ids = _.pluck(items || [], this.indexField) .map(function (item) { return item.toString(); }); provider.selected(ids || []); } this.initialExportDone = true; }, /** * initial update of the listing * with rows that must be checked/filtered * by the indexes */ initialUpdateListing: function () { var items = this.externalValue(); if (this.needInitialListingUpdate && items) { this.updateExternalFiltersModifier(items); this.updateSelections(items); this.needInitialListingUpdate = false; } }, /** * Reload source */ reload: function () { this.externalSource().set('params.t', new Date().getTime()); }, /** * Updates value from external value * */ updateValue: function () { this.set('value', this.externalValue()); }, /** * Updates external value, then updates value from external value * */ save: function () { this.updateExternalValue().done( function () { if (!this.realTimeLink) { this.updateValue(); } }.bind(this) ); } }); });