123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- define([
- 'jquery',
- 'uiClass',
- 'Magento_Paypal/js/rule',
- 'mageUtils',
- 'underscore'
- ], function ($, Class, Rule, utils, _) {
- 'use strict';
- return Class.extend({
- defaults: {
- /**
- * The event corresponding to the state change
- */
- systemEvent: 'change',
- /**
- * The rules applied after the page is loaded
- */
- afterLoadRules: [],
- /**
- * An attribute of the element responsible for the activation of the payment method (data attribute)
- */
- enableButton: '[data-enable="payment"]',
- /**
- * An attribute of the element responsible for the activation of the Payflow Express (data attribute)
- */
- enableExpress: '[data-enable="express"]',
- /**
- * An attribute of the element responsible for the activation of the
- * PayPal Express In-Context Checkout Experience (data attribute)
- */
- enableInContextPayPal: '[data-enable="in-context-api"]',
- /**
- * An attribute of the element responsible for the activation of the Payflow Bml (data attribute)
- */
- enableBml: '[data-enable="bml"]',
- /**
- * An attribute of the element responsible for the activation of the PayPal Bml (data attribute)
- */
- enableBmlPayPal: '[data-enable="bml-api"]',
- /**
- * An attribute of the element responsible for the visibility of the PayPal Merchant Id (data attribute)
- */
- dependsMerchantId: '[data-enable="merchant-id"]',
- /**
- * An attribute of the element responsible for the visibility of the Payflow Bml Sort Order (data attribute)
- */
- dependsBmlSortOrder: '[data-enable="bml-sort-order"]',
- /**
- * An attribute of the element responsible for the visibility of the PayPal Bml Sort Order (data attribute)
- */
- dependsBmlApiSortOrder: '[data-enable="bml-api-sort-order"]',
- /**
- * An attribute of the element responsible for the visibility of the
- * button Label credit option (data attribute)
- */
- dependsButtonLabel: '[data-enable="button-label"]',
- /**
- * An attribute of the element responsible for the visibility of the
- * button Label credit option on load (data attribute)
- */
- dependsDisableFundingOptions: '[data-enable="disable-funding-options"]',
- /**
- * Templates element selectors
- */
- templates: {
- elementSelector: 'div.section-config tr[id$="${ $.identifier }"]:first'
- }
- },
- /**
- * Constructor
- *
- * @param {Object} config
- * @param {String} identifier
- * @returns {exports.initialize}
- */
- initialize: function (config, identifier) {
- this.initConfig(config);
- this.$self = this.createElement(identifier);
- return this;
- },
- /**
- * Initialization events
- *
- * @returns {exports.initEvents}
- */
- initEvents: function () {
- _.each(this.config.events, function (elementEvents, selector) {
- var solution = this,
- selectorButton = solution.$self.find(selector),
- $self = solution.$self,
- events = elementEvents;
- selectorButton.on(solution.systemEvent, function () {
- _.each(events, function (elementEvent, name) {
- var predicate = elementEvent.predicate,
- result = true,
- /**
- * @param {Function} functionPredicate
- */
- predicateCallback = function (functionPredicate) {
- result = functionPredicate(solution, predicate.message, predicate.argument);
- if (result) {
- $self.trigger(name);
- } else {
- $self.trigger(predicate.event);
- }
- };
- if (solution.getValue($(this)) === elementEvent.value ||
- $(this).prop('multiple') && solution.checkMultiselectValue($(this), elementEvent)
- ) {
- if (predicate.name) {
- require([
- 'Magento_Paypal/js/predicate/' + predicate.name
- ], predicateCallback);
- } else {
- $self.trigger(name);
- }
- }
- }, this);
- });
- }, this);
- return this;
- },
- /**
- * @param {Object} $element
- * @returns {*}
- */
- getValue: function ($element) {
- if ($element.is(':checkbox')) {
- return $element.prop('checked') ? '1' : '0';
- }
- return $element.val();
- },
- /**
- * Check multiselect value based on include value
- *
- * @param {Object} $element
- * @param {Object} elementEvent
- * @returns {Boolean}
- */
- checkMultiselectValue: function ($element, elementEvent) {
- var isValueSelected = $.inArray(elementEvent.value, $element.val()) >= 0;
- if (elementEvent.include) {
- isValueSelected = (isValueSelected ? 'true' : 'false') === elementEvent.include;
- }
- return isValueSelected;
- },
- /**
- * Adding event listeners
- *
- * @returns {exports.addListeners}
- */
- addListeners: function () {
- _.each(this.config.relations, function (rules, targetName) {
- var $target = this.createElement(targetName);
- _.each(rules, function (instances, instanceName) {
- _.each(instances, function (instance) {
- var handler = new Rule({
- name: instanceName,
- $target: $target,
- $owner: this.$self,
- data: {
- buttonConfiguration: this.buttonConfiguration,
- enableButton: this.enableButton,
- enableExpress: this.enableExpress,
- enableInContextPayPal: this.enableInContextPayPal,
- enableBml: this.enableBml,
- enableBmlPayPal: this.enableBmlPayPal,
- dependsMerchantId: this.dependsMerchantId,
- dependsBmlSortOrder: this.dependsBmlSortOrder,
- dependsBmlApiSortOrder: this.dependsBmlApiSortOrder,
- dependsButtonLabel: this.dependsButtonLabel,
- dependsDisableFundingOptions: this.dependsDisableFundingOptions,
- solutionsElements: this.solutionsElements,
- argument: instance.argument
- }
- });
- if (instance.event === ':load') {
- this.afterLoadRules.push(handler);
- return;
- }
- this.$self.on(instance.event, _.bind(handler.apply, handler));
- }, this);
- }, this);
- }, this);
- return this;
- },
- /**
- * Create a jQuery element according to selector
- *
- * @param {String} identifier
- * @returns {*}
- */
- createElement: function (identifier) {
- if (identifier === ':self') {
- return this.$self;
- }
- return $(utils.template(this.templates.elementSelector, {
- 'identifier': identifier
- }));
- },
- /**
- * Assign solutions elements
- *
- * @param {Object} elements
- * @returns {exports.setSolutionsElements}
- */
- setSolutionsElements: function (elements) {
- this.solutionsElements = elements;
- return this;
- }
- });
- });
|