123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * jQuery plugin is added.
- *
- * @api
- */
- define([
- 'jquery',
- 'Magento_Ui/js/modal/alert',
- 'jquery/ui',
- 'mage/translate',
- 'Magento_Ui/js/modal/modal'
- ], function ($, alert) {
- 'use strict';
- $.widget('mage.integration', {
- /**
- * Options common to all instances of this widget.
- * @type {Object}
- */
- options: {
- /**
- * URL of the integration grid.
- * @type {String}
- */
- gridUrl: ''
- },
- /**
- * Bind event handler for the action when admin clicks "Save & Activate" button.
- * @private
- */
- _create: function () {
- if ($('#save-split-button-activate').length) {
- // We're on the "New integration" page - bind related handler
- this._form = $('#edit_form');
- this._form.on('saveAndActivate', $.proxy(this._saveAndActivate, this));
- }
- },
- /**
- * Save new integration, then kick off the activate dialog.
- * @private
- */
- _saveAndActivate: function () {
- if (this._form.validation && !this._form.validation('isValid')) {
- return false;
- }
- $.ajax({
- url: this._form.prop('action'),
- type: 'post',
- data: this._form.serialize(),
- dataType: 'json',
- context: this,
- /** @inheritdoc */
- beforeSend: function () {
- $('body').trigger('processStart');
- },
- /** @inheritdoc */
- success: function (data) {
- var integrationName, that;
- if (data._redirect) {
- window.location.href = data._redirect;
- } else if (data.integrationId) {
- integrationName = $('#integration_properties_name').val();
- window.integration.popup.show($('<span>').attr({
- 'data-row-dialog': 'permissions',
- 'data-row-id': data.integrationId,
- // We do escaping here instead of the place of actual output because _showPopup()
- // actually receives dialog window title from couple of places: from here and from the grid.
- // The issue is we always should escape values in the grid, so that value is already
- // escaped. To avoid double escaping we do it here instead of the output.
- 'data-row-name': $('<div>').text(integrationName).html(),
- 'data-row-is-reauthorize': '0',
- 'data-row-is-token-exchange': data.isTokenExchange
- }));
- that = this;
- $('#integration-popup-container').on('dialogclose', function () {
- $('body').trigger('processStart');
- window.location.href = that.options.gridUrl;
- return false;
- });
- }
- },
- /** @inheritdoc */
- error: function (jqXHR, status, error) {
- alert({
- content: $.mage.__('Sorry, something went wrong. Please try again later.')
- });
- window.console && console.log(status + ': ' + error + '\nResponse text:\n' + jqXHR.responseText);
- },
- /** @inheritdoc */
- complete: function () {
- $('body').trigger('processStop');
- }
- });
- return true;
- }
- });
- /**
- * @param {*} permissionsDialogUrl
- * @param {*} tokensDialogUrl
- * @param {*} tokensExchangeUrl
- * @param {*} gridUrl
- * @param {*} successCallbackUrl
- * @return {Object}
- * @constructor
- */
- window.Integration = function (
- permissionsDialogUrl,
- tokensDialogUrl,
- tokensExchangeUrl,
- gridUrl,
- successCallbackUrl
- ) {
- var url = {
- permissions: permissionsDialogUrl,
- tokens: tokensDialogUrl,
- tokensExchange: tokensExchangeUrl,
- grid: gridUrl
- },
- IdentityLogin = {
- win: null,
- strLocation: null,
- checker: null,
- isCalledBack: false,
- //Info popup dialog. Should be hidden when login window is closed
- jqInfoDialog: $('#integration-popup-container'),
- successCallbackUrl: successCallbackUrl,
- Constants: {
- /*
- This interval is set such that it adjusts to the child window closing timeout of 1000 ms. This will
- give the checker function enough time to detect if the successCallback has been invoked
- */
- CHECKER_INTERVAL: 500,
- //Login screen size plus some buffer
- WIDTH: 680,
- HEIGHT: 510,
- // subtract pixels(30) and width(680) from screen width to move popup from extreme left
- LEFT: screen.width - 680 - 30,
- // subtract pixels(300) and height(300) from screen height to move from top
- TOP: screen.height - 510 - 300
- },
- /**
- * @param {*} identityCallbackUrl
- * @param {*} consumerKey
- * @param {*} jqInfoDialog
- */
- invokePopup: function (identityCallbackUrl, consumerKey, jqInfoDialog) {
- var param;
- // Callback should be invoked only once. Reset callback flag on subsequent invocations.
- IdentityLogin.isCalledBack = false;
- IdentityLogin.jqInfoDialog = jqInfoDialog;
- param = $.param({
- 'oauth_consumer_key': consumerKey,
- 'success_call_back': IdentityLogin.successCallbackUrl
- });
- IdentityLogin.win = window.open(identityCallbackUrl + '?' + param, '',
- 'top=' + IdentityLogin.Constants.TOP +
- ', left=' + IdentityLogin.Constants.LEFT +
- ', width=' + IdentityLogin.Constants.WIDTH +
- ', height=' + IdentityLogin.Constants.HEIGHT + ',scrollbars=no');
- if (IdentityLogin.checker != null) {
- //Clear any previous check
- clearInterval(IdentityLogin.checker);
- }
- //Polling to detect url of the child window.
- IdentityLogin.checker = setInterval(
- IdentityLogin.fnCheckLocation, IdentityLogin.Constants.CHECKER_INTERVAL
- );
- },
- /**
- * Function to check the location of the child popup window.
- * Once detected if the callback is successful, parent window will be reloaded
- */
- fnCheckLocation: function () {
- if (IdentityLogin.win == null) {
- return;
- }
- // Check to see if the location has changed.
- try {
- //Is the success callback invoked
- if (IdentityLogin.win.closed ||
- IdentityLogin.win.location.href == IdentityLogin.successCallbackUrl //eslint-disable-line eqeqeq
- ) {
- //Stop the polling
- clearInterval(IdentityLogin.checker);
- $('body').trigger('processStart');
- //Check for window closed
- window.location.reload();
- IdentityLogin.jqInfoDialog.modal('closeModal');
- }
- } catch (e) {
- //squash. In case Window closed without success callback, clear polling
- if (IdentityLogin.win.closed) {
- IdentityLogin.jqInfoDialog.modal('closeModal');
- clearInterval(IdentityLogin.checker);
- }
- return;
- }
- }
- },
- /**
- * @param {Object} popupWindow
- * @return {Boolean}
- */
- isPopupBlocked = function (popupWindow) {
- try {
- popupWindow.focus();
- } catch (e) {
- alert({
- content: $.mage.__('Popup Blocker is enabled! Please add this site to your exception list.')
- });
- return true;
- }
- return false;
- },
- /**
- * @param {*} dialog
- * @param {*} title
- * @param {*} okButton
- * @param {*} ajaxUrl
- * @private
- */
- _showPopup = function (dialog, title, okButton, ajaxUrl) {
- $.ajax({
- url: ajaxUrl,
- cache: false,
- data: {
- 'form_key': window.FORM_KEY
- },
- method: 'GET',
- /** @inheritdoc */
- beforeSend: function () {
- // Show the spinner
- $('body').trigger('processStart');
- },
- /** @inheritdoc */
- success: function (result) {
- var redirect = result._redirect,
- identityLinkUrl, consumerKey, popupHtml, popup, resultObj, buttons, dialogProperties;
- if (redirect) {
- window.location.href = redirect;
- return;
- }
- identityLinkUrl = null;
- consumerKey = null;
- popupHtml = null;
- popup = $('#integration-popup-container');
- try {
- resultObj = typeof result === 'string' ?
- JSON.parse(result) :
- result;
- identityLinkUrl = resultObj['identity_link_url'];
- consumerKey = resultObj['oauth_consumer_key'];
- popupHtml = resultObj['popup_content'];
- } catch (e) {
- //This is expected if result is not json. Do nothing.
- }
- if (identityLinkUrl && consumerKey && popupHtml) {
- IdentityLogin.invokePopup(identityLinkUrl, consumerKey, popup);
- if (isPopupBlocked(IdentityLogin.win)) {
- return;
- }
- } else {
- popupHtml = result;
- }
- if (popup.length === 0) {
- popup = $('<div/>');
- }
- popup.html(popupHtml);
- buttons = [];
- dialogProperties = {
- title: title,
- type: 'slide',
- dialogClass: dialog == 'permissions' ? 'integration-dialog' : 'integration-dialog no-close' //eslint-disable-line
- };
- // Add confirmation button to the list of dialog buttons. okButton not set for tokenExchange dialog
- if (okButton) {
- buttons.push(okButton);
- }
- // Add button only if its not empty
- if (buttons.length > 0) {
- dialogProperties.buttons = buttons;
- }
- popup.modal(dialogProperties);
- popup.modal('openModal');
- },
- /** @inheritdoc */
- error: function (jqXHR, status, error) {
- alert({
- content: $.mage.__('Sorry, something went wrong. Please try again later.')
- });
- window.console && console.log(status + ': ' + error + '\nResponse text:\n' + jqXHR.responseText);
- },
- /** @inheritdoc */
- complete: function () {
- // Hide the spinner
- $('body').trigger('processStop');
- }
- });
- };
- return {
- popup: {
- /**
- * @param {*} ctx
- */
- show: function (ctx) {
- var dialog = $(ctx).attr('data-row-dialog'),
- isReauthorize = $(ctx).attr('data-row-is-reauthorize'),
- isTokenExchange = $(ctx).attr('data-row-is-token-exchange'),
- integrationId, ajaxUrl, integrationName, okButton;
- if (!url.hasOwnProperty(dialog)) {
- throw 'Invalid dialog type';
- }
- integrationId = $(ctx).attr('data-row-id');
- if (!integrationId) {
- throw 'Unable to find integration ID';
- }
- // Replace placeholders in URL
- ajaxUrl = url[dialog].replace(':id', integrationId).replace(':isReauthorize', isReauthorize);
- try {
- // Get integration name either from current element or from neighbor column
- integrationName = $(ctx).attr('data-row-name') ||
- $(ctx).parents('tr').find('.col-name').html().trim();
- if (integrationName.indexOf('<span') > -1) {
- // Remove unsecure URL warning from popup window title if it is present
- integrationName = integrationName.substring(0, integrationName.indexOf('<span'));
- }
- } catch (e) {
- throw 'Unable to find integration name';
- }
- okButton = {
- permissions: {
- text: isReauthorize == '1' ? $.mage.__('Reauthorize') : $.mage.__('Allow'), //eslint-disable-line
- 'class': 'action-primary',
- attr: {
- 'data-row-id': integrationId,
- 'data-row-name': integrationName,
- 'data-row-dialog': isTokenExchange == '1' ? 'tokensExchange' : 'tokens', //eslint-disable-line
- 'data-row-is-reauthorize': isReauthorize,
- 'data-row-is-token-exchange': isTokenExchange
- },
- /**
- * Click.
- */
- click: function () {
- // Find the 'Allow' button and clone - it has all necessary data, but is going to be
- // destroyed along with the current dialog
- var context = this.modal.find('button.action-primary').clone(true);
- this.closeModal();
- this.modal.remove();
- // Make popup out of data we saved from 'Allow' button
- window.integration.popup.show(context);
- }
- },
- tokens: {
- text: $.mage.__('Done'),
- 'class': 'action-primary',
- /**
- * Click.
- */
- click: function () {
- // Integration has been activated at the point of generating tokens
- window.location.href = url.grid;
- }
- }
- };
- _showPopup(dialog, integrationName, okButton[dialog], ajaxUrl);
- }
- }
- };
- };
- return $.mage.integration;
- });
|