Update .gitignore
|
|
@ -50,7 +50,7 @@ return [
|
|||
]
|
||||
],
|
||||
'x-frame-options' => 'SAMEORIGIN',
|
||||
'MAGE_MODE' => 'default',
|
||||
'MAGE_MODE' => 'developer',
|
||||
'session' => [
|
||||
'save' => 'files'
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
@import url("https://use.typekit.net/onr8tbr.css");@media (prefers-color-scheme:dark){table{border-collapse:collapse;margin:0 auto}a,a:visited{color:#1473e6;text-decoration:none}.legal a{text-decoration:underline}a[x-apple-data-detectors]{color:inherit !important;font-family:inherit !important;font-size:inherit !important;font-weight:inherit !important;line-height:inherit !important;text-decoration:none !important}}@media only screen and (max-width:480px){u~div{min-width:100vw}div>u~div{min-width:100%}.email-width,.email-width-400{width:84% !important}.full-width{width:100% !important}}.full-width{width:600px}.email-width{width:500px}.email-width-400{width:400px}.width-100{width:100%}.background-grey{background-color:#e4e4e4}.background-light{background-color:#f5f5f5}.padding-top-0{padding-top:0 !important}.padding-top-25{padding-top:25px}.padding-top-40{padding-top:40px}.padding-top-50{padding-top:40px}.email-body{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;background-color:#e4e4e4;margin:0;padding:0;width:100% !important}.email-preview{color:#e4e4e4;display:none;font-size:1px;overflow:hidden;visibility:hidden}.email-header-container{background-color:#fff;border-top:4px solid #eb1000;padding-bottom:60px}.email-logo{color:#eb1000;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:12px;line-height:18px}.email-logo img{color:#eb1000;display:block;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:12px;height:50px;line-height:18px;vertical-align:top}.email-footer-legal{color:#959595;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:16px;line-height:32px;padding-top:60px}.email-footer-legal a{color:#959595;text-decoration:underline}.email-footer-copyright{color:#959595;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:11px;line-height:18px;padding-bottom:50px;padding-top:50px}.email-subject{color:#000;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:23px;line-height:30px;padding-top:50px}.email-text{color:#2c2c2c;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:18px;line-height:26px;padding-top:25px}.cta-button-container{color:#1473e6;font-family:adobe-clean,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;font-size:16px;line-height:20px;padding-bottom:40px;padding-top:40px}.cta-button{-webkit-text-size-adjust:none;background-color:#1473e6;border-radius:20px;color:#fff;display:inline-block;font-size:16px;line-height:40px;text-align:center;text-decoration:none;width:200px}.cta-button-mso{font-size:0;line-height:0;margin:0}.email-information-link{color:#1473e6;text-decoration:none}
|
||||
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 5.7 MiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 954 KiB |
|
|
@ -1,16 +0,0 @@
|
|||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-global.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-medium.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-large.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-light.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-lightest.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-dark.css';
|
||||
@import 'node_modules/@spectrum-css/vars/dist/spectrum-darkest.css';
|
||||
@import 'node_modules/@spectrum-css/page/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/icon/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/button/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/dialog/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/link/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/modal/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/card/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/typography/dist/index-vars.css';
|
||||
@import 'node_modules/@spectrum-css/inlinealert/dist/index-vars.css';
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'underscore',
|
||||
'Magento_AdminAdobeIms/js/loadicons'
|
||||
], function ($, _, loadicons) {
|
||||
'use strict';
|
||||
|
||||
var icons = {},
|
||||
|
||||
loadIcons = {
|
||||
/**
|
||||
* loadicons initialization
|
||||
*/
|
||||
init: function () {
|
||||
loadicons(icons.spectrumCssIcons);
|
||||
loadicons(icons.spectrumIcons);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} iconUrls
|
||||
* @constructor
|
||||
*/
|
||||
'Magento_AdminAdobeIms/js/admin_adobe_ims_load_icons': function (iconUrls) {
|
||||
icons = iconUrls;
|
||||
loadIcons.init();
|
||||
}
|
||||
};
|
||||
|
||||
return loadIcons;
|
||||
});
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'uiComponent',
|
||||
'jquery',
|
||||
'Magento_AdobeIms/js/action/authorization'
|
||||
], function (Component, $, login) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
defaults: {
|
||||
loginConfig: {
|
||||
url: 'https://ims-na1-stg.adobelogin.com/ims/authorize',
|
||||
callbackParsingParams: {
|
||||
regexpPattern: /auth\[code=(success|error);message=(.+)\]/,
|
||||
codeIndex: 1,
|
||||
messageIndex: 2,
|
||||
nameIndex: 3,
|
||||
successCode: 'success',
|
||||
errorCode: 'error'
|
||||
},
|
||||
popupWindowParams: {
|
||||
width: 500,
|
||||
height: 600,
|
||||
top: 100,
|
||||
left: 300
|
||||
},
|
||||
popupWindowTimeout: 60000
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super();
|
||||
this.login();
|
||||
},
|
||||
|
||||
/**
|
||||
* Open popup for Adobe reauth
|
||||
*
|
||||
* @return {window.Promise}
|
||||
*/
|
||||
login: function () {
|
||||
var deferred = $.Deferred(),
|
||||
loginConfig = this.loginConfig;
|
||||
|
||||
$('input.ims_verification').on('click', function () {
|
||||
login(loginConfig)
|
||||
.then(function (response) {
|
||||
if (response.isAuthorized === true) {
|
||||
$('input.ims_verified').val(true);
|
||||
}
|
||||
deferred.resolve(response);
|
||||
})
|
||||
.fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
Copyright 2018 Adobe. All rights reserved.
|
||||
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License. You may obtain a copy
|
||||
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed under
|
||||
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
||||
OF ANY KIND, either express or implied. See the License for the specific language
|
||||
governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
// UMD pattern via umdjs
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD
|
||||
define([], factory);
|
||||
}
|
||||
else if (typeof module === 'object' && module.exports) {
|
||||
// CommonJS-like
|
||||
module.exports = factory();
|
||||
}
|
||||
else {
|
||||
// Browser
|
||||
root.loadIcons = factory();
|
||||
}
|
||||
}(typeof self !== 'undefined' ? self : this, function() {
|
||||
function handleError(string) {
|
||||
string = 'loadIcons: '+string;
|
||||
var error = new Error(string);
|
||||
|
||||
console.error(error.toString());
|
||||
|
||||
if (typeof callback === 'function') {
|
||||
callback(error);
|
||||
}
|
||||
}
|
||||
|
||||
function injectSVG(svgURL, callback) {
|
||||
var error;
|
||||
// 200 for web servers, 0 for CEP panels
|
||||
if (this.status !== 200 && this.status !== 0) {
|
||||
handleError('Failed to fetch icons, server returned ' + this.status);
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse the SVG
|
||||
var parser = new DOMParser();
|
||||
try {
|
||||
var doc = parser.parseFromString(this.responseText, 'image/svg+xml');
|
||||
var svg = doc.firstChild;
|
||||
}
|
||||
catch (err) {
|
||||
handleError('Error parsing SVG: ' + err);
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure a real SVG was returned
|
||||
if (svg && svg.tagName === 'svg') {
|
||||
// Hide the element
|
||||
svg.style.display = 'none';
|
||||
|
||||
svg.setAttribute('data-url', svgURL);
|
||||
|
||||
// Insert it into the head
|
||||
document.head.insertBefore(svg, null);
|
||||
|
||||
// Pass the SVG to the callback
|
||||
if (typeof callback === 'function') {
|
||||
callback(null, svg);
|
||||
}
|
||||
}
|
||||
else {
|
||||
handleError('Parsed SVG document contained something other than an SVG');
|
||||
}
|
||||
}
|
||||
|
||||
function loadIcons(svgURL, callback) {
|
||||
// Request the SVG sprite
|
||||
var req = new XMLHttpRequest();
|
||||
req.open('GET', svgURL, true);
|
||||
req.addEventListener('load', injectSVG.bind(req, svgURL, callback));
|
||||
req.addEventListener('error', function(event) {
|
||||
handleError('Request failed');
|
||||
});
|
||||
req.send();
|
||||
}
|
||||
|
||||
return loadIcons;
|
||||
}));
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"name": "magento_adminadobeims",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
|
||||
"@spectrum-css/actionbutton": "^1.1.5",
|
||||
"@spectrum-css/asset": "^3.0.13",
|
||||
"@spectrum-css/button": "^6.0.3",
|
||||
"@spectrum-css/buttongroup": "^5.0.3",
|
||||
"@spectrum-css/card": "^4.0.12",
|
||||
"@spectrum-css/checkbox": "^3.0.14",
|
||||
"@spectrum-css/closebutton": "^1.2.2",
|
||||
"@spectrum-css/dialog": "^6.0.2",
|
||||
"@spectrum-css/divider": "^1.0.16",
|
||||
"@spectrum-css/icon": "^3.0.14",
|
||||
"@spectrum-css/inlinealert": "^4.0.3",
|
||||
"@spectrum-css/link": "^3.1.17",
|
||||
"@spectrum-css/modal": "^3.0.13",
|
||||
"@spectrum-css/page": "^5.0.2",
|
||||
"@spectrum-css/quickaction": "^3.0.16",
|
||||
"@spectrum-css/typography": "^4.0.11",
|
||||
"@spectrum-css/underlay": "^2.0.22",
|
||||
"@spectrum-css/vars": "^6.1.1",
|
||||
"loadicons": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cssnano": "^5.0.17",
|
||||
"postcss": "^8.4.7",
|
||||
"postcss-cli": "^9.1.0",
|
||||
"postcss-dropunusedvars": "^1.2.1",
|
||||
"postcss-import": "^14.0.2",
|
||||
"postcss-varfallback": "^1.1.1"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
module.exports = {
|
||||
plugins: [
|
||||
require('postcss-import'),
|
||||
require('postcss-varfallback'),
|
||||
require('postcss-dropunusedvars'),
|
||||
require('cssnano')
|
||||
]
|
||||
};
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<button
|
||||
class="adobe-sign-in-button"
|
||||
id="adobeImsSignIn"
|
||||
data-role="signInBtn"
|
||||
data-bind="click: login"
|
||||
type="button">
|
||||
<span>Sign In</span>
|
||||
</button>
|
||||
|
|
@ -1,187 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'underscore',
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/modal-component',
|
||||
'uiRegistry',
|
||||
'analyticsPopupConfig'
|
||||
],
|
||||
function (_, $, Modal, registry, analyticsPopupConfig) {
|
||||
'use strict';
|
||||
|
||||
return Modal.extend(
|
||||
{
|
||||
defaults: {
|
||||
imports: {
|
||||
enableLogAction: '${ $.provider }:data.enableLogAction',
|
||||
disableLogAction: '${ $.provider }:data.disableLogAction'
|
||||
},
|
||||
options: {},
|
||||
notificationWindow: null
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes modal on opened function
|
||||
*/
|
||||
initModal: function () {
|
||||
this.options.opened = this.onOpened.bind(this);
|
||||
this._super();
|
||||
},
|
||||
|
||||
/**
|
||||
* Configure ESC and TAB so user can't leave modal
|
||||
* without selecting an option
|
||||
*
|
||||
* @returns {Object} Chainable.
|
||||
*/
|
||||
initModalEvents: function () {
|
||||
this._super();
|
||||
//Don't allow ESC key to close modal
|
||||
this.options.keyEventHandlers.escapeKey = this.handleEscKey.bind(this);
|
||||
//Restrict tab action to the modal
|
||||
this.options.keyEventHandlers.tabKey = this.handleTabKey.bind(this);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Once the modal is opened it hides the X
|
||||
*/
|
||||
onOpened: function () {
|
||||
$('.modal-header button.action-close').attr('disabled', true).hide();
|
||||
|
||||
this.focusableElements = $(this.rootSelector).find('a[href], button:enabled');
|
||||
this.firstFocusableElement = this.focusableElements[0];
|
||||
this.lastFocusableElement = this.focusableElements[this.focusableElements.length - 1];
|
||||
this.firstFocusableElement.focus();
|
||||
},
|
||||
|
||||
/**
|
||||
* Changes admin usage setting to yes
|
||||
*/
|
||||
enableAdminUsage: function () {
|
||||
var data = {
|
||||
'form_key': window.FORM_KEY
|
||||
};
|
||||
|
||||
$.ajax(
|
||||
{
|
||||
type: 'POST',
|
||||
url: this.enableLogAction,
|
||||
data: data,
|
||||
showLoader: true
|
||||
}
|
||||
).done(
|
||||
function (xhr) {
|
||||
if (xhr.error) {
|
||||
self.onError(xhr);
|
||||
}
|
||||
}
|
||||
).fail(this.onError);
|
||||
this.openReleasePopup();
|
||||
this.closeModal();
|
||||
},
|
||||
|
||||
/**
|
||||
* Changes admin usage setting to no
|
||||
*/
|
||||
disableAdminUsage: function () {
|
||||
var data = {
|
||||
'form_key': window.FORM_KEY
|
||||
};
|
||||
|
||||
$.ajax(
|
||||
{
|
||||
type: 'POST',
|
||||
url: this.disableLogAction,
|
||||
data: data,
|
||||
showLoader: true
|
||||
}
|
||||
).done(
|
||||
function (xhr) {
|
||||
if (xhr.error) {
|
||||
self.onError(xhr);
|
||||
}
|
||||
}
|
||||
).fail(this.onError);
|
||||
this.openReleasePopup();
|
||||
this.closeModal();
|
||||
},
|
||||
|
||||
/**
|
||||
* Allows admin usage popup to be shown first and then new release notification
|
||||
*/
|
||||
openReleasePopup: function () {
|
||||
var notificationModalSelector = 'release_notification.release_notification.notification_modal_1';
|
||||
|
||||
if (analyticsPopupConfig.releaseVisible) {
|
||||
registry.get(notificationModalSelector).initializeContentAfterAnalytics();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle Tab and Shift+Tab key event
|
||||
*
|
||||
* Keep the tab actions restricted to the popup modal
|
||||
* so the user must select an option to dismiss the modal
|
||||
*/
|
||||
handleTabKey: function (event) {
|
||||
var modal = this,
|
||||
KEY_TAB = 9;
|
||||
|
||||
/**
|
||||
* Handle Shift+Tab to tab backwards
|
||||
*/
|
||||
function handleBackwardTab() {
|
||||
if (document.activeElement === modal.firstFocusableElement ||
|
||||
document.activeElement === $(modal.rootSelector)[0]
|
||||
) {
|
||||
event.preventDefault();
|
||||
modal.lastFocusableElement.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Tab forward
|
||||
*/
|
||||
function handleForwardTab() {
|
||||
if (document.activeElement === modal.lastFocusableElement) {
|
||||
event.preventDefault();
|
||||
modal.firstFocusableElement.focus();
|
||||
}
|
||||
}
|
||||
|
||||
switch (event.keyCode) {
|
||||
case KEY_TAB:
|
||||
if (modal.focusableElements.length === 1) {
|
||||
event.preventDefault();
|
||||
break;
|
||||
}
|
||||
|
||||
if (event.shiftKey) {
|
||||
handleBackwardTab();
|
||||
break;
|
||||
}
|
||||
handleForwardTab();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle Esc key
|
||||
*
|
||||
* Esc key should not close modal
|
||||
*/
|
||||
handleEscKey: function (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define(['jquery', 'analyticsPopupConfig'], function ($, analyticsPopupConfig) {
|
||||
'use strict';
|
||||
|
||||
var deferred = $.Deferred(),
|
||||
|
||||
mixin = {
|
||||
/**
|
||||
* Initializes content only if its visible
|
||||
*/
|
||||
initializeContent: function () {
|
||||
var initializeContent = this._super.bind(this);
|
||||
|
||||
if (!analyticsPopupConfig.analyticsVisible) {
|
||||
initializeContent();
|
||||
} else {
|
||||
deferred.then(function () {
|
||||
initializeContent();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes release notification content after admin analytics
|
||||
*/
|
||||
initializeContentAfterAnalytics: function () {
|
||||
deferred.resolve();
|
||||
}
|
||||
};
|
||||
|
||||
return function (target) {
|
||||
return target.extend(mixin);
|
||||
};
|
||||
});
|
||||
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'Magento_Ui/js/grid/columns/column',
|
||||
'underscore'
|
||||
], function (Column, _) {
|
||||
'use strict';
|
||||
|
||||
return Column.extend({
|
||||
defaults: {
|
||||
bodyTmpl: 'Magento_AdminNotification/grid/cells/message',
|
||||
messageIndex: 'text',
|
||||
fieldClass: {
|
||||
message: true,
|
||||
'message-warning': false,
|
||||
'message-progress': false,
|
||||
'message-success': false,
|
||||
'message-error': false
|
||||
},
|
||||
statusMap: {
|
||||
0: 'info',
|
||||
1: 'progress',
|
||||
2: 'success',
|
||||
3: 'error'
|
||||
}
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
getLabel: function (record) {
|
||||
return record[this.messageIndex];
|
||||
},
|
||||
|
||||
/**
|
||||
* Proxy to getLabel function with UnsanitizedHtml suffix
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns {String}
|
||||
*/
|
||||
getLabelUnsanitizedHtml: function (record) {
|
||||
return this.getLabel(record);
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
getFieldClass: function ($row) {
|
||||
var status = this.statusMap[$row.status] || 'warning',
|
||||
result = {};
|
||||
|
||||
result['message-' + status] = true;
|
||||
result = _.extend({}, this.fieldClass, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'Magento_Ui/js/grid/listing',
|
||||
'Magento_Ui/js/lib/spinner',
|
||||
'jquery'
|
||||
], function (Listing, loader, $) {
|
||||
'use strict';
|
||||
|
||||
return Listing.extend({
|
||||
defaults: {
|
||||
imports: {
|
||||
totalRecords: '${ $.provider }:data.totalRecords'
|
||||
},
|
||||
selectors: {
|
||||
collapsible: '.message-system-collapsible',
|
||||
messages: '.message-system'
|
||||
}
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.track({
|
||||
totalRecords: 0
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
showLoader: function () {
|
||||
if (!this.source.firstLoad) {
|
||||
this.fixLoaderHeight();
|
||||
this._super();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates loader height
|
||||
*
|
||||
* @param {Boolean} [closed]
|
||||
*/
|
||||
fixLoaderHeight: function (closed) {
|
||||
var $messagesBlock = $(this.selectors.messages),
|
||||
$collapsibleBlock = $(this.selectors.collapsible),
|
||||
resultHeight = 0;
|
||||
|
||||
if ($messagesBlock.length) {
|
||||
resultHeight += $messagesBlock.outerHeight();
|
||||
}
|
||||
|
||||
if ($collapsibleBlock.length && $collapsibleBlock.is(':visible') && !closed) {
|
||||
resultHeight += $collapsibleBlock.outerHeight();
|
||||
}
|
||||
|
||||
loader.get(this.name).height(resultHeight);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/modal'
|
||||
], function ($, modal) {
|
||||
'use strict';
|
||||
|
||||
return function (data, element) {
|
||||
|
||||
if (modal.modal) {
|
||||
modal.modal.html($(element).html());
|
||||
} else {
|
||||
modal.modal = $(element).modal({
|
||||
modalClass: data.class,
|
||||
type: 'popup',
|
||||
buttons: []
|
||||
});
|
||||
}
|
||||
|
||||
modal.modal.modal('openModal');
|
||||
};
|
||||
});
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'mage/template',
|
||||
'jquery/ui',
|
||||
'Magento_Ui/js/modal/modal'
|
||||
], function ($, mageTemplate) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.systemMessageDialog', $.mage.modal, {
|
||||
options: {
|
||||
modalClass: 'modal-system-messages',
|
||||
systemMessageTemplate:
|
||||
'<% _.each(data.items, function(item) { %>' +
|
||||
'<li class="message message-warning' +
|
||||
'<% if (item.severity == 1) { %>error<% } else { %>warning<% } %>">' +
|
||||
'<%= item.text %>' +
|
||||
'</li>' +
|
||||
'<% }); %>'
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
_create: function () {
|
||||
this.options.title = $('#message-system-all').attr('title');
|
||||
this._super();
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
openModal: function (severity) {
|
||||
var superMethod = $.proxy(this._super, this);
|
||||
|
||||
$.ajax({
|
||||
url: this.options.ajaxUrl,
|
||||
type: 'GET',
|
||||
data: {
|
||||
severity: severity
|
||||
}
|
||||
}).done($.proxy(function (data) {
|
||||
var tmpl = mageTemplate(this.options.systemMessageTemplate, {
|
||||
data: {
|
||||
items: data
|
||||
}
|
||||
});
|
||||
|
||||
tmpl = $(tmpl);
|
||||
|
||||
this.element.html(
|
||||
$('<ul></ul>', {
|
||||
'class': 'message-system-list'
|
||||
}).append(tmpl)
|
||||
).trigger('contentUpdated');
|
||||
|
||||
superMethod();
|
||||
}, this));
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
closeModal: function () {
|
||||
this._super();
|
||||
}
|
||||
});
|
||||
|
||||
$(function () {
|
||||
$('#system_messages .message-system-short .error').on('click', function () {
|
||||
$('#message-system-all').systemMessageDialog('openModal', 1);
|
||||
});
|
||||
|
||||
$('#system_messages .message-system-short .warning').on('click', function () {
|
||||
$('#message-system-all').systemMessageDialog('openModal', 2);
|
||||
});
|
||||
});
|
||||
|
||||
return $.mage.systemMessageDialog;
|
||||
});
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div css="$col.getFieldClass($row())"
|
||||
html="$col.getLabelUnsanitizedHtml($row())"></div>
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div id="system_messages" class="message-system" collapsible visible="totalRecords">
|
||||
<div class="message-system-inner" outerClick="fixLoaderHeight.bind($data, true)">
|
||||
<div class="message-system-short">
|
||||
<button class="message-system-action-dropdown" toggleCollapsible>
|
||||
<span>
|
||||
<translate args="'System Messages'"></translate>:
|
||||
<text args="totalRecords"></text>
|
||||
</span>
|
||||
</button>
|
||||
<div class="message-system-short-wrapper" if="rows[0]" repeat="foreach: [rows[0]], item: '$row'" visible="!$collapsible.opened()">
|
||||
<fastForEach args="data: getVisible(), as: '$col'" >
|
||||
<render args="$col.getBody()"></render>
|
||||
</fastForEach>
|
||||
</div>
|
||||
</div>
|
||||
<div class="message-system-collapsible">
|
||||
<ul class="message-system-list">
|
||||
<li repeat="foreach: rows, item: '$row'">
|
||||
<fastForEach args="data: getVisible(), as: '$col'" >
|
||||
<render args="$col.getBody()"></render>
|
||||
</fastForEach>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,121 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'jquery/ui',
|
||||
'domReady!'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Mark notification as read via AJAX call.
|
||||
*
|
||||
* @param {String} notificationId
|
||||
*/
|
||||
var markNotificationAsRead = function (notificationId) {
|
||||
var requestUrl = $('.notifications-wrapper .admin__action-dropdown-menu').attr('data-mark-as-read-url');
|
||||
|
||||
$.ajax({
|
||||
url: requestUrl,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
id: notificationId
|
||||
},
|
||||
showLoader: false
|
||||
});
|
||||
},
|
||||
notificationCount = $('.notifications-wrapper').attr('data-notification-count'),
|
||||
|
||||
/**
|
||||
* Remove notification from the list.
|
||||
*
|
||||
* @param {jQuery} notificationEntry
|
||||
*/
|
||||
removeNotificationFromList = function (notificationEntry) {
|
||||
var notificationIcon, actionElement;
|
||||
|
||||
notificationEntry.remove();
|
||||
notificationCount--;
|
||||
$('.notifications-wrapper').attr('data-notification-count', notificationCount);
|
||||
|
||||
if (notificationCount == 0) {// eslint-disable-line eqeqeq
|
||||
// Change appearance of the bubble and its behavior when the last notification is removed
|
||||
$('.notifications-wrapper .admin__action-dropdown-menu').remove();
|
||||
notificationIcon = $('.notifications-wrapper .notifications-icon');
|
||||
notificationIcon.removeAttr('data-toggle');
|
||||
notificationIcon.off('click.dropdown');
|
||||
$('.notifications-action .notifications-counter').text('').hide();
|
||||
} else {
|
||||
// Change top counter only for allowable range
|
||||
if (notificationCount <= 99) {
|
||||
$('.notifications-action .notifications-counter').text(notificationCount);
|
||||
}
|
||||
$('.notifications-entry-last .notifications-counter').text(notificationCount);
|
||||
// Modify caption of the 'See All' link
|
||||
actionElement = $('.notifications-wrapper .admin__action-dropdown-menu .last .action-more');
|
||||
actionElement.text(actionElement.text().replace(/\d+/, notificationCount));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Show notification details.
|
||||
*
|
||||
* @param {jQuery} notificationEntry
|
||||
*/
|
||||
showNotificationDetails = function (notificationEntry) {
|
||||
var notificationDescription = notificationEntry.find('.notifications-entry-description'),
|
||||
notificationDescriptionEnd = notificationEntry.find('.notifications-entry-description-end');
|
||||
|
||||
if (notificationDescriptionEnd.length > 0) {
|
||||
notificationDescriptionEnd.addClass('_show');
|
||||
}
|
||||
|
||||
if (notificationDescription.hasClass('_cutted')) {
|
||||
notificationDescription.removeClass('_cutted');
|
||||
}
|
||||
};
|
||||
|
||||
// Show notification description when corresponding item is clicked
|
||||
$('.notifications-wrapper .admin__action-dropdown-menu .notifications-entry').on(
|
||||
'click.showNotification',
|
||||
function (event) {
|
||||
// hide notification dropdown
|
||||
$('.notifications-wrapper .notifications-icon').trigger('click.dropdown');
|
||||
|
||||
showNotificationDetails($(this));
|
||||
event.stopPropagation();
|
||||
}
|
||||
);
|
||||
|
||||
// Remove corresponding notification from the list and mark it as read
|
||||
$('.notifications-close').on('click.removeNotification', function (event) {
|
||||
var notificationEntry = $(this).closest('.notifications-entry'),
|
||||
notificationId = notificationEntry.attr('data-notification-id');
|
||||
|
||||
markNotificationAsRead(notificationId);
|
||||
removeNotificationFromList(notificationEntry);
|
||||
|
||||
// Checking for last unread notification to hide dropdown
|
||||
if (notificationCount == 0) {// eslint-disable-line eqeqeq
|
||||
$('.notifications-wrapper').removeClass('active')
|
||||
.find('.notifications-action')
|
||||
.removeAttr('data-toggle')
|
||||
.off('click.dropdown');
|
||||
}
|
||||
event.stopPropagation();
|
||||
});
|
||||
|
||||
// Hide notifications bubble
|
||||
if (notificationCount == 0) {// eslint-disable-line eqeqeq
|
||||
$('.notifications-action .notifications-counter').hide();
|
||||
} else {
|
||||
$('.notifications-action .notifications-counter').show();
|
||||
}
|
||||
});
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Build window params
|
||||
* @param {Object} windowParams
|
||||
* @returns {String}
|
||||
*/
|
||||
function buildWindowParams(windowParams) {
|
||||
var output = '',
|
||||
coma = '',
|
||||
paramName,
|
||||
paramValue;
|
||||
|
||||
for (paramName in windowParams) {
|
||||
if (windowParams[paramName]) {
|
||||
paramValue = windowParams[paramName];
|
||||
output += coma + paramName + '=' + paramValue;
|
||||
coma = ',';
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
return function (config) {
|
||||
var authWindow,
|
||||
deferred = $.Deferred(),
|
||||
watcherId,
|
||||
stopWatcherId;
|
||||
|
||||
/**
|
||||
* Close authorization window if already opened
|
||||
*/
|
||||
if (window.adobeIMSAuthWindow) {
|
||||
window.adobeIMSAuthWindow.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens authorization window with special parameters
|
||||
*/
|
||||
authWindow = window.adobeIMSAuthWindow = window.open(
|
||||
config.url,
|
||||
'authorization_widnow',
|
||||
buildWindowParams(
|
||||
config.popupWindowParams || {
|
||||
width: 500,
|
||||
height: 300
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
* Stop handle
|
||||
*/
|
||||
function stopHandle() {
|
||||
// Clear timers
|
||||
clearTimeout(stopWatcherId);
|
||||
clearInterval(watcherId);
|
||||
|
||||
// Close window
|
||||
authWindow.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start handle
|
||||
*/
|
||||
function startHandle() {
|
||||
var responseData;
|
||||
|
||||
try {
|
||||
|
||||
if (authWindow.document.domain !== document.domain ||
|
||||
authWindow.document.readyState !== 'complete') {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* If within 10 seconds the result is not received, then reject the request
|
||||
*/
|
||||
stopWatcherId = setTimeout(function () {
|
||||
stopHandle();
|
||||
deferred.reject(new Error('Time\'s up.'));
|
||||
}, config.popupWindowTimeout || 60000);
|
||||
|
||||
responseData = authWindow.document.body.innerHTML.match(
|
||||
config.callbackParsingParams.regexpPattern
|
||||
);
|
||||
|
||||
if (!responseData) {
|
||||
return;
|
||||
}
|
||||
|
||||
stopHandle();
|
||||
|
||||
if (responseData[config.callbackParsingParams.codeIndex] ===
|
||||
config.callbackParsingParams.successCode) {
|
||||
deferred.resolve({
|
||||
isAuthorized: true,
|
||||
lastAuthSuccessMessage: responseData[config.callbackParsingParams.messageIndex]
|
||||
});
|
||||
} else {
|
||||
deferred.reject(responseData[config.callbackParsingParams.messageIndex]);
|
||||
}
|
||||
} catch (e) {
|
||||
if (authWindow.closed) {
|
||||
clearTimeout(stopWatcherId);
|
||||
clearInterval(watcherId);
|
||||
|
||||
// eslint-disable-next-line max-depth
|
||||
if (window.adobeIMSAuthWindow && window.adobeIMSAuthWindow.closed) {
|
||||
deferred.reject(new Error('Authentication window was closed.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Watch a result 1 time per second
|
||||
*/
|
||||
watcherId = setInterval(startHandle, 1000);
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
loginUrl: 'https://ims-na1.adobelogin.com/ims/authorize',
|
||||
profileUrl: 'adobe_ims/user/profile',
|
||||
logoutUrl: 'adobe_ims/user/logout',
|
||||
manageAccountLink: 'https://account.adobe.com/',
|
||||
login: {
|
||||
callbackParsingParams: {
|
||||
regexpPattern: /auth\[code=(success|error);message=(.+)\]/,
|
||||
codeIndex: 1,
|
||||
messageIndex: 2,
|
||||
nameIndex: 3,
|
||||
successCode: 'success',
|
||||
errorCode: 'error'
|
||||
},
|
||||
popupWindowParams: {
|
||||
width: 500,
|
||||
height: 600,
|
||||
top: 100,
|
||||
left: 300
|
||||
},
|
||||
popupWindowTimeout: 10000
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'uiComponent',
|
||||
'jquery',
|
||||
'Magento_AdobeIms/js/action/authorization'
|
||||
], function (Component, $, login) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
|
||||
defaults: {
|
||||
profileUrl: 'adobe_ims/user/profile',
|
||||
logoutUrl: 'adobe_ims/user/logout',
|
||||
user: {
|
||||
isAuthorized: false,
|
||||
name: '',
|
||||
email: '',
|
||||
image: ''
|
||||
},
|
||||
loginConfig: {
|
||||
url: 'https://ims-na1.adobelogin.com/ims/authorize',
|
||||
callbackParsingParams: {
|
||||
regexpPattern: /auth\[code=(success|error);message=(.+)\]/,
|
||||
codeIndex: 1,
|
||||
messageIndex: 2,
|
||||
nameIndex: 3,
|
||||
successCode: 'success',
|
||||
errorCode: 'error'
|
||||
},
|
||||
popupWindowParams: {
|
||||
width: 500,
|
||||
height: 600,
|
||||
top: 100,
|
||||
left: 300
|
||||
},
|
||||
popupWindowTimeout: 60000
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super().observe(['user']);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Login to Adobe
|
||||
*
|
||||
* @return {window.Promise}
|
||||
*/
|
||||
login: function () {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
if (this.user().isAuthorized) {
|
||||
deferred.resolve();
|
||||
}
|
||||
login(this.loginConfig)
|
||||
.then(function (response) {
|
||||
this.loadUserProfile();
|
||||
deferred.resolve(response);
|
||||
}.bind(this))
|
||||
.fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieve data to authorized user.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
loadUserProfile: function () {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: this.profileUrl,
|
||||
showLoader: true,
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns void
|
||||
*/
|
||||
success: function (response) {
|
||||
this.user({
|
||||
isAuthorized: true,
|
||||
name: response.result.name,
|
||||
email: response.result.email,
|
||||
image: response.result.image
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns {String}
|
||||
*/
|
||||
error: function (response) {
|
||||
return response.message;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Logout from adobe account
|
||||
*/
|
||||
logout: function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: this.logoutUrl,
|
||||
data: {
|
||||
'form_key': window.FORM_KEY
|
||||
},
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
showLoader: true,
|
||||
success: function () {
|
||||
this.user({
|
||||
isAuthorized: false,
|
||||
name: '',
|
||||
email: '',
|
||||
image: ''
|
||||
});
|
||||
}.bind(this),
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns {String}
|
||||
*/
|
||||
error: function (response) {
|
||||
return response.message;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define(['ko'], function (ko) {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
isAuthorized: ko.observable(false),
|
||||
name: ko.observable(''),
|
||||
email: ko.observable('')
|
||||
};
|
||||
});
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<button
|
||||
class="adobe-sign-in-button"
|
||||
id="adobeImsSignIn"
|
||||
data-role="signInBtn"
|
||||
data-bind="click: login, visible: !user().isAuthorized"
|
||||
type="button">
|
||||
<span>Sign In</span>
|
||||
</button>
|
||||
<div class="adobe-user-information">
|
||||
<div class="admin__action-dropdown-wrap" data-bind="collapsible">
|
||||
<img class="adobe-profile-image-small"
|
||||
attr="src: user().image"
|
||||
data-bind="visible: user().isAuthorized"/>
|
||||
<button
|
||||
type="button"
|
||||
data-toggle="dropdown"
|
||||
class="adobe-user-name admin__action-dropdown"
|
||||
data-bind="visible: user().isAuthorized, toggleCollapsible">
|
||||
<span><!--ko text: user().name--><!--/ko--></span>
|
||||
</button>
|
||||
<ul class="admin__action-dropdown-menu adobe-user-popup" data-bind="visible: user().isAuthorized">
|
||||
<li>
|
||||
<img class="adobe-profile-image-large" attr="src: user().image">
|
||||
</li>
|
||||
<li class="adobe-user-info">
|
||||
<ul>
|
||||
<li><!--ko text: user().name--><!--/ko--></li>
|
||||
<li><!--ko text: user().email--><!--/ko--></li>
|
||||
<li><a target="_blank" href="https://account.adobe.com/profile">Manage Account</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<button
|
||||
class="adobe-sign-out-button"
|
||||
id="adobeImsSignOut"
|
||||
data-bind="click: logout"
|
||||
data-role="signOutBtn"
|
||||
type="button">
|
||||
<span>Sign Out</span>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'ko',
|
||||
'uiComponent',
|
||||
'jquery'
|
||||
], function (ko, Component, $) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
defaults: {
|
||||
template: 'Magento_AdobeStockAdminUi/connection',
|
||||
connectionFailedMessage: 'Connection test failed.',
|
||||
emptyApiKeyMessage: 'Please fill the "API Key (Client ID)" field for a connection test',
|
||||
apiKeyInputId: 'system_adobe_stock_integration_api_key',
|
||||
url: '',
|
||||
success: false,
|
||||
message: '',
|
||||
visible: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'success',
|
||||
'message',
|
||||
'visible'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super();
|
||||
this.messageClass = ko.computed(function () {
|
||||
return 'message-validation message message-' + (this.success() ? 'success' : 'error');
|
||||
}, this);
|
||||
|
||||
if (!this.success()) {
|
||||
this.showMessage(false, this.connectionFailedMessage);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {bool} success
|
||||
* @param {String} message
|
||||
*/
|
||||
showMessage: function (success, message) {
|
||||
this.message(message);
|
||||
this.success(success);
|
||||
this.visible(true);
|
||||
},
|
||||
|
||||
/**
|
||||
* Send request to server to test connection to Adobe Stock API and display the result
|
||||
*/
|
||||
testConnection: function () {
|
||||
var apiKey = document.getElementById(this.apiKeyInputId).value;
|
||||
|
||||
if (apiKey.length === 0) {
|
||||
this.showMessage(false, this.emptyApiKeyMessage);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this.visible(false);
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: this.url,
|
||||
dataType: 'json',
|
||||
data: {
|
||||
'api_key': apiKey
|
||||
},
|
||||
success: function (response) {
|
||||
this.showMessage(response.success === true, response.message);
|
||||
}.bind(this),
|
||||
error: function () {
|
||||
this.showMessage(false, this.connectionFailedMessage);
|
||||
}.bind(this)
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div if="visible" attr="class: messageClass" translate="message"></div>
|
||||
<button class="scalable" type="button" click="testConnection" data-ui-id="adobe-stock-integration-buttons-test-connection">
|
||||
<span text="buttonLabel"></span>
|
||||
</button>
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
return function (requestUrl, adobeAssetId) {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: requestUrl,
|
||||
dataType: 'json',
|
||||
data: {
|
||||
'media_id': adobeAssetId
|
||||
},
|
||||
showLoader: true,
|
||||
|
||||
/**
|
||||
* Extract the data from the response and resolve
|
||||
*
|
||||
* @param {Object} response
|
||||
*/
|
||||
success: function (response) {
|
||||
deferred.resolve({
|
||||
canLicense: response.result.canLicense,
|
||||
message: response.result.message
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Extract the error message and reject
|
||||
*
|
||||
* @param {Object} response
|
||||
*/
|
||||
error: function (response) {
|
||||
var message = response.JSON ? response.JSON.message
|
||||
: $.mage.__('Could not fetch licensing information.');
|
||||
|
||||
if (response.status === 403) {
|
||||
message = $.mage.__('Your admin role does not have permissions to license an image');
|
||||
}
|
||||
|
||||
deferred.reject(message);
|
||||
}
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
return function (requestUrl, ids) {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: requestUrl + '?ids=' + ids.join(','),
|
||||
data: {
|
||||
'form_key': window.FORM_KEY
|
||||
},
|
||||
showLoader: true,
|
||||
dataType: 'json',
|
||||
|
||||
/**
|
||||
* Resolve with the response result
|
||||
*
|
||||
* @param {Object} response
|
||||
*/
|
||||
success: function (response) {
|
||||
deferred.resolve(response.result);
|
||||
},
|
||||
|
||||
/**
|
||||
* Reject with the message from response
|
||||
*
|
||||
* @param {Object} response
|
||||
*/
|
||||
error: function (response) {
|
||||
var message = response.message;
|
||||
|
||||
if (response.status === 403) {
|
||||
message = $.mage.__('Your admin role does not have permissions to license an image');
|
||||
}
|
||||
|
||||
deferred.reject(message);
|
||||
}
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/save',
|
||||
'Magento_AdobeStockImageAdminUi/js/confirmation/license',
|
||||
'Magento_AdobeStockImageAdminUi/js/path-utility'
|
||||
], function ($, saveAction, licenseConfirmation, pathUtility) {
|
||||
'use strict';
|
||||
|
||||
return function (
|
||||
requestUrl,
|
||||
id,
|
||||
title,
|
||||
path,
|
||||
contentType,
|
||||
isDownloaded,
|
||||
quotaMessage,
|
||||
directoryPath
|
||||
) {
|
||||
var deferred = $.Deferred(),
|
||||
destinationPath;
|
||||
|
||||
licenseConfirmation(
|
||||
title,
|
||||
quotaMessage,
|
||||
isDownloaded,
|
||||
pathUtility.generateImageName(title, id),
|
||||
pathUtility.getImageExtension(contentType)
|
||||
).then(function (fileName) {
|
||||
|
||||
if (typeof fileName === 'undefined') {
|
||||
fileName = pathUtility.getImageNameFromPath(path);
|
||||
}
|
||||
|
||||
destinationPath = pathUtility.buildPath(directoryPath, fileName, contentType);
|
||||
|
||||
saveAction(
|
||||
requestUrl,
|
||||
id,
|
||||
destinationPath
|
||||
).then(function () {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (message) {
|
||||
deferred.reject(message);
|
||||
});
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
return function (requestUrl, adobeAssetId, destinationPath) {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: requestUrl,
|
||||
dataType: 'json',
|
||||
showLoader: true,
|
||||
data: {
|
||||
'media_id': adobeAssetId,
|
||||
'destination_path': destinationPath
|
||||
},
|
||||
|
||||
/**
|
||||
* Resolve on success
|
||||
*/
|
||||
success: function () {
|
||||
deferred.resolve();
|
||||
},
|
||||
|
||||
/**
|
||||
* Extract the error message and reject
|
||||
*
|
||||
* @param {Object} response
|
||||
*/
|
||||
error: function (response) {
|
||||
var message;
|
||||
|
||||
if (typeof response.responseJSON === 'undefined' ||
|
||||
typeof response.responseJSON.message === 'undefined'
|
||||
) {
|
||||
message = 'Could not save the asset!';
|
||||
} else {
|
||||
message = response.responseJSON.message;
|
||||
}
|
||||
deferred.reject(message);
|
||||
}
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/save',
|
||||
'Magento_AdobeStockImageAdminUi/js/confirmation/saveLicensed',
|
||||
'Magento_AdobeStockImageAdminUi/js/path-utility'
|
||||
], function ($, saveAction, saveLicensedConfirmation, pathUtility) {
|
||||
'use strict';
|
||||
|
||||
return function (requestUrl, id, title, path, contentType, directoryPath) {
|
||||
var imageName = '',
|
||||
destinationPath,
|
||||
deferred = $.Deferred();
|
||||
|
||||
if (path !== '') {
|
||||
imageName = pathUtility.getImageNameFromPath(path);
|
||||
destinationPath = pathUtility.buildPath(directoryPath, imageName, contentType);
|
||||
saveAction(
|
||||
requestUrl,
|
||||
id,
|
||||
destinationPath
|
||||
).then(function () {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (message) {
|
||||
deferred.reject(message);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
saveLicensedConfirmation(
|
||||
pathUtility.generateImageName(title, id),
|
||||
pathUtility.getImageExtension(contentType)
|
||||
).then(function (fileName) {
|
||||
destinationPath = pathUtility.buildPath(directoryPath, fileName, contentType);
|
||||
saveAction(
|
||||
requestUrl,
|
||||
id,
|
||||
destinationPath
|
||||
).then(function () {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (message) {
|
||||
deferred.reject(message);
|
||||
});
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/save',
|
||||
'Magento_AdobeStockImageAdminUi/js/confirmation/save',
|
||||
'Magento_AdobeStockImageAdminUi/js/path-utility'
|
||||
], function ($, saveAction, saveConfirmation, pathUtility) {
|
||||
'use strict';
|
||||
|
||||
return function (requestUrl, id, title, contentType, directoryPath) {
|
||||
var deferred = $.Deferred(),
|
||||
destinationPath;
|
||||
|
||||
saveConfirmation(
|
||||
pathUtility.generateImageName(title, id),
|
||||
pathUtility.getImageExtension(contentType)
|
||||
).then(function (fileName) {
|
||||
destinationPath = pathUtility.buildPath(directoryPath, fileName, contentType);
|
||||
|
||||
saveAction(
|
||||
requestUrl,
|
||||
id,
|
||||
destinationPath
|
||||
).then(function () {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,197 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'uiLayout',
|
||||
'Magento_Ui/js/grid/columns/image-preview'
|
||||
], function ($, layout, imagePreview) {
|
||||
'use strict';
|
||||
|
||||
return imagePreview.extend({
|
||||
defaults: {
|
||||
downloadImagePreviewUrl: 'adobe_stock/preview/download',
|
||||
licenseAndDownloadUrl: 'adobe_stock/license/license',
|
||||
saveLicensedAndDownloadUrl: 'adobe_stock/license/saveLicensed',
|
||||
confirmationUrl: 'adobe_stock/license/confirmation',
|
||||
relatedImagesUrl: 'adobe_stock/preview/relatedimages',
|
||||
buyCreditsUrl: 'https://stock.adobe.com/',
|
||||
mediaGallerySelector: '.media-gallery-modal:has(#search_adobe_stock)',
|
||||
adobeStockModalSelector: '.adobe-search-images-modal',
|
||||
activeMediaGallerySelector: 'aside.modal-slide.adobe-stock-modal._show',
|
||||
modules: {
|
||||
keywords: '${ $.name }_keywords',
|
||||
related: '${ $.name }_related',
|
||||
actions: '${ $.name }_actions'
|
||||
},
|
||||
viewConfig: [
|
||||
{
|
||||
component: 'Magento_AdobeStockImageAdminUi/js/components/grid/column/preview/keywords',
|
||||
name: '${ $.name }_keywords'
|
||||
},
|
||||
{
|
||||
component: 'Magento_AdobeStockImageAdminUi/js/components/grid/column/preview/related',
|
||||
name: '${ $.name }_related'
|
||||
},
|
||||
{
|
||||
component: 'Magento_AdobeStockImageAdminUi/js/components/grid/column/preview/actions',
|
||||
name: '${ $.name }_actions',
|
||||
provider: '${ $.provider }',
|
||||
mediaGallery: '${ $.mediaGalleryComponent }',
|
||||
mediaGalleryName: '${ $.mediaGalleryName }',
|
||||
mediaGalleryProvider: '${ $.mediaGalleryProvider }',
|
||||
mediaGallerySortBy: '${ $.mediaGallerySortBy }',
|
||||
mediaGallerySearchInput: '${ $.mediaGallerySearchInput }',
|
||||
mediaGalleryListingFilters: '${ $.mediaGalleryListingFilters }',
|
||||
getMediaGalleryAsset: '${ $.getMediaGalleryAsset }',
|
||||
imageEditDetailsUrl: '${ $.imageEditDetailsUrl }',
|
||||
listingPaging: '${ $.listingPaging }'
|
||||
}
|
||||
],
|
||||
listens: {
|
||||
'${ $.sortByComponentName }:applied': 'hide'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize the component
|
||||
*
|
||||
* @returns {Object}
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super().initView();
|
||||
$(window).on('fileDeleted.enhancedMediaGallery', this.reloadAdobeGrid.bind(this));
|
||||
$(window).on('folderDeleted.enhancedMediaGallery', this.reloadAdobeGrid.bind(this));
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize child components
|
||||
*
|
||||
* @returns {Object}
|
||||
*/
|
||||
initView: function () {
|
||||
layout(this.viewConfig);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get previous button disabled
|
||||
*
|
||||
* @param {Object} record
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
cannotViewPrevious: function (record) {
|
||||
return this.related().cannotViewPrevious(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get next button disabled
|
||||
*
|
||||
* @param {Object} record
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
cannotViewNext: function (record) {
|
||||
return this.related().cannotViewNext(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Return active adobe gallery selector.
|
||||
*/
|
||||
getAdobeModal: function () {
|
||||
return $(this.activeMediaGallerySelector).find(this.adobeStockModalSelector);
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
next: function (record) {
|
||||
if (this.related().selectedTab()) {
|
||||
this.related().nextRelated(record);
|
||||
|
||||
return;
|
||||
}
|
||||
this.keywords().hideAllKeywords();
|
||||
this._super(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
prev: function (record) {
|
||||
if (this.related().selectedTab()) {
|
||||
this.related().prevRelated(record);
|
||||
|
||||
return;
|
||||
}
|
||||
this.keywords().hideAllKeywords();
|
||||
this._super(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
show: function (record) {
|
||||
this.related().selectedTab(null);
|
||||
this.keywords().hideAllKeywords();
|
||||
this.displayedRecord(record);
|
||||
this._super(record);
|
||||
this.related().loadRelatedImages(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Show related image data in the preview section
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
showRelated: function (record) {
|
||||
this.keywords().hideAllKeywords();
|
||||
this.displayedRecord(record);
|
||||
this.updateHeight();
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns attributes to display under the preview image
|
||||
*
|
||||
* @returns {*[]}
|
||||
*/
|
||||
getDisplayAttributes: function () {
|
||||
if (!this.displayedRecord()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
name: 'Dimensions',
|
||||
value: this.displayedRecord().width + ' x ' + this.displayedRecord().height + ' px'
|
||||
},
|
||||
{
|
||||
name: 'File type',
|
||||
value: this.displayedRecord()['content_type'].toUpperCase()
|
||||
},
|
||||
{
|
||||
name: 'Category',
|
||||
value: this.displayedRecord().category.name || 'None'
|
||||
},
|
||||
{
|
||||
name: 'File #',
|
||||
value: this.displayedRecord().id
|
||||
}
|
||||
];
|
||||
},
|
||||
|
||||
/**
|
||||
* Reload Adobe grid after deleting image
|
||||
*/
|
||||
reloadAdobeGrid: function () {
|
||||
this.actions().source().reload({
|
||||
refresh: true
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'underscore',
|
||||
'Magento_Ui/js/grid/columns/overlay',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/getLicenseStatus'
|
||||
], function ($, _, overlay, getLicenseStatus) {
|
||||
'use strict';
|
||||
|
||||
return overlay.extend({
|
||||
defaults: {
|
||||
// eslint-disable-next-line max-len
|
||||
provider: 'name = adobe_stock_images_listing.adobe_stock_images_listing_data_source, ns = adobe_stock_images_listing',
|
||||
loginProvider: 'name = adobe-login, ns = adobe-login',
|
||||
getImagesUrl: 'adobe_stock/license/getlist',
|
||||
licensed: {},
|
||||
modules: {
|
||||
login: '${ $.loginProvider }'
|
||||
},
|
||||
listens: {
|
||||
'${ $.provider }:data.items': 'handleItemsUpdate',
|
||||
'${ $.loginProvider }:user': 'handleUserUpdate'
|
||||
},
|
||||
imports: {
|
||||
rows: '${ $.provider }:data.items'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'licensed'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the licensed data when items data is updated.
|
||||
*
|
||||
* @param {Array} items
|
||||
*/
|
||||
handleItemsUpdate: function (items) {
|
||||
var ids = this.getIds(items);
|
||||
|
||||
this.updateLicensed(ids);
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the licensed data when user data is updated.
|
||||
*/
|
||||
handleUserUpdate: function () {
|
||||
var ids = this.getIds(this.rows);
|
||||
|
||||
this.updateLicensed(ids);
|
||||
},
|
||||
|
||||
/**
|
||||
* Set Licensed images data.
|
||||
*
|
||||
* @param {Array} ids
|
||||
*/
|
||||
updateLicensed: function (ids) {
|
||||
if (!this.isUserAuthorized() || ids.length === 0) {
|
||||
this.licensed({});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
getLicenseStatus(this.getImagesUrl, ids).then(function (licensed) {
|
||||
this.licensed(licensed);
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if user is logged in and authorized
|
||||
*
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
isUserAuthorized: function () {
|
||||
return !_.isUndefined(this.login()) && this.login().user().isAuthorized;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get all ids from items array
|
||||
*
|
||||
* @param {Array} items
|
||||
* @returns {Number[]}
|
||||
*/
|
||||
getIds: function (items) {
|
||||
var ids = [];
|
||||
|
||||
items.forEach(function (record) {
|
||||
ids.push(record.id);
|
||||
});
|
||||
|
||||
return ids;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns top displacement of overlay according to image height
|
||||
*
|
||||
* @param {Object} record - Data to be preprocessed.
|
||||
* @returns {Object}
|
||||
*/
|
||||
getStyles: function (record) {
|
||||
var height = record.styles().height.replace('px', '') - 40;
|
||||
|
||||
return {
|
||||
top: height + 'px'
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* If overlay should be visible
|
||||
*
|
||||
* @param {Object} row
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
isVisible: function (row) {
|
||||
return this.licensed()[row.id];
|
||||
},
|
||||
|
||||
/**
|
||||
* Get overlay label
|
||||
*
|
||||
* @param {Object} row
|
||||
* @returns {String}
|
||||
*/
|
||||
getLabel: function (row) {
|
||||
return this.licensed()[row.id] ? 'Licensed' : '';
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,590 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'uiComponent',
|
||||
'uiRegistry',
|
||||
'jquery',
|
||||
'underscore',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/save',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/savePreview',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/saveLicensed',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/licenseAndSave',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/confirmQuota',
|
||||
'Magento_AdobeStockImageAdminUi/js/media-gallery',
|
||||
'Magento_AdobeStockImageAdminUi/js/confirmation/buyCredits',
|
||||
'Magento_AdobeStockImageAdminUi/js/action/getLicenseStatus',
|
||||
'Magento_Ui/js/modal/alert'
|
||||
], function (
|
||||
Component,
|
||||
uiRegistry,
|
||||
$,
|
||||
_,
|
||||
saveAction,
|
||||
savePreviewAction,
|
||||
saveLicensedAction,
|
||||
licenseAndSaveAction,
|
||||
confirmQuotaAction,
|
||||
mediaGallery,
|
||||
buyCreditsConfirmation,
|
||||
getLicenseStatus,
|
||||
uiAlert
|
||||
) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
defaults: {
|
||||
template: 'Magento_AdobeStockImageAdminUi/grid/column/preview/actions',
|
||||
loginProvider: 'name = adobe-login, ns = adobe-login',
|
||||
mediaGallerySelector: '.media-gallery-modal:has(#search_adobe_stock)',
|
||||
adobeStockModalSelector: '.adobe-search-images-modal',
|
||||
downloadImagePreviewUrl: 'adobe_stock/preview/download',
|
||||
licenseAndDownloadUrl: 'adobe_stock/license/license',
|
||||
saveLicensedAndDownloadUrl: 'adobe_stock/license/saveLicensed',
|
||||
buyCreditsUrl: 'https://stock.adobe.com/',
|
||||
messageDelay: 5,
|
||||
mediaGallery: '',
|
||||
imageItems: [],
|
||||
messages: [],
|
||||
listens: {
|
||||
'${ $.provider }:data.items': 'updateActions'
|
||||
},
|
||||
modules: {
|
||||
login: '${ $.loginProvider }',
|
||||
preview: '${ $.parentName }.preview',
|
||||
overlay: '${ $.parentName }.overlay',
|
||||
source: '${ $.provider }',
|
||||
imageDirectory: '${ $.mediaGalleryName }',
|
||||
mediaGallerySortBy: '${ $.mediaGallerySortBy }',
|
||||
mediaGallerySearchInput: '${ $.mediaGallerySearchInput }',
|
||||
mediaGalleryListingFilters: '${ $.mediaGalleryListingFilters }',
|
||||
listingPaging: '${ $.listingPaging }'
|
||||
},
|
||||
imports: {
|
||||
imageItems: '${ $.mediaGalleryProvider }:data.items'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
*
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'imageItems',
|
||||
'messages'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update displayed record data on data source update
|
||||
*/
|
||||
updateActions: function () {
|
||||
var displayedRecord = this.preview().displayedRecord(),
|
||||
updatedDisplayedRecord = this.preview().displayedRecord(),
|
||||
records = this.source().data.items,
|
||||
index;
|
||||
|
||||
if (typeof displayedRecord.id === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
for (index = 0; index < records.length; index++) {
|
||||
if (records[index].id === displayedRecord.id) {
|
||||
updatedDisplayedRecord = records[index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.preview().displayedRecord(updatedDisplayedRecord);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns is_downloaded flag as observable for given record
|
||||
*
|
||||
* @returns {observable}
|
||||
*/
|
||||
isDownloaded: function () {
|
||||
return this.preview().displayedRecord()['is_downloaded'];
|
||||
},
|
||||
|
||||
/**
|
||||
* Is asset licensed in adobe stock in context of currently logged in account
|
||||
*
|
||||
* @returns {observable}
|
||||
*/
|
||||
isLicensed: function () {
|
||||
return this.overlay().licensed()[this.preview().displayedRecord().id] && !this.isLicensedLocally();
|
||||
},
|
||||
|
||||
/**
|
||||
* Is licensed version of asset saved locally
|
||||
*
|
||||
* @returns {observable}
|
||||
*/
|
||||
isLicensedLocally: function () {
|
||||
return this.preview().displayedRecord()['is_licensed_locally'];
|
||||
},
|
||||
|
||||
/**
|
||||
* Locate downloaded image in media browser
|
||||
*/
|
||||
openInMediaGalleryClick: function () {
|
||||
this.preview().getAdobeModal().trigger('closeModal');
|
||||
|
||||
if (!this.isMediaBrowser()) {
|
||||
this.selectImageInNewMediaGalleryBySearch(this.preview().displayedRecord().id);
|
||||
} else {
|
||||
this.selectDisplayedImageForOldMediaGallery(this.preview().displayedRecord().path);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Return adobe stock asset by adobe id
|
||||
*
|
||||
* @param {String} adobeId
|
||||
*/
|
||||
getAssetDetails: function (adobeId) {
|
||||
return $.ajax({
|
||||
url: this.getMediaGalleryAsset,
|
||||
data: {
|
||||
'adobe_id': adobeId
|
||||
},
|
||||
context: this,
|
||||
showLoader: true
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Select image in new media gallery via search input
|
||||
*
|
||||
* @param {String} imageId
|
||||
*/
|
||||
selectImageInNewMediaGalleryBySearch: function (imageId) {
|
||||
var path;
|
||||
|
||||
this.mediaGalleryListingFilters().clear();
|
||||
this.getAssetDetails(imageId).then(function (assetDetails) {
|
||||
if (assetDetails.length === 0) {
|
||||
return;
|
||||
}
|
||||
this.mediaGallerySearchInput().apply(assetDetails.title);
|
||||
path = assetDetails.path;
|
||||
path = path.substring(0, path.lastIndexOf('/'));
|
||||
|
||||
if (path !== '') {
|
||||
this.imageDirectory().locateNode(path);
|
||||
}
|
||||
this.selectRecordFromMediaGalleryProvider(assetDetails.path);
|
||||
}.bind(this));
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Open recently saved image and go to first page
|
||||
*/
|
||||
openNewestImage: function () {
|
||||
this.listingPaging().goFirst();
|
||||
this.mediaGallerySortBy().selectDefaultOption();
|
||||
},
|
||||
|
||||
/**
|
||||
* Selects displayed image in media gallery for old gallery
|
||||
*/
|
||||
selectDisplayedImageForOldMediaGallery: function (path) {
|
||||
var image = mediaGallery.locate(path);
|
||||
|
||||
image ? image.trigger('click') : mediaGallery.notLocated();
|
||||
},
|
||||
|
||||
/**
|
||||
* Select record by image file name
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
selectRecordFromMediaGalleryProvider: function (path) {
|
||||
var subscription;
|
||||
|
||||
subscription = this.imageItems.subscribe(function (items) {
|
||||
subscription.dispose();
|
||||
items.each(function (item) {
|
||||
if (item.path === path) {
|
||||
this.selectRecord(item);
|
||||
|
||||
return false;
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
|
||||
setTimeout(function () {
|
||||
subscription.dispose();
|
||||
}, 1500);
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the record as selected
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
selectRecord: function (record) {
|
||||
uiRegistry.get('name =' + this.mediaGallery).select(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Save preview click handler
|
||||
*/
|
||||
savePreviewClick: function () {
|
||||
var record = this.preview().displayedRecord();
|
||||
|
||||
savePreviewAction(
|
||||
this.preview().downloadImagePreviewUrl,
|
||||
record.id,
|
||||
record.title,
|
||||
record['content_type'],
|
||||
this.getDestinationDirectoryPath()
|
||||
).then(function (destinationPath) {
|
||||
this.updateDownloadedDisplayedRecord(destinationPath);
|
||||
this.reloadGrid().done(function () {
|
||||
this.openInMediaGalleryClick();
|
||||
}.bind(this));
|
||||
}.bind(this)).fail(function (error) {
|
||||
if (error) {
|
||||
this.showErrorMessage(error);
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Update displayed record after downloading
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
updateDownloadedDisplayedRecord: function (path) {
|
||||
var record = this.preview().displayedRecord();
|
||||
|
||||
record['is_downloaded'] = 1;
|
||||
|
||||
if (record.path === '') {
|
||||
record.path = path;
|
||||
}
|
||||
|
||||
this.preview().displayedRecord(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update displayed record after licensing
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
updateLicensedDisplayedRecord: function (path) {
|
||||
var record = this.preview().displayedRecord();
|
||||
|
||||
record['is_downloaded'] = 1;
|
||||
|
||||
if (record.path === '') {
|
||||
record.path = path;
|
||||
}
|
||||
|
||||
record['is_licensed'] = 1;
|
||||
record['is_licensed_locally'] = 1;
|
||||
|
||||
this.preview().displayedRecord(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get image destination path
|
||||
*
|
||||
* @param {String} fileName
|
||||
* @param {String} contentType
|
||||
* @returns {String}
|
||||
*/
|
||||
getDestinationPath: function (fileName, contentType) {
|
||||
return this.getDestinationDirectoryPath() + '/' + fileName + '.' + this.getImageExtension(contentType);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get destination directory path
|
||||
*
|
||||
* @returns {String}
|
||||
*/
|
||||
getDestinationDirectoryPath: function () {
|
||||
var activeNodePath,
|
||||
activeNode;
|
||||
|
||||
if (this.isMediaBrowser()) {
|
||||
activeNode = this.getMageMediaBrowserData().activeNode;
|
||||
|
||||
activeNodePath = _.isUndefined(activeNode.original.path) ? '' : activeNode.original.path;
|
||||
} else {
|
||||
activeNodePath = this.imageDirectory().activeNode() || '';
|
||||
}
|
||||
|
||||
return activeNodePath;
|
||||
},
|
||||
|
||||
/**
|
||||
* Reload grid
|
||||
*
|
||||
* @returns {*}
|
||||
*/
|
||||
reloadGrid: function () {
|
||||
var provider,
|
||||
dataStorage;
|
||||
|
||||
if (this.isMediaBrowser()) {
|
||||
return this.getMageMediaBrowserData().reload();
|
||||
}
|
||||
|
||||
provider = uiRegistry.get('index = media_gallery_listing_data_source'),
|
||||
dataStorage = provider.storage();
|
||||
|
||||
dataStorage.clearRequests();
|
||||
|
||||
return provider.reload();
|
||||
},
|
||||
|
||||
/**
|
||||
* Get data for media browser
|
||||
*
|
||||
* @returns {Undefined|Object}
|
||||
*/
|
||||
getMageMediaBrowserData: function () {
|
||||
return $(this.preview().mediaGallerySelector).data('mageMediabrowser');
|
||||
},
|
||||
|
||||
/**
|
||||
* Is the media browser used in the content of the grid
|
||||
*
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
isMediaBrowser: function () {
|
||||
return typeof this.getMageMediaBrowserData() !== 'undefined';
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate meaningful name image file,
|
||||
* allow only alphanumerics, dashes, and underscores
|
||||
*
|
||||
* @param {String} title
|
||||
* @param {Number} id
|
||||
* @return string
|
||||
*/
|
||||
generateImageName: function (title, id) {
|
||||
var fileName = title.substring(0, 32)
|
||||
.replace(/[^a-zA-Z0-9_]/g, '-')
|
||||
.replace(/-{2,}/g, '-')
|
||||
.toLowerCase();
|
||||
|
||||
/* If the filename does not contain latin chars, use ID as a filename */
|
||||
return fileName === '-' ? id : fileName;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get image file extension
|
||||
*
|
||||
* @param {String} contentType
|
||||
* @return string
|
||||
*/
|
||||
getImageExtension: function (contentType) {
|
||||
return contentType.match(/[^/]{1,4}$/);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get messages
|
||||
*
|
||||
* @return {Array}
|
||||
*/
|
||||
getMessages: function () {
|
||||
return this.messages();
|
||||
},
|
||||
|
||||
/**
|
||||
* License click handler
|
||||
*/
|
||||
licenseClick: function () {
|
||||
var record = this.preview().displayedRecord();
|
||||
|
||||
this.licenseProcess(
|
||||
record.id,
|
||||
record.title,
|
||||
record.path,
|
||||
record['content_type'],
|
||||
this.isDownloaded()
|
||||
).then(function (destinationPath) {
|
||||
this.updateLicensedDisplayedRecord(destinationPath);
|
||||
this.login().getUserQuota();
|
||||
this.reloadGrid().done(function () {
|
||||
this.openInMediaGalleryClick();
|
||||
}.bind(this));
|
||||
}.bind(this)).fail(function (error) {
|
||||
if (error) {
|
||||
uiAlert({
|
||||
content: error
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Process of license
|
||||
*
|
||||
* @param {Number} id
|
||||
* @param {String} title
|
||||
* @param {String} path
|
||||
* @param {String} contentType
|
||||
* @param {Boolean} isDownloaded
|
||||
* @return {window.Promise}
|
||||
*/
|
||||
licenseProcess: function (id, title, path, contentType, isDownloaded) {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
this.login().login()
|
||||
.then(function () {
|
||||
getLicenseStatus(
|
||||
this.overlay().getImagesUrl,
|
||||
[id]
|
||||
).then(function (licensedInfo) {
|
||||
var isLicensed = licensedInfo[id] || false;
|
||||
|
||||
if (isLicensed) {
|
||||
saveLicensedAction(
|
||||
this.preview().saveLicensedAndDownloadUrl,
|
||||
id,
|
||||
title,
|
||||
path,
|
||||
contentType,
|
||||
this.getDestinationDirectoryPath()
|
||||
).then(function (destinationPath) {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
} else {
|
||||
confirmQuotaAction(this.preview().confirmationUrl, id).then(function (data) {
|
||||
if (data.canLicense === false) {
|
||||
buyCreditsConfirmation(
|
||||
this.preview().buyCreditsUrl,
|
||||
title,
|
||||
data.message
|
||||
);
|
||||
} else {
|
||||
licenseAndSaveAction(
|
||||
this.preview().licenseAndDownloadUrl,
|
||||
id,
|
||||
title,
|
||||
path,
|
||||
contentType,
|
||||
isDownloaded,
|
||||
data.message,
|
||||
this.getDestinationDirectoryPath()
|
||||
).then(function (destinationPath) {
|
||||
deferred.resolve(destinationPath);
|
||||
}).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
}
|
||||
}.bind(this)).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
}
|
||||
}.bind(this)).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
}.bind(this)).fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
},
|
||||
|
||||
/**
|
||||
* Save licensed click handler
|
||||
*/
|
||||
saveLicensedClick: function () {
|
||||
var record = this.preview().displayedRecord();
|
||||
|
||||
if (!this.login().user().isAuthorized) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.isLicensed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
saveLicensedAction(
|
||||
this.preview().saveLicensedAndDownloadUrl,
|
||||
record.id,
|
||||
record.title,
|
||||
record.path,
|
||||
record['content_type'],
|
||||
this.getDestinationDirectoryPath()
|
||||
).then(function (destinationPath) {
|
||||
this.updateLicensedDisplayedRecord(destinationPath);
|
||||
this.login().getUserQuota();
|
||||
this.reloadGrid().done(function () {
|
||||
this.openInMediaGalleryClick();
|
||||
}.bind(this));
|
||||
}.bind(this)).fail(function (error) {
|
||||
if (error) {
|
||||
uiAlert({
|
||||
content: error
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns license button title depending on the existing saved preview
|
||||
*
|
||||
* @returns {String}
|
||||
*/
|
||||
getLicenseButtonTitle: function () {
|
||||
return this.isDownloaded() ? $.mage.__('License') : $.mage.__('License and Save');
|
||||
},
|
||||
|
||||
/**
|
||||
* Extracts image name from its path
|
||||
*
|
||||
* @param {String} path
|
||||
* @returns {String}
|
||||
*/
|
||||
getImageNameFromPath: function (path) {
|
||||
var filePathArray = path.split('/'),
|
||||
imageIndex = filePathArray.length - 1;
|
||||
|
||||
return filePathArray[imageIndex].substring(0, filePathArray[imageIndex].lastIndexOf('.'));
|
||||
},
|
||||
|
||||
/**
|
||||
* Show error message and schedule cleanup
|
||||
*
|
||||
* @param {String} message
|
||||
*/
|
||||
showErrorMessage: function (message) {
|
||||
this.messages.push({
|
||||
code: 'error',
|
||||
messageUnsanitizedHtml: message
|
||||
});
|
||||
this.messagesCleanup();
|
||||
},
|
||||
|
||||
/**
|
||||
* Messages cleanup
|
||||
*/
|
||||
messagesCleanup: function () {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
var timerId;
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
timerId = setTimeout(function () {
|
||||
clearTimeout(timerId);
|
||||
this.messages.removeAll();
|
||||
}.bind(this), Number(this.messageDelay) * 1000);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'uiComponent',
|
||||
'underscore'
|
||||
], function (Component, _) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
defaults: {
|
||||
template: 'Magento_AdobeStockImageAdminUi/grid/column/preview/keywords',
|
||||
chipsProvider: 'componentType = filtersChips, ns = ${ $.ns }',
|
||||
defaultKeywordsLimit: 5,
|
||||
keywordsLimit: 5,
|
||||
canViewMoreKeywords: true,
|
||||
modules: {
|
||||
chips: '${ $.chipsProvider }',
|
||||
preview: '${ $.parentName }.preview'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'keywordsLimit',
|
||||
'canViewMoreKeywords'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns keywords to display under the attributes image
|
||||
*
|
||||
* @returns {*[]}
|
||||
*/
|
||||
getKeywords: function (record) {
|
||||
return record.keywords;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns keywords limit to show no of keywords
|
||||
*/
|
||||
getKeywordsLimit: function () {
|
||||
return this.keywordsLimit();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show all the related keywords
|
||||
*/
|
||||
viewAllKeywords: function (record) {
|
||||
this.keywordsLimit(record.keywords.length);
|
||||
this.canViewMoreKeywords(false);
|
||||
this.preview().updateHeight();
|
||||
this.preview().scrollToPreview();
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide all the related keywords
|
||||
*/
|
||||
hideAllKeywords: function () {
|
||||
this.keywordsLimit(this.defaultKeywordsLimit);
|
||||
this.canViewMoreKeywords(true);
|
||||
},
|
||||
|
||||
/**
|
||||
* Drop all filters and initiate search on keyword click event
|
||||
*/
|
||||
searchByKeyWord: function (keyword) {
|
||||
_.invoke(this.chips().elems(), 'clear');
|
||||
_.invoke(this.chips().elems(), 'apply', keyword);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,410 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'uiComponent',
|
||||
'underscore',
|
||||
'jquery'
|
||||
], function (Component, _, $) {
|
||||
'use strict';
|
||||
|
||||
return Component.extend({
|
||||
defaults: {
|
||||
template: 'Magento_AdobeStockImageAdminUi/grid/column/preview/related',
|
||||
filterChipsProvider: 'componentType = filters, ns = ${ $.ns }',
|
||||
filterBookmarksSelector: '.admin__data-grid-action-bookmarks',
|
||||
tabImagesLimit: 4,
|
||||
tabsContainerId: '#adobe-stock-tabs',
|
||||
serieFilterValue: '',
|
||||
modelFilterValue: '',
|
||||
selectedTab: null,
|
||||
loader: false,
|
||||
relatedImages: {
|
||||
series: {},
|
||||
model: {}
|
||||
},
|
||||
statefull: {
|
||||
serieFilterValue: true,
|
||||
modelFilterValue: true
|
||||
},
|
||||
modules: {
|
||||
chips: '${ $.chipsProvider }',
|
||||
filterChips: '${ $.filterChipsProvider }',
|
||||
preview: '${ $.parentName }.preview'
|
||||
},
|
||||
exports: {
|
||||
serieFilterValue: '${ $.provider }:params.filters.serie_id',
|
||||
modelFilterValue: '${ $.provider }:params.filters.model_id'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes related component.
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super();
|
||||
|
||||
this.filterChips().updateActive();
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable keydown event for related content tabs
|
||||
*/
|
||||
disableTabsKeyDownEvent: function () {
|
||||
if ($(this.tabsContainerId + ' li[role=tab]').length === 0) {
|
||||
setTimeout(function () {
|
||||
this.disableTabsKeyDownEvent();
|
||||
}.bind(this), 100);
|
||||
} else {
|
||||
$(this.tabsContainerId + ' li[role=tab]').off('keydown');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'serieFilterValue',
|
||||
'modelFilterValue',
|
||||
'selectedTab',
|
||||
'relatedImages',
|
||||
'loader'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if visible container
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns boolean
|
||||
*/
|
||||
isVisible: function (record) {
|
||||
return this.showSeriesTab(record) && this.showModelTab(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get image related image series.s
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
loadRelatedImages: function (record) {
|
||||
var series = this.getSeries(record),
|
||||
model = this.getModel(record);
|
||||
|
||||
if (series && series.length ||
|
||||
model && model.length
|
||||
) {
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: this.preview().relatedImagesUrl,
|
||||
dataType: 'json',
|
||||
beforeSend: function () {
|
||||
this.loader(true);
|
||||
}.bind(this),
|
||||
data: {
|
||||
'image_id': record.id,
|
||||
'limit': this.tabImagesLimit
|
||||
}
|
||||
}).done(function (data) {
|
||||
var relatedImages = this.relatedImages();
|
||||
|
||||
this.loader(false);
|
||||
relatedImages.series[record.id] = data.result['same_series'];
|
||||
relatedImages.model[record.id] = data.result['same_model'];
|
||||
|
||||
this.relatedImages(relatedImages);
|
||||
this.preview().updateHeight();
|
||||
|
||||
/* Switch to the model tab if the series tab is hidden */
|
||||
if (relatedImages.series[record.id].length === 0 && relatedImages.model[record.id].length > 0) {
|
||||
// eslint-disable-next-line jquery-no-input-event-shorthand
|
||||
$('#adobe-stock-tabs').data().mageTabs.select(1);
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns true if the series tab should be show, false otherwise
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns boolean
|
||||
*/
|
||||
showSeriesTab: function (record) {
|
||||
return typeof this.relatedImages().series[record.id] === 'undefined' ||
|
||||
this.relatedImages().series[record.id].length !== 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns true if the model tab should be show, false otherwise
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns boolean
|
||||
*/
|
||||
showModelTab: function (record) {
|
||||
return typeof this.relatedImages().model[record.id] === 'undefined' ||
|
||||
this.relatedImages().model[record.id].length !== 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns series to display under the image
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns {*[]}
|
||||
*/
|
||||
getSeries: function (record) {
|
||||
return this.relatedImages().series[record.id] || [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if the number of related series image is greater than 4 or not
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns boolean
|
||||
*/
|
||||
canShowMoreSeriesImages: function (record) {
|
||||
return this.getSeries(record).length >= this.tabImagesLimit;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns model to display under the image
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns {*[]}
|
||||
*/
|
||||
getModel: function (record) {
|
||||
return this.relatedImages().model[record.id] || [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if the number of related model image is greater than 4 or not
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns boolean
|
||||
*/
|
||||
canShowMoreModelImages: function (record) {
|
||||
return this.getModel(record).length >= this.tabImagesLimit;
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter images from serie_id
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
seeMoreFromSeries: function (record) {
|
||||
if (this.isSerieFilterApplied(record)) {
|
||||
this.scrollToFilter();
|
||||
|
||||
return;
|
||||
}
|
||||
this.serieFilterValue(record.id);
|
||||
this.applyFilter('serie_id', record.id.toString());
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter images from serie_id
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
seeMoreFromModel: function (record) {
|
||||
if (this.isModelFilterApplied(record)) {
|
||||
this.scrollToFilter();
|
||||
|
||||
return;
|
||||
}
|
||||
this.modelFilterValue(record.id);
|
||||
this.applyFilter('model_id', record.id.toString());
|
||||
},
|
||||
|
||||
/**
|
||||
* Apply series or model id filter and scroll to top of the page
|
||||
*
|
||||
* @param {String} typeId
|
||||
* @param {String} recordId
|
||||
*/
|
||||
applyFilter: function (typeId, recordId) {
|
||||
var data = {};
|
||||
|
||||
data[typeId] = recordId;
|
||||
|
||||
this.filterChips().clear();
|
||||
this.filterChips().setData(data, true);
|
||||
this.filterChips().apply();
|
||||
|
||||
this.scrollToFilter();
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if the filter is applied
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
isSerieFilterApplied: function (record) {
|
||||
return this.filterChips().get('applied')['serie_id'] === record.id.toString();
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if the filter is applied
|
||||
*
|
||||
* @param {Object} record
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
isModelFilterApplied: function (record) {
|
||||
return this.filterChips().get('applied')['model_id'] === record.id.toString();
|
||||
},
|
||||
|
||||
/**
|
||||
* Scrolls user window to the filter bookmarks
|
||||
*/
|
||||
scrollToFilter: function () {
|
||||
$(this.preview().adobeStockModalSelector + ' ' + this.filterBookmarksSelector).get(0).scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'center',
|
||||
inline: 'nearest'
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Next related image preview
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
nextRelated: function (record) {
|
||||
var relatedList = this.selectedTab() === 'series' ? this.getSeries(record) : this.getModel(record),
|
||||
nextRelatedIndex = _.findLastIndex(
|
||||
relatedList,
|
||||
{
|
||||
id: this.preview().displayedRecord().id
|
||||
}
|
||||
) + 1,
|
||||
nextRelated = relatedList[nextRelatedIndex];
|
||||
|
||||
if (typeof nextRelated === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
this.switchImagePreviewToRelatedImage(nextRelated);
|
||||
},
|
||||
|
||||
/**
|
||||
* Previous related preview
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
prevRelated: function (record) {
|
||||
var relatedList = this.selectedTab() === 'series' ? this.getSeries(record) : this.getModel(record),
|
||||
prevRelatedIndex = _.findLastIndex(
|
||||
relatedList,
|
||||
{
|
||||
id: this.preview().displayedRecord().id
|
||||
}
|
||||
) - 1,
|
||||
prevRelated = relatedList[prevRelatedIndex];
|
||||
|
||||
if (typeof prevRelated === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
this.switchImagePreviewToRelatedImage(prevRelated);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get previous button disabled
|
||||
*
|
||||
* @param {Object} record
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
cannotViewPrevious: function (record) {
|
||||
var relatedList, prevRelatedIndex, prevRelated;
|
||||
|
||||
if (!this.selectedTab()) {
|
||||
return false;
|
||||
}
|
||||
relatedList = this.selectedTab() === 'series' ? this.getSeries(record) : this.getModel(record);
|
||||
prevRelatedIndex = _.findLastIndex(
|
||||
relatedList,
|
||||
{
|
||||
id: this.preview().displayedRecord().id
|
||||
}
|
||||
) - 1;
|
||||
prevRelated = relatedList[prevRelatedIndex];
|
||||
|
||||
return typeof prevRelated === 'undefined';
|
||||
},
|
||||
|
||||
/**
|
||||
* Get next button disabled
|
||||
*
|
||||
* @param {Object} record
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
cannotViewNext: function (record) {
|
||||
var relatedList, nextRelatedIndex, nextRelated;
|
||||
|
||||
if (!this.selectedTab()) {
|
||||
return false;
|
||||
}
|
||||
relatedList = this.selectedTab() === 'series' ? this.getSeries(record) : this.getModel(record);
|
||||
nextRelatedIndex = _.findLastIndex(
|
||||
relatedList,
|
||||
{
|
||||
id: this.preview().displayedRecord().id
|
||||
}
|
||||
) + 1;
|
||||
nextRelated = relatedList[nextRelatedIndex];
|
||||
|
||||
return typeof nextRelated === 'undefined';
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch image preview to related image
|
||||
*
|
||||
* @param {Object|null} relatedImage
|
||||
*/
|
||||
switchImagePreviewToRelatedImage: function (relatedImage) {
|
||||
if (!relatedImage) {
|
||||
this.selectedTab(null);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.preview().displayedRecord().id === relatedImage.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.preview().showRelated(relatedImage);
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch image preview to series image
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
switchImagePreviewToSeriesImage: function (record) {
|
||||
this.selectedTab('series');
|
||||
this.switchImagePreviewToRelatedImage(record);
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch image preview to model image
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
switchImagePreviewToModelImage: function (record) {
|
||||
this.selectedTab('model');
|
||||
this.switchImagePreviewToRelatedImage(record);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'Magento_Ui/js/grid/paging/sizes',
|
||||
'underscore'
|
||||
], function (Sizes, _) {
|
||||
'use strict';
|
||||
|
||||
return Sizes.extend({
|
||||
defaults: {
|
||||
value: 32,
|
||||
minSize: 1,
|
||||
maxSize: 64
|
||||
},
|
||||
|
||||
exports: {
|
||||
value: '${ $.provider }:params.paging.page',
|
||||
options: '${ $.provider }:params.paging.options'
|
||||
},
|
||||
|
||||
sizes: {
|
||||
'32': {
|
||||
value: 32,
|
||||
label: 32
|
||||
},
|
||||
'48': {
|
||||
value: 48,
|
||||
label: 48
|
||||
},
|
||||
'64': {
|
||||
value: 64,
|
||||
label: 64
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
updateArray: function () {
|
||||
if (_.isUndefined(this.options)) {
|
||||
this.options = this.sizes;
|
||||
}
|
||||
|
||||
return this._super();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/confirm'
|
||||
], function ($, confirm) {
|
||||
'use strict';
|
||||
|
||||
return function (buyCreditsUrl, recordTitle, quotaMessage) {
|
||||
var confirmationContent = $.mage.__('License "' + recordTitle + '"'),
|
||||
content = '<p>' + confirmationContent + '</p><p><b>' + quotaMessage + '</b></p><br>';
|
||||
|
||||
confirm({
|
||||
title: $.mage.__('License Adobe Stock Images?'),
|
||||
content: content,
|
||||
buttons: [{
|
||||
text: $.mage.__('Cancel'),
|
||||
class: 'action-secondary action-dismiss',
|
||||
|
||||
/**
|
||||
* Close modal
|
||||
*/
|
||||
click: function () {
|
||||
this.closeModal();
|
||||
}
|
||||
},{
|
||||
text: $.mage.__('Buy Credits'),
|
||||
class: 'action-primary action-accept',
|
||||
|
||||
/**
|
||||
* Close modal
|
||||
*/
|
||||
click: function () {
|
||||
window.open(buyCreditsUrl);
|
||||
this.closeModal();
|
||||
}
|
||||
}]
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/prompt',
|
||||
'text!Magento_AdobeStockImageAdminUi/template/modal/adobe-modal-prompt-content.html'
|
||||
], function ($, prompt, adobePromptContentTmpl) {
|
||||
'use strict';
|
||||
|
||||
return function (recordTitle, quotaMessage, isPreviewDownloaded, proposedfileName, fileExtension) {
|
||||
var confirmationContent = $.mage.__('License "' + recordTitle + '"'),
|
||||
deferred = $.Deferred(),
|
||||
displayFieldName = !isPreviewDownloaded ? '<b>' + $.mage.__('File Name') + '</b>' : '',
|
||||
content = '<p>' + confirmationContent + '</p><p><b>' + quotaMessage + '</b></p><br>' + displayFieldName,
|
||||
data = {
|
||||
'title': $.mage.__('License Adobe Stock Images?'),
|
||||
'content': content,
|
||||
'visible': !isPreviewDownloaded,
|
||||
'actions': {
|
||||
/**
|
||||
* Confirm action
|
||||
*
|
||||
* @param {String} fileName
|
||||
*/
|
||||
confirm: function (fileName) {
|
||||
deferred.resolve(fileName);
|
||||
}
|
||||
},
|
||||
'buttons': [{
|
||||
text: $.mage.__('Cancel'),
|
||||
class: 'action-secondary action-dismiss',
|
||||
|
||||
/**
|
||||
* Close modal
|
||||
*/
|
||||
click: function () {
|
||||
this.closeModal();
|
||||
deferred.reject();
|
||||
}
|
||||
}, {
|
||||
text: $.mage.__('Confirm'),
|
||||
class: 'action-primary action-accept'
|
||||
}]
|
||||
|
||||
};
|
||||
|
||||
prompt({
|
||||
title: data.title,
|
||||
content: data.content,
|
||||
value: proposedfileName,
|
||||
imageExtension: fileExtension,
|
||||
visible: data.visible,
|
||||
promptContentTmpl: adobePromptContentTmpl,
|
||||
modalClass: 'adobe-stock-save-preview-prompt',
|
||||
validation: true,
|
||||
promptField: '[data-role="adobe-stock-image-name-field"]',
|
||||
validationRules: ['required-entry', 'validate-image-name'],
|
||||
attributesForm: {
|
||||
novalidate: 'novalidate',
|
||||
action: '',
|
||||
onkeydown: 'return event.key != \'Enter\';'
|
||||
},
|
||||
attributesField: {
|
||||
name: 'name',
|
||||
'data-validate': '{required:true}',
|
||||
maxlength: '128'
|
||||
},
|
||||
context: this,
|
||||
actions: data.actions,
|
||||
buttons: data.buttons
|
||||
});
|
||||
|
||||
if (!data.visible) {
|
||||
$('.adobe-stock-save-preview-prompt').trigger('focus');
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/prompt',
|
||||
'text!Magento_AdobeStockImageAdminUi/template/modal/adobe-modal-prompt-content.html'
|
||||
], function ($, prompt, adobePromptContentTmpl) {
|
||||
'use strict';
|
||||
|
||||
return function (proposedfileName, fileExtension) {
|
||||
var deferred = $.Deferred(),
|
||||
data = {
|
||||
'title': $.mage.__('Save Preview'),
|
||||
'content': $.mage.__('File Name'),
|
||||
'visible': true,
|
||||
'actions': {
|
||||
/**
|
||||
* Resolve with the specified file name
|
||||
*
|
||||
* @param {String} specifiedFileName
|
||||
*/
|
||||
confirm: function (specifiedFileName) {
|
||||
deferred.resolve(specifiedFileName);
|
||||
}
|
||||
},
|
||||
'buttons': [{
|
||||
text: $.mage.__('Cancel'),
|
||||
class: 'action-secondary action-dismiss',
|
||||
|
||||
/**
|
||||
* Close modal on button click
|
||||
*/
|
||||
click: function () {
|
||||
this.closeModal();
|
||||
deferred.reject();
|
||||
}
|
||||
}, {
|
||||
text: $.mage.__('Confirm'),
|
||||
class: 'action-primary action-accept'
|
||||
}]
|
||||
|
||||
};
|
||||
|
||||
prompt({
|
||||
title: data.title,
|
||||
content: data.content,
|
||||
value: proposedfileName,
|
||||
imageExtension: fileExtension,
|
||||
visible: data.visible,
|
||||
promptContentTmpl: adobePromptContentTmpl,
|
||||
modalClass: 'adobe-stock-save-preview-prompt',
|
||||
validation: true,
|
||||
promptField: '[data-role="adobe-stock-image-name-field"]',
|
||||
validationRules: ['required-entry', 'validate-image-name'],
|
||||
attributesForm: {
|
||||
novalidate: 'novalidate',
|
||||
action: '',
|
||||
onkeydown: 'return event.key != \'Enter\';'
|
||||
},
|
||||
attributesField: {
|
||||
name: 'name',
|
||||
'data-validate': '{required:true}',
|
||||
maxlength: '128'
|
||||
},
|
||||
context: this,
|
||||
actions: data.actions,
|
||||
buttons: data.buttons
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/prompt',
|
||||
'text!Magento_AdobeStockImageAdminUi/template/modal/adobe-modal-prompt-content.html'
|
||||
], function ($, prompt, adobePromptContentTmpl) {
|
||||
'use strict';
|
||||
|
||||
return function (proposedfileName, fileExtension) {
|
||||
var deferred = $.Deferred(),
|
||||
data = {
|
||||
'title': $.mage.__('Save'),
|
||||
'content': $.mage.__('File Name'),
|
||||
'visible': true,
|
||||
'actions': {
|
||||
/**
|
||||
* Resolve with the specified file name
|
||||
*
|
||||
* @param {String} fileName
|
||||
*/
|
||||
confirm: function (fileName) {
|
||||
deferred.resolve(fileName);
|
||||
}
|
||||
},
|
||||
'buttons': [
|
||||
{
|
||||
text: $.mage.__('Cancel'),
|
||||
class: 'action-secondary action-dismiss',
|
||||
|
||||
/**
|
||||
* Close modal on button click
|
||||
*/
|
||||
click: function () {
|
||||
this.closeModal();
|
||||
deferred.reject();
|
||||
}
|
||||
},
|
||||
{
|
||||
text: $.mage.__('Confirm'),
|
||||
class: 'action-primary action-accept'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
prompt({
|
||||
title: data.title,
|
||||
content: data.content,
|
||||
value: proposedfileName,
|
||||
imageExtension: fileExtension,
|
||||
visible: data.visible,
|
||||
promptContentTmpl: adobePromptContentTmpl,
|
||||
modalClass: 'adobe-stock-save-preview-prompt',
|
||||
validation: true,
|
||||
promptField: '[data-role="adobe-stock-image-name-field"]',
|
||||
validationRules: ['required-entry', 'validate-image-name'],
|
||||
attributesForm: {
|
||||
novalidate: 'novalidate',
|
||||
action: '',
|
||||
onkeydown: 'return event.key != \'Enter\';'
|
||||
},
|
||||
attributesField: {
|
||||
name: 'name',
|
||||
'data-validate': '{required:true}',
|
||||
maxlength: '128'
|
||||
},
|
||||
context: this,
|
||||
actions: data.actions,
|
||||
buttons: data.buttons
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
};
|
||||
});
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/* global Base64 */
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/confirm'
|
||||
], function ($, confirm) {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
jsTreeRootFolderId: 'root',
|
||||
jsTreeFolderNameMaxLength: 20,
|
||||
|
||||
/**
|
||||
* Locate downloaded image in media browser
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
locate: function (path) {
|
||||
var imageFolder = this.selectFolder(path),
|
||||
imageFilename = path.substring(path.lastIndexOf('/') + 1),
|
||||
locatedImage;
|
||||
|
||||
if (imageFolder.length) {
|
||||
locatedImage = $('div[data-row="file"]:has(img[alt=\"' + imageFilename + '\"])');
|
||||
|
||||
return locatedImage.length ? locatedImage : false;
|
||||
}
|
||||
|
||||
$.ajaxSetup({
|
||||
async: true
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Select folder
|
||||
*
|
||||
* @param {String} path
|
||||
*/
|
||||
selectFolder: function (path) {
|
||||
var imageFolder,
|
||||
pathId,
|
||||
imagePath = path.replace(/^\/+/, ''),
|
||||
folderPathParts = imagePath.split('/').slice(0, -1);
|
||||
|
||||
$.ajaxSetup({
|
||||
async: false
|
||||
});
|
||||
|
||||
if (folderPathParts.length > 1) {
|
||||
this.openFolderTree(folderPathParts);
|
||||
}
|
||||
|
||||
pathId = Base64.idEncode(folderPathParts.join('/'));
|
||||
imageFolder = $('.jstree li[data-id="' + pathId + '"]').children('a');
|
||||
|
||||
if (!imageFolder.length) {
|
||||
imageFolder = $('.jstree li[data-id="' + this.jsTreeRootFolderId + '"]')
|
||||
.children('a');
|
||||
}
|
||||
|
||||
if (imageFolder.length) {
|
||||
imageFolder[0].click();
|
||||
}
|
||||
|
||||
return imageFolder;
|
||||
},
|
||||
|
||||
/**
|
||||
* Show popup that image cannot be located
|
||||
*/
|
||||
notLocated: function () {
|
||||
confirm({
|
||||
title: $.mage.__('The image cannot be located'),
|
||||
content: $.mage.__('We cannot find this image in the media gallery.'),
|
||||
buttons: [{
|
||||
text: $.mage.__('Ok'),
|
||||
class: 'action-primary',
|
||||
attr: {},
|
||||
|
||||
/**
|
||||
* Close modal on button click
|
||||
*/
|
||||
click: function (event) {
|
||||
this.closeModal(event);
|
||||
}
|
||||
}]
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Open folder Tree
|
||||
*
|
||||
* @param {Array} folderPathParts
|
||||
*/
|
||||
openFolderTree: function (folderPathParts) {
|
||||
var i,
|
||||
pathId,
|
||||
openFolderButton,
|
||||
folderPath = '';
|
||||
|
||||
for (i = 0; i < folderPathParts.length - 1; i++) {
|
||||
if (folderPath === '') {
|
||||
folderPath = folderPathParts[i];
|
||||
} else {
|
||||
folderPath = folderPath + '/' + folderPathParts[i];
|
||||
}
|
||||
pathId = Base64.idEncode(folderPath);
|
||||
openFolderButton = $('.jstree li[data-id="' + pathId + '"].jstree-closed').children('.jstree-icon');
|
||||
|
||||
if (openFolderButton.length) {
|
||||
openFolderButton.click();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'underscore',
|
||||
'Magento_MediaGalleryUi/js/grid/columns/image/actions',
|
||||
'Magento_MediaGalleryUi/js/action/getDetails',
|
||||
'mage/translate'
|
||||
], function ($, _, Action, getDetails) {
|
||||
'use strict';
|
||||
|
||||
return Action.extend({
|
||||
defaults: {
|
||||
template: 'Magento_AdobeStockImageAdminUi/mediaGallery/grid/columns/image/licenseActions',
|
||||
licenseAction: {
|
||||
name: 'license',
|
||||
title: $.mage.__('License'),
|
||||
handler: 'licenseImageAction'
|
||||
},
|
||||
modules: {
|
||||
image: '${ $.imageComponent }'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize the component
|
||||
*
|
||||
* @returns {Object}
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super();
|
||||
this.actionsList.push(this.licenseAction);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Init observable variables
|
||||
*
|
||||
* @return {Object}
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super()
|
||||
.observe([
|
||||
'visible'
|
||||
]);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* License image
|
||||
*
|
||||
* @param {Object} record
|
||||
*/
|
||||
licenseImageAction: function (record) {
|
||||
this.getImageRecord(record.id);
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if image licensed
|
||||
*
|
||||
* @param {Object} record
|
||||
* @param {Object} name
|
||||
*/
|
||||
isVisible: function (record, name) {
|
||||
if (name === this.licenseAction.name) {
|
||||
if (_.isUndefined(record.overlay) || record.overlay === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get image record and start license process
|
||||
*
|
||||
* @param {Number} imageId
|
||||
*/
|
||||
getImageRecord: function (imageId) {
|
||||
getDetails(this.imageDetailsUrl, [imageId]).then(function (imageDetails) {
|
||||
var id = imageDetails[imageId]['adobe_stock'][0].value;
|
||||
|
||||
this.image().actions().licenseProcess(
|
||||
id,
|
||||
imageDetails[imageId].title,
|
||||
imageDetails[imageId].path,
|
||||
imageDetails[imageId]['content_type'],
|
||||
true
|
||||
).then(function () {
|
||||
this.image().actions().login().getUserQuota();
|
||||
this.imageModel().reloadGrid();
|
||||
this.imageModel().addMessage('success', $.mage.__('The image has been licensed.'));
|
||||
}.bind(this)).fail(function (error) {
|
||||
if (error) {
|
||||
this.imageModel().addMessage('error', error);
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this)).fail(function (message) {
|
||||
this.imageModel().addMessage('error', message);
|
||||
}.bind(this));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'Magento_MediaGalleryUi/js/grid/columns/image'
|
||||
], function (Image) {
|
||||
'use strict';
|
||||
|
||||
return Image.extend({
|
||||
defaults: {
|
||||
viewConfig: [
|
||||
{
|
||||
component: 'Magento_AdobeStockImageAdminUi/js/mediaGallery/grid/columns/image/licenseActions',
|
||||
name: '${ $.name }_actions',
|
||||
imageModelName: '${ $.name }',
|
||||
imageDetailsUrl: '${ $.imageDetailsurl }',
|
||||
imageComponent: '${ $.imageComponent }'
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'uiElement',
|
||||
'jquery',
|
||||
'mage/translate'
|
||||
], function (Element, $, $t) {
|
||||
'use strict';
|
||||
|
||||
return Element.extend({
|
||||
defaults: {
|
||||
containerId: '#adobe-stock-images-search-modal',
|
||||
masonryComponentPath: 'adobe_stock_images_listing.adobe_stock_images_listing.adobe_stock_images_columns',
|
||||
dataSourcePath: 'adobe_stock_images_listing.adobe_stock_images_listing_data_source',
|
||||
modules: {
|
||||
masonry: '${ $.masonryComponentPath }',
|
||||
source: '${ $.dataSourcePath }'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init component
|
||||
*
|
||||
* @return {exports}
|
||||
*/
|
||||
initialize: function () {
|
||||
this._super();
|
||||
|
||||
$(this.containerId).modal({
|
||||
type: 'slide',
|
||||
buttons: [],
|
||||
modalClass: 'adobe-stock-modal',
|
||||
title: $t('Adobe Stock')
|
||||
}).on('openModal', function () {
|
||||
this.masonry().setLayoutStylesWhenLoaded();
|
||||
}.bind(this));
|
||||
|
||||
try {
|
||||
$(this.containerId).applyBindings();
|
||||
} catch (e) {
|
||||
//already bounded
|
||||
}
|
||||
|
||||
$(window).on('fileDeleted.mediabrowser', this.reloadGrid.bind(this));
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update listing data
|
||||
*/
|
||||
reloadGrid: function () {
|
||||
this.source().set('params.t', Date.now());
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([], function () {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
/**
|
||||
* Extracts image name from its path
|
||||
*
|
||||
* @param {String} path
|
||||
* @returns {String}
|
||||
*/
|
||||
getImageNameFromPath: function (path) {
|
||||
var filePathArray = path.split('/'),
|
||||
imageIndex = filePathArray.length - 1;
|
||||
|
||||
return filePathArray[imageIndex].substring(0, filePathArray[imageIndex].lastIndexOf('.'));
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate meaningful name image file,
|
||||
* allow only alphanumerics, dashes, and underscores
|
||||
*
|
||||
* @param {String} title
|
||||
* @param {Number} id
|
||||
* @return string
|
||||
*/
|
||||
generateImageName: function (title, id) {
|
||||
var fileName = title.substring(0, 32)
|
||||
.replace(/[^a-zA-Z0-9_]/g, '-')
|
||||
.replace(/-{2,}/g, '-')
|
||||
.toLowerCase();
|
||||
|
||||
/* If the filename does not contain latin chars, use ID as a filename */
|
||||
return fileName === '-' ? id : fileName;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get image file extension
|
||||
*
|
||||
* @param {String} contentType
|
||||
* @return string
|
||||
*/
|
||||
getImageExtension: function (contentType) {
|
||||
return contentType.match(/[^/]{1,4}$/);
|
||||
},
|
||||
|
||||
/**
|
||||
* Create path
|
||||
*
|
||||
* @param {String} directoryPath
|
||||
* @param {String} fileName
|
||||
* @param {String} contentType
|
||||
* @returns {String}
|
||||
*/
|
||||
buildPath: function (directoryPath, fileName, contentType) {
|
||||
return directoryPath + '/' + fileName + '.' + this.getImageExtension(contentType);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_AdobeIms/js/signIn',
|
||||
'Magento_AdobeIms/js/action/authorization',
|
||||
'Magento_Ui/js/modal/confirm'
|
||||
], function ($, signIn, auth, confirm) {
|
||||
'use strict';
|
||||
|
||||
return signIn.extend({
|
||||
|
||||
defaults: {
|
||||
userQuota: {},
|
||||
// eslint-disable-next-line max-len
|
||||
dataProvider: 'name = adobe_stock_images_listing.adobe_stock_images_listing_data_source, ns = adobe_stock_images_listing',
|
||||
// eslint-disable-next-line max-len
|
||||
previewProvider: 'name = adobe_stock_images_listing.adobe_stock_images_listing.adobe_stock_images_columns.preview, ns = adobe_stock_images_listing',
|
||||
quotaUrl: 'adobe_stock/license/quota',
|
||||
modules: {
|
||||
source: '${ $.dataProvider }',
|
||||
preview: '${ $.previewProvider }'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super().observe(['userQuota']);
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Login to Adobe
|
||||
*
|
||||
* @return {*}
|
||||
*/
|
||||
login: function () {
|
||||
var deferred = $.Deferred();
|
||||
|
||||
if (this.user().isAuthorized) {
|
||||
return deferred.resolve();
|
||||
}
|
||||
auth(this.loginConfig)
|
||||
.then(function (response) {
|
||||
this.loadUserProfile();
|
||||
deferred.resolve(response);
|
||||
}.bind(this))
|
||||
.fail(function (error) {
|
||||
deferred.reject(error);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
},
|
||||
|
||||
/**
|
||||
* Login action with popup on error..
|
||||
*/
|
||||
loginClick: function () {
|
||||
this.login().fail(function (error) {
|
||||
this.showLoginErrorPopup(error);
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Show popup that user failed to login.
|
||||
*/
|
||||
showLoginErrorPopup: function (error) {
|
||||
confirm({
|
||||
title: $.mage.__('Couldn\'t log you in'),
|
||||
content: error,
|
||||
buttons: [{
|
||||
text: $.mage.__('Ok'),
|
||||
class: 'action-primary action-accept'
|
||||
}],
|
||||
actions: {
|
||||
|
||||
/**
|
||||
* Close modal
|
||||
*/
|
||||
confirm: function (event) {
|
||||
this.closeModal(event);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Logout from adobe account
|
||||
*/
|
||||
logout: function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: this.logoutUrl,
|
||||
data: {
|
||||
'form_key': window.FORM_KEY
|
||||
},
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
showLoader: true,
|
||||
success: function () {
|
||||
this.user({
|
||||
isAuthorized: false,
|
||||
name: '',
|
||||
email: '',
|
||||
image: this.defaultProfileImage
|
||||
});
|
||||
}.bind(this),
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns {String}
|
||||
*/
|
||||
error: function (response) {
|
||||
return response.message;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieves full user quota.
|
||||
*/
|
||||
getUserQuota: function () {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: this.quotaUrl,
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns void
|
||||
*/
|
||||
success: function (response) {
|
||||
this.userQuota(response.result);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns {String}
|
||||
*/
|
||||
error: function (response) {
|
||||
return response.message;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
loadUserProfile: function () {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: this.profileUrl,
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns void
|
||||
*/
|
||||
success: function (response) {
|
||||
this.user({
|
||||
isAuthorized: true,
|
||||
name: response.result.name,
|
||||
email: response.result.email,
|
||||
image: response.result.image
|
||||
});
|
||||
this.getUserQuota();
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} response
|
||||
* @returns {String}
|
||||
*/
|
||||
error: function (response) {
|
||||
return response.message;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'mage/translate',
|
||||
'jquery/validate'
|
||||
], function ($, $t) {
|
||||
'use strict';
|
||||
|
||||
$.validator.addMethod(
|
||||
'validate-image-name', function (value) {
|
||||
return /^[a-zA-Z0-9\-\_]+$/i.test(value);
|
||||
|
||||
}, $t('Please name the file using only letters, numbers, underscores and dashes'));
|
||||
});
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="masonry-image-preview" if="$col.isVisible($row())" data-image-preview ko-style="$col.getStyles()">
|
||||
<div class="container">
|
||||
<div class="action-buttons preview-buttons">
|
||||
<button class="action-previous" type="button" disable="$col.cannotViewPrevious($row())" click="$col.prev.bind($col, $row())">
|
||||
<span translate="'Previous'"></span>
|
||||
</button>
|
||||
<button class="action-next" type="button" disable="$col.cannotViewNext($row())" click="$col.next.bind($col, $row())">
|
||||
<span translate="'Next'"></span>
|
||||
</button>
|
||||
<button class="action-close" type="button" click="$col.hide.bind($col)">
|
||||
<span translate="'Close'"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="preview-row-content">
|
||||
<img class="preview" attr="src: $col.displayedRecord().thumbnail_500_url, alt: $col.displayedRecord().title">
|
||||
<div class="info">
|
||||
<h3 class="title" text="$col.displayedRecord().title" if="$col.displayedRecord().title"></h3>
|
||||
<div class="author" if="$col.displayedRecord().creator_name">
|
||||
<span translate="'By'"></span><span text="' ' + $col.displayedRecord().creator_name" ></span>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<scope args="actions">
|
||||
<render args="getTemplate()" ></render>
|
||||
</scope>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="attributes" data-role="image-attributes-value">
|
||||
<each args="$col.getDisplayAttributes()">
|
||||
<div class="attribute">
|
||||
<span class="title" translate="name"></span>
|
||||
<div class="value">
|
||||
<span text="value"></span>
|
||||
</div>
|
||||
</div>
|
||||
</each>
|
||||
</div>
|
||||
|
||||
<scope args="related">
|
||||
<render args="getTemplate()"></render>
|
||||
</scope>
|
||||
|
||||
<div class="keywords-container" ko-scope="keywords">
|
||||
<render args="getTemplate()"></render>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div if="$col.isVisible($row())" ko-style="$col.getStyles($row())" class="masonry-image-overlay">
|
||||
<span text="$col.getLabel($row())"></span>
|
||||
</div>
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<ul class="messages" if="getMessages().length > 0">
|
||||
<each args="getMessages()">
|
||||
<div class="messages">
|
||||
<div attr="class: 'message message-'+code">
|
||||
<div data-ui-id="messages-message-error">
|
||||
<span html="messageUnsanitizedHtml"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</each>
|
||||
</ul>
|
||||
<button class="action-secondary" type="button" visible="!isDownloaded() && !isLicensed()" click="function(){ savePreviewClick() }">
|
||||
<span translate="'Save Preview'"></span>
|
||||
</button>
|
||||
<button class="action-secondary" type="button" visible="isDownloaded()" click="function(){ openInMediaGalleryClick() }">
|
||||
<span translate="'Open in Media Gallery'"></span>
|
||||
</button>
|
||||
<button class="action-default primary"
|
||||
type="button"
|
||||
attr="title: getLicenseButtonTitle()"
|
||||
visible="!isLicensedLocally() && !isLicensed()" click="function () { licenseClick(); }">
|
||||
<span text="getLicenseButtonTitle()"></span>
|
||||
</button>
|
||||
<button class="action-default primary" type="button" visible="isLicensed()" click="function () { saveLicensedClick(); }">
|
||||
<span translate="'Save Licensed'"></span>
|
||||
</button>
|
||||
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="keywords">
|
||||
<div class="title" translate="'Similar Keywords'"></div>
|
||||
<each args="getKeywords($col.displayedRecord())">
|
||||
<div class="keyword" css="{ 'hide': $index() >= $parent.getKeywordsLimit()}">
|
||||
<a href="" class="value" click="function(){ $parent.searchByKeyWord(name) }">
|
||||
<span text="name"></span>
|
||||
</a>
|
||||
</div>
|
||||
</each>
|
||||
<button visible="canViewMoreKeywords" click="function(){ viewAllKeywords($col.displayedRecord()) }">
|
||||
<span translate="'View all'"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div if="isVisible($row())"
|
||||
class="related-container">
|
||||
<div id="adobe-stock-tabs"
|
||||
class="adobe-stock-tabs"
|
||||
data-bind="mageInit: {
|
||||
'mage/backend/tabs': {
|
||||
destination: '#adobe-stock-tabs-content',
|
||||
shadowTabs: [],
|
||||
}
|
||||
}" afterRender="disableTabsKeyDownEvent()">
|
||||
<ul class="tabs-horiz">
|
||||
<li if="showSeriesTab($row())">
|
||||
<a id="series_tab" attr="'href': '#series_content_' + $row().id">
|
||||
<span class="title" translate="'More from this series'"></span>
|
||||
</a>
|
||||
</li>
|
||||
<li if="showModelTab($row())">
|
||||
<a id="model_tab" attr="'href': '#model_content_' + $row().id">
|
||||
<span class="title" translate="'More from this model'"></span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="adobe-stock-tabs-content"
|
||||
class="adobe-stock-related-images-tab-content">
|
||||
<div class="spinner related-loader" visible="loader">
|
||||
<span></span><span></span><span></span><span></span>
|
||||
<span></span><span></span><span></span><span></span>
|
||||
</div>
|
||||
<div if="showSeriesTab($row())" attr="'id': 'series_content_' + $row().id">
|
||||
<each args="getSeries($row())">
|
||||
<div class="thumbnail" click="function(){ $parent.switchImagePreviewToSeriesImage($data) }">
|
||||
<img attr="src: thumbnail_url, alt: title">
|
||||
</div>
|
||||
</each>
|
||||
<if args="canShowMoreSeriesImages($row())">
|
||||
<div class="see-more-wrapper" click="function(){ seeMoreFromSeries($row()) }">
|
||||
<div class="see-more-content">
|
||||
<div class="three-dots">
|
||||
<span class="dots"></span>
|
||||
<span class="dots"></span>
|
||||
<span class="dots"></span>
|
||||
</div>
|
||||
<a href="" class="see-more">See more</a>
|
||||
</div>
|
||||
</div>
|
||||
</if>
|
||||
</div>
|
||||
<div if="showModelTab($row())" attr="'id': 'model_content_' + $row().id">
|
||||
<each args="getModel($row())">
|
||||
<div class="thumbnail" click="function(){ $parent.switchImagePreviewToModelImage($data) }">
|
||||
<img attr="src: thumbnail_url, alt: title">
|
||||
</div>
|
||||
</each>
|
||||
<if args="canShowMoreModelImages($row())">
|
||||
<div class="see-more-wrapper" click="function(){ seeMoreFromModel($row()) }">
|
||||
<div class="see-more-content">
|
||||
<div class="three-dots">
|
||||
<span class="dots"></span>
|
||||
<span class="dots"></span>
|
||||
<span class="dots"></span>
|
||||
</div>
|
||||
<a href="" class="see-more">See more</a>
|
||||
</div>
|
||||
</div>
|
||||
</if>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="admin__field admin__adobe-stock-image-checkbox" visible="visible" css="$data.additionalClasses">
|
||||
<div class="admin__field-control"
|
||||
css="'_with-tooltip': $data.tooltip">
|
||||
<label class="admin__form-field-label" if="$data.label" attr="for: uid">
|
||||
<span translate="label" attr="'data-config-scope': $data.scopeLabel"></span>
|
||||
</label>
|
||||
<render args="tooltipTpl" if="$data.tooltip"></render>
|
||||
</div>
|
||||
<div class="admin__field admin__field-option">
|
||||
<input type="checkbox"
|
||||
class="admin__control-checkbox"
|
||||
ko-checked="$data.checked"
|
||||
disable="disabled"
|
||||
ko-value="value"
|
||||
hasFocus="focused"
|
||||
attr="id: uid, name: inputName"/>
|
||||
|
||||
<label class="admin__field-label" text="description" attr="for: uid"></label>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="admin__data-grid-filters-current" css="_show: hasPreviews()">
|
||||
<div class="admin__current-filters-title-wrap">
|
||||
<span class="admin__current-filters-title" translate="'Active filters\\:'"></span>
|
||||
</div>
|
||||
<div class="admin__current-filters-list-wrap">
|
||||
<ul class="admin__current-filters-list" data-role="filter-list">
|
||||
<each args="elems">
|
||||
<li outereach="previews">
|
||||
<span text="label + '\\:'"></span>
|
||||
<span if="typeof preview ==='string' && label === 'Color'" class="color-rectangle" ko-style="{ 'background-color' : preview }"></span>
|
||||
<span if="typeof preview === 'string'" text="preview"></span>
|
||||
<span if="typeof preview === 'object'">
|
||||
<text args="preview[0] || '...'"></text> - <text args="preview[1] || '...'"></text>
|
||||
</span>
|
||||
<button class="action-remove" type="button"
|
||||
data-action="grid-filter-remove-chip"
|
||||
click="$parent.clear.bind($parent, elem)">
|
||||
<span translate="'Remove'"></span>
|
||||
</button>
|
||||
</li>
|
||||
</each>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="admin__current-filters-actions-wrap">
|
||||
<button class="action-tertiary action-clear" type="button" click="clear" translate="'Clear all'"
|
||||
attr="'data-action': hasPreviews() ? 'grid-filter-reset' : ''"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<label class="admin__form-field-label" if="$data.label" attr="for: uid">
|
||||
<span translate="label" attr="'data-config-scope': $data.scopeLabel"></span>
|
||||
</label>
|
||||
<div class="admin__field-control"
|
||||
visible="visible"
|
||||
css="$data.additionalClasses">
|
||||
<input type="hidden" class="colorpicker-spectrum" colorPicker="colorPickerConfig" disable="disabled" />
|
||||
<input type="text" class="admin__control-text colorpicker-input"
|
||||
ko-value="value" hasFocus="focused" disable="disabled"
|
||||
attr="name: inputName, id: uid, placeholder: placeholder"/>
|
||||
</div>
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="admin__data-grid-header" data-role="masonry-main-toolbar" afterRender="$data.setToolbarNode">
|
||||
<div class="admin__data-grid-header-row">
|
||||
<div class="admin__data-grid-actions-wrap" each="getRegion('dataGridActions')" render=""></div>
|
||||
<each args="getRegion('dataGridFilters')" render=""></each>
|
||||
</div>
|
||||
<div class="admin__data-grid-header-row row row-gutter">
|
||||
<div class="col-xs-2" if="hasChild('listing_massaction')" ko-scope="requestChild('listing_massaction')" render=""></div>
|
||||
<div css="
|
||||
'col-xs-10': hasChild('listing_massaction'),
|
||||
'col-xs-12': !hasChild('listing_massaction')">
|
||||
<div class="row">
|
||||
<div class="col-xs-4">
|
||||
<div class="masonry-results-number" ko-scope="requestChild('listing_paging')">
|
||||
<render args="totalTmpl"></render>
|
||||
</div>
|
||||
<each args="getRegion('sorting')" render=""></each>
|
||||
</div>
|
||||
<div class="col-xs-8" ko-scope="requestChild('listing_paging')">
|
||||
<div render=""></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<render args="stickyTmpl" if="$data.sticky"></render>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="adobe-stock-image-details image-details-section" if="$parent.image().adobe_stock">
|
||||
<h3 translate="'Adobe Stock'"></h3>
|
||||
<div class="attributes">
|
||||
<each args="$parent.image().adobe_stock">
|
||||
<div class="attribute" if="value">
|
||||
<span class="title" translate="title"></span>
|
||||
<div class="value" text="value"></div>
|
||||
</div>
|
||||
</each>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<each args="{ data: actionsList, as: 'action' }">
|
||||
<li>
|
||||
<a class="action-menu-item" href="" if="$parent.isVisible($row(), action.name)"
|
||||
text="action.title" click="$parent[action.handler].bind($parent, $row())"
|
||||
attr="{'data-ui-id': 'action-' + action.name}">
|
||||
</a>
|
||||
</li>
|
||||
</each>
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<% if (data.visible) { %>
|
||||
<form <%= formAttr %>>
|
||||
<fieldset class="admin__fieldset">
|
||||
<div class="admin__field admin__field-wide">
|
||||
<% if(data.label){ %>
|
||||
<label for="prompt-field-<%- data.id %>" class="admin__field-label">
|
||||
<span><%= data.label %></span>
|
||||
</label>
|
||||
<% } %>
|
||||
<div class="admin__field-control admin__field-with-image-ext">
|
||||
<input type="text" data-role="adobe-stock-image-name-field" id="prompt-field-<%- data.id %>" placeholder="Enter the filename (no special characters)" class="admin__control-text" <%= inputAttr %>/>
|
||||
<span class="image-ext">.<%= data.imageExtension %></span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
<% } %>
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<button
|
||||
class="adobe-sign-in-button"
|
||||
id="adobeImsSignIn"
|
||||
data-role="signInBtn"
|
||||
click="loginClick"
|
||||
visible="!user().isAuthorized"
|
||||
type="button">
|
||||
<span>Sign In</span>
|
||||
</button>
|
||||
<div class="adobe-user-information">
|
||||
<div class="admin__action-dropdown-wrap" data-bind="collapsible">
|
||||
<img class="adobe-profile-image-small"
|
||||
attr="src: user().image"
|
||||
visible="user().isAuthorized"/>
|
||||
<button
|
||||
type="button"
|
||||
data-toggle="dropdown"
|
||||
class="adobe-user-name admin__action-dropdown"
|
||||
visible="user().isAuthorized"
|
||||
data-bind="toggleCollapsible">
|
||||
<span text="user().name"></span>
|
||||
</button>
|
||||
<ul class="admin__action-dropdown-menu adobe-user-popup" visible="user().isAuthorized">
|
||||
<li>
|
||||
<img class="adobe-profile-image-large" attr="src: user().image">
|
||||
</li>
|
||||
<li class="adobe-user-info">
|
||||
<ul>
|
||||
<li><!--ko text: user().name--><!--/ko--></li>
|
||||
<li><!--ko text: user().email--><!--/ko--></li>
|
||||
<li><a target="_blank" href="https://account.adobe.com/profile">Manage Account</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<div class="adobe-user-info">
|
||||
<span>AVAILABLE</span>
|
||||
<p><b><!--ko text: userQuota().images--><!--/ko--></b> Images | <b><!--ko text: userQuota().credits -->
|
||||
<!--/ko--></b> Credits</p>
|
||||
</div>
|
||||
<button
|
||||
class="adobe-sign-out-button"
|
||||
id="adobeImsSignOut"
|
||||
click="logout"
|
||||
data-bind="visible: !isGlobalSignInEnabled"
|
||||
data-role="signOutBtn"
|
||||
type="button">
|
||||
<span>Sign Out</span>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="masonry-sorting">
|
||||
<b><translate args="'Sort by'"></translate>:</b>
|
||||
<select class="admin__control-select"
|
||||
options="options"
|
||||
optionsValue="'value'"
|
||||
optionsText="'label'"
|
||||
ko-value="selectedOption">
|
||||
</select>
|
||||
</div>
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Ui/js/modal/alert',
|
||||
'jquery/ui'
|
||||
], function ($, alert) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.testConnection', {
|
||||
options: {
|
||||
url: '',
|
||||
elementId: '',
|
||||
successText: '',
|
||||
failedText: '',
|
||||
fieldMapping: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind handlers to events
|
||||
*/
|
||||
_create: function () {
|
||||
this._on({
|
||||
'click': $.proxy(this._connect, this)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Method triggers an AJAX request to check search engine connection
|
||||
* @private
|
||||
*/
|
||||
_connect: function () {
|
||||
var result = this.options.failedText,
|
||||
element = $('#' + this.options.elementId),
|
||||
self = this,
|
||||
params = {},
|
||||
msg = '',
|
||||
fieldToCheck = this.options.fieldToCheck || 'success';
|
||||
|
||||
element.removeClass('success').addClass('fail');
|
||||
$.each(JSON.parse(this.options.fieldMapping), function (key, el) {
|
||||
params[key] = $('#' + el).val();
|
||||
});
|
||||
$.ajax({
|
||||
url: this.options.url,
|
||||
showLoader: true,
|
||||
data: params,
|
||||
headers: this.options.headers || {}
|
||||
}).done(function (response) {
|
||||
if (response[fieldToCheck]) {
|
||||
element.removeClass('fail').addClass('success');
|
||||
result = self.options.successText;
|
||||
} else {
|
||||
msg = response.errorMessage;
|
||||
|
||||
if (msg) {
|
||||
alert({
|
||||
content: msg
|
||||
});
|
||||
}
|
||||
}
|
||||
}).always(function () {
|
||||
$('#' + self.options.elementId + '_result').text(result);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.testConnection;
|
||||
});
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="120px"
|
||||
height="105px" viewBox="0 0 120 105" enable-background="new 0 0 120 105" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<rect x="2.904" y="27.946" display="inline" fill="#F06524" width="113.745" height="12.408"/>
|
||||
<path display="inline" fill="#636667" d="M95.811,85.511c-0.753-2.551-1.775-5.013-3.059-7.344
|
||||
c-0.207-0.387-0.134-0.884,0.191-1.208c2.857-2.869,2.857-7.489,0.013-10.346l-3.649-3.686c-2.873-2.86-7.493-2.86-10.348-0.016
|
||||
c-0.334,0.336-0.828,0.409-1.228,0.193c-2.321-1.271-4.785-2.295-7.337-3.047c-0.419-0.126-0.714-0.525-0.712-0.979
|
||||
c0.004-1.947-0.766-3.812-2.139-5.187c-1.37-1.377-3.233-2.148-5.176-2.148h-5.184c-4.039,0-7.312,3.274-7.312,7.314
|
||||
c0.001,0.464-0.294,0.863-0.728,0.993c-2.537,0.747-5.002,1.771-7.335,3.051c-0.391,0.213-0.882,0.143-1.199-0.178
|
||||
c-1.377-1.381-3.236-2.15-5.176-2.15c-1.938,0-3.799,0.77-5.168,2.143l-3.688,3.744c-2.833,2.845-2.833,7.465,0.011,10.321
|
||||
c0.336,0.336,0.41,0.835,0.191,1.24c-1.269,2.312-2.294,4.772-3.045,7.324c-0.487,1.657,0.46,3.396,2.117,3.885
|
||||
c1.658,0.487,3.396-0.46,3.884-2.117c0.624-2.12,1.475-4.164,2.538-6.101c1.544-2.863,1.027-6.375-1.262-8.653
|
||||
c-0.405-0.407-0.405-1.082,0.009-1.497l3.686-3.742c0.181-0.182,0.449-0.291,0.727-0.291c0.279,0,0.545,0.109,0.743,0.307
|
||||
c2.271,2.289,5.794,2.805,8.634,1.253c1.944-1.065,3.993-1.918,6.115-2.541c3.105-0.933,5.213-3.781,5.2-7.005
|
||||
C56.126,58.473,56.6,58,57.184,58h5.184c0.281,0,0.55,0.112,0.75,0.31c0.199,0.2,0.309,0.471,0.309,0.752
|
||||
c-0.012,3.217,2.098,6.065,5.185,6.992c2.138,0.631,4.187,1.482,6.129,2.545c2.854,1.546,6.369,1.026,8.646-1.269
|
||||
c0.403-0.401,1.075-0.401,1.492,0.015l3.639,3.675c0.42,0.424,0.42,1.098,0.007,1.515c-2.283,2.265-2.802,5.783-1.261,8.628
|
||||
c1.071,1.952,1.922,3.997,2.545,6.116c0.489,1.657,2.228,2.604,3.886,2.116C95.351,88.907,96.297,87.169,95.811,85.511z"/>
|
||||
<path display="inline" fill="#636667" d="M118.29,1.486C117.337,0.536,116.046,0,114.7,0H4.843
|
||||
C2.035,0.014-0.224,2.283-0.224,5.076v89.103c-0.006,1.334,0.524,2.629,1.475,3.584c0.951,0.955,2.244,1.492,3.592,1.492h109.851
|
||||
c1.35,0.005,2.645-0.529,3.6-1.484c0.955-0.954,1.49-2.254,1.482-3.605V5.076C119.776,3.73,119.243,2.439,118.29,1.486z
|
||||
M113.521,6.255v18.564H6.032V6.255H113.521z M41.2,93c1.493-8.922,9.23-15.729,18.576-15.729c9.348,0,17.083,6.808,18.576,15.729
|
||||
H41.2z M84.673,93c-1.542-12.39-12.089-21.984-24.896-21.984C46.97,71.016,36.422,80.61,34.879,93H6.032V31.074h107.49V93H84.673z"
|
||||
/>
|
||||
<path display="inline" fill="#636667" d="M21.661,19.955c-1.204,1.203-2.836,1.879-4.539,1.879c-3.545,0-6.419-2.873-6.419-6.418
|
||||
s2.874-6.418,6.419-6.418s6.418,2.873,6.418,6.418C23.541,17.118,22.865,18.751,21.661,19.955z"/>
|
||||
<circle display="inline" fill="#636667" cx="31.611" cy="15.416" r="6.418"/>
|
||||
<path display="inline" fill="#636667" d="M52.518,15.416c-0.009,3.545-2.873,6.408-6.418,6.418c-3.545,0-6.419-2.873-6.419-6.418
|
||||
s2.874-6.418,6.419-6.418C49.645,8.998,52.518,11.871,52.518,15.416z"/>
|
||||
</g>
|
||||
<g id="Layer_2" display="none">
|
||||
<g display="inline">
|
||||
<path fill="#F06725" d="M99.814,64.673V46.052h13.125v18.621H99.814z M120,64.673v43.361H92.758V64.673H120z"/>
|
||||
<rect y="50.855" fill="#F06725" width="9.017" height="57.181"/>
|
||||
<path fill="#F06725" d="M53.04,108.034V55.046h16.718v52.988H53.04z M58.535,55.046V44.188h5.724v10.858H58.535z"/>
|
||||
<rect x="18.373" y="30.743" fill="#646767" width="3.105" height="4.451"/>
|
||||
<rect x="29.501" y="30.743" fill="#646767" width="3.105" height="4.451"/>
|
||||
<rect x="40.586" y="30.743" fill="#646767" width="3.104" height="4.451"/>
|
||||
<rect x="18.373" y="43.411" fill="#646767" width="3.105" height="4.503"/>
|
||||
<rect x="29.501" y="43.411" fill="#646767" width="3.105" height="4.503"/>
|
||||
<rect x="40.609" y="43.411" fill="#646767" width="3.104" height="4.503"/>
|
||||
<rect x="18.373" y="56.082" fill="#646767" width="3.105" height="4.5"/>
|
||||
<rect x="29.501" y="56.082" fill="#646767" width="3.105" height="4.5"/>
|
||||
<rect x="40.609" y="56.082" fill="#646767" width="3.104" height="4.5"/>
|
||||
<rect x="18.373" y="68.752" fill="#646767" width="3.105" height="4.501"/>
|
||||
<rect x="29.501" y="68.752" fill="#646767" width="3.105" height="4.501"/>
|
||||
<rect x="40.609" y="68.752" fill="#646767" width="3.104" height="4.501"/>
|
||||
<rect x="18.373" y="81.422" fill="#646767" width="3.105" height="4.491"/>
|
||||
<rect x="29.501" y="81.422" fill="#646767" width="3.105" height="4.491"/>
|
||||
<rect x="40.586" y="81.422" fill="#646767" width="3.104" height="4.491"/>
|
||||
<rect x="18.373" y="94.091" fill="#646767" width="3.105" height="4.504"/>
|
||||
<rect x="29.501" y="94.091" fill="#646767" width="3.105" height="4.504"/>
|
||||
<rect x="40.609" y="94.091" fill="#646767" width="3.104" height="4.504"/>
|
||||
<path fill="#646767" d="M94.309,106.481V55.761h-4.378V33.247h-7.132V16.168h-3.105v17.079h-7.112v22.514h-4.378v50.721h-13.61
|
||||
V19.75h-8.655V9.006h-8.859V0H24.977v9.006h-8.859V19.75H7.483v86.731H0v3.104h7.483h47.109h13.61h26.105H120v-3.104H94.309z
|
||||
M75.687,36.353h11.139V55.74H75.687V36.353z M28.082,3.105h5.892v5.9h-5.892V3.105z M19.221,12.11h5.756h12.102h5.754v7.64
|
||||
H19.221V12.11z M10.588,106.481V22.854h5.53h29.82h5.548v83.627H10.588z M71.309,106.481V58.868h19.896v47.613H71.309z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Layer_3">
|
||||
<path fill="#636768" d="M2.66,104.889h112.106c1.47,0,2.66-1.194,2.66-2.662c0-1.473-1.19-2.663-2.66-2.663H2.66
|
||||
c-1.471,0-2.661,1.19-2.661,2.663C0,103.694,1.189,104.889,2.66,104.889z"/>
|
||||
<rect x="2.66" y="52.421" fill="#F06725" width="12.314" height="39.343"/>
|
||||
<rect x="102.453" y="31.996" fill="#F06725" width="12.313" height="59.768"/>
|
||||
<rect x="35.928" y="31.25" fill="#F06725" width="12.315" height="60.514"/>
|
||||
<rect x="69.187" y="50.168" fill="#F06725" width="12.323" height="41.596"/>
|
||||
<circle fill="#F06725" cx="42.038" cy="11.39" r="3.76"/>
|
||||
<circle fill="#F06725" cx="108.608" cy="12.135" r="3.76"/>
|
||||
<path fill="#656668" d="M108.61,0.744c-6.28,0-11.387,5.11-11.387,11.389c0,0.877,0.107,1.729,0.293,2.55l-16.983,9.726
|
||||
c-1.392-1.221-3.194-1.988-5.187-1.988c-1.931,0-3.681,0.728-5.054,1.882L53.252,13.614c0.145-0.722,0.222-1.464,0.222-2.227
|
||||
C53.474,5.109,48.364,0,42.085,0c-6.281,0-11.39,5.109-11.39,11.391c0,1.168,0.178,2.296,0.508,3.36l-18.246,11.1
|
||||
c-1.208-0.748-2.617-1.202-4.138-1.202c-4.363,0-7.913,3.549-7.913,7.911c0,4.361,3.549,7.911,7.913,7.911
|
||||
c2.113,0,4.101-0.823,5.593-2.317c1.492-1.493,2.315-3.48,2.315-5.593c0-0.881-0.177-1.712-0.444-2.504l17.646-10.733
|
||||
c2.07,2.129,4.959,3.457,8.156,3.457c3.601,0,6.81-1.684,8.9-4.301l16.61,10.419c-0.086,0.463-0.146,0.938-0.146,1.422
|
||||
c-0.003,4.353,3.534,7.899,7.889,7.908h0.004c4.361,0,7.913-3.55,7.913-7.917c-0.003-0.43-0.063-0.841-0.128-1.251l16.774-9.605
|
||||
c2.085,2.485,5.217,4.069,8.71,4.069c6.28,0,11.388-5.11,11.388-11.39C119.998,5.855,114.889,0.744,108.61,0.744z M10.648,34.389
|
||||
c-0.488,0.49-1.139,0.758-1.83,0.758c-1.427,0-2.587-1.161-2.587-2.587c0-1.427,1.16-2.588,2.587-2.588
|
||||
c1.426,0,2.587,1.161,2.587,2.588C11.405,33.25,11.137,33.901,10.648,34.389z M42.085,17.456c-3.345,0-6.065-2.721-6.065-6.065
|
||||
c0-3.345,2.723-6.068,6.065-6.068c3.343,0,6.066,2.723,6.066,6.068C48.151,14.733,45.43,17.456,42.085,17.456z M75.347,32.903
|
||||
c-1.418-0.001-2.571-1.16-2.571-2.58c0-1.419,1.157-2.576,2.578-2.578c1.421,0,2.578,1.155,2.578,2.569
|
||||
C77.928,31.742,76.771,32.902,75.347,32.903z M108.61,18.2c-3.345,0-6.066-2.723-6.066-6.065c0-3.344,2.722-6.066,6.066-6.066
|
||||
c3.344,0,6.066,2.723,6.066,6.066C114.677,15.478,111.954,18.2,108.61,18.2z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 7.3 KiB |
|
|
@ -1,17 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'Magento_Ui/js/form/element/abstract'
|
||||
], function (Abstract) {
|
||||
'use strict';
|
||||
|
||||
return Abstract.extend({
|
||||
/** @inheritdoc */
|
||||
onUpdate: function () {
|
||||
this.bubble('update', this.hasChanged());
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'Magento_AdminNotification/js/grid/listing',
|
||||
'Magento_Ui/js/modal/alert',
|
||||
'mage/translate',
|
||||
'underscore',
|
||||
'jquery'
|
||||
], function (Listing, uiAlert, $t, _, $) {
|
||||
'use strict';
|
||||
|
||||
return Listing.extend({
|
||||
defaults: {
|
||||
isAllowed: true,
|
||||
ajaxSettings: {
|
||||
method: 'POST',
|
||||
data: {},
|
||||
url: '${ $.dismissUrl }'
|
||||
}
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
initialize: function () {
|
||||
_.bindAll(this, 'reload', 'onError');
|
||||
|
||||
return this._super();
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismiss all items.
|
||||
*/
|
||||
dismissAll: function () {
|
||||
var toDismiss = [];
|
||||
|
||||
_.each(this.rows, function (row) {
|
||||
if (row.dismiss) {
|
||||
toDismiss.push(row.uuid);
|
||||
}
|
||||
});
|
||||
toDismiss.length && this.dismiss(toDismiss);
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismiss action.
|
||||
*
|
||||
* @param {Array} items
|
||||
*/
|
||||
dismiss: function (items) {
|
||||
var config = _.extend({}, this.ajaxSettings);
|
||||
|
||||
config.data.uuid = items;
|
||||
this.showLoader();
|
||||
|
||||
$.ajax(config)
|
||||
.done(this.reload)
|
||||
.fail(this.onError);
|
||||
},
|
||||
|
||||
/**
|
||||
* Success callback for dismiss request.
|
||||
*/
|
||||
reload: function () {
|
||||
this.source.reload({
|
||||
refresh: true
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Error callback for dismiss request.
|
||||
*
|
||||
* @param {Object} xhr
|
||||
*/
|
||||
onError: function (xhr) {
|
||||
this.hideLoader();
|
||||
|
||||
if (xhr.statusText === 'abort') {
|
||||
return;
|
||||
}
|
||||
|
||||
uiAlert({
|
||||
content: $t('Something went wrong.')
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'Magento_Ui/js/form/components/insert-form',
|
||||
'uiRegistry'
|
||||
], function (Insert, registry) {
|
||||
'use strict';
|
||||
|
||||
return Insert.extend({
|
||||
defaults: {
|
||||
modalProvider: '${ $.parentName }',
|
||||
titlePrefix: '',
|
||||
imports: {
|
||||
changeModalTitle: '${ $.modalProvider }:state'
|
||||
},
|
||||
listens: {
|
||||
responseData: 'afterRetry'
|
||||
},
|
||||
modules: {
|
||||
modal: '${ $.modalProvider }',
|
||||
notificationListing: '${ $.columnsProvider }'
|
||||
}
|
||||
},
|
||||
|
||||
/** @inheritdoc */
|
||||
initConfig: function () {
|
||||
var modalTitleProvider;
|
||||
|
||||
this._super();
|
||||
modalTitleProvider = this.modalTitleProvider.split(':');
|
||||
this.modalTitleTarget = modalTitleProvider[0];
|
||||
this.modalTitlePath = modalTitleProvider[1];
|
||||
},
|
||||
|
||||
/**
|
||||
* Change modal title.
|
||||
*
|
||||
* @param {Boolean} change
|
||||
*/
|
||||
changeModalTitle: function (change) {
|
||||
if (change) {
|
||||
registry.get(this.modalTitleTarget, function (target) {
|
||||
this.modal().setTitle(this.titlePrefix + target.get(this.modalTitlePath));
|
||||
}.bind(this));
|
||||
} else {
|
||||
this.modal().setTitle('');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Action after retry operation.
|
||||
*
|
||||
* @param {Object} data
|
||||
*/
|
||||
afterRetry: function (data) {
|
||||
if (!data.error) {
|
||||
this.modal().closeModal();
|
||||
this.notificationListing().reload();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div css="$data.additionalClasses"
|
||||
if="error"
|
||||
text="error"></div>
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div class="action-menu-item action-close-wrapper">
|
||||
<button class="action-close"
|
||||
repeat="foreach: $col.getVisibleActions($row()._rowIndex), item: '$action'"
|
||||
click="$col.getActionHandler($action())"
|
||||
attr="{
|
||||
title: $action().label
|
||||
}"
|
||||
></button>
|
||||
</div>
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<div id="system_messages" class="message-system" collapsible visible="totalRecords">
|
||||
<div class="message-system-inner" outerClick="fixLoaderHeight.bind($data, true)">
|
||||
<div class="message-system-short">
|
||||
<button class="message-system-action-dropdown" toggleCollapsible>
|
||||
<span>
|
||||
<translate args="'System Messages'"></translate>:
|
||||
<text args="totalRecords"></text>
|
||||
</span>
|
||||
</button>
|
||||
<div class="message-system-short-wrapper" if="rows[0]" repeat="foreach: [rows[0]], item: '$row'" visible="!$collapsible.opened()">
|
||||
<fastForEach args="data: getVisible(), as: '$col'" >
|
||||
<render args="$col.getBody()"></render>
|
||||
</fastForEach>
|
||||
</div>
|
||||
</div>
|
||||
<div class="message-system-collapsible">
|
||||
<ul class="message-system-list">
|
||||
<li repeat="foreach: rows, item: '$row'">
|
||||
<fastForEach args="data: getVisible(), as: '$col'" >
|
||||
<render args="$col.getBody()"></render>
|
||||
</fastForEach>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="message-system-summary" if="isAllowed">
|
||||
<a class="action__message-log"
|
||||
href="#"
|
||||
click="dismissAll"
|
||||
text="dismissAllText"></a>
|
||||
<a class="action__message-log"
|
||||
attr="{
|
||||
href: link
|
||||
}"
|
||||
text="linkText"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
Before Width: | Height: | Size: 100 B |
|
Before Width: | Height: | Size: 85 B |
|
Before Width: | Height: | Size: 368 B |
|
Before Width: | Height: | Size: 253 B |
|
Before Width: | Height: | Size: 679 B |
|
Before Width: | Height: | Size: 11 KiB |
|
|
@ -1,10 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
require([
|
||||
'Magento_Variable/variables',
|
||||
'mage/adminhtml/browser'
|
||||
]);
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/*global FORM_KEY*/
|
||||
define([
|
||||
'jquery',
|
||||
'chartJs',
|
||||
'jquery-ui-modules/widget',
|
||||
'chartjs/chartjs-adapter-moment',
|
||||
'chartjs/es6-shim.min',
|
||||
'moment'
|
||||
], function ($, Chart) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.dashboardChart', {
|
||||
options: {
|
||||
updateUrl: '',
|
||||
periodSelect: null,
|
||||
periodUnits: [],
|
||||
precision: 0,
|
||||
type: ''
|
||||
},
|
||||
chart: null,
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_create: function () {
|
||||
this.createChart();
|
||||
|
||||
if (this.options.periodSelect) {
|
||||
$(document).on('change', this.options.periodSelect, this.refreshChartData.bind(this));
|
||||
|
||||
this.period = $(this.options.periodSelect).val();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
createChart: function () {
|
||||
this.chart = new Chart(this.element, this.getChartSettings());
|
||||
this.refreshChartData();
|
||||
},
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
refreshChartData: function () {
|
||||
var data = {
|
||||
'form_key': FORM_KEY
|
||||
};
|
||||
|
||||
if (this.options.periodSelect) {
|
||||
this.period = data.period = $(this.options.periodSelect).val();
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: this.options.updateUrl,
|
||||
showLoader: true,
|
||||
data: data,
|
||||
dataType: 'json',
|
||||
type: 'POST',
|
||||
success: this.updateChart.bind(this)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @public
|
||||
* @param {Object} response
|
||||
*/
|
||||
updateChart: function (response) {
|
||||
$(this.element).toggle(response.data.length > 0);
|
||||
$(this.element).next('.dashboard-diagram-nodata').toggle(response.data.length === 0);
|
||||
|
||||
this.chart.options.scales.xAxis.time.unit = this.options.periodUnits[this.period] ?
|
||||
this.options.periodUnits[this.period] : 'hour';
|
||||
this.chart.data.datasets[0].data = response.data;
|
||||
this.chart.data.datasets[0].label = response.label;
|
||||
this.chart.update();
|
||||
},
|
||||
|
||||
/**
|
||||
* @returns {Object} chart object configuration
|
||||
*/
|
||||
getChartSettings: function () {
|
||||
return {
|
||||
type: 'bar',
|
||||
data: {
|
||||
datasets: [{
|
||||
yAxisID: 'yAxis',
|
||||
xAxisID: 'xAxis',
|
||||
data: [],
|
||||
backgroundColor: '#f1d4b3',
|
||||
borderColor: '#eb5202',
|
||||
borderWidth: 1
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
legend: {
|
||||
onClick: this.handleChartLegendClick,
|
||||
position: 'bottom'
|
||||
},
|
||||
scales: {
|
||||
xAxis: {
|
||||
offset: true,
|
||||
type: 'time',
|
||||
ticks: {
|
||||
source: 'data'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
ticks: {
|
||||
beginAtZero: true,
|
||||
precision: this.options.precision
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
handleChartLegendClick: function () {
|
||||
// don't hide dataset on clicking into legend item
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.dashboardChart;
|
||||
});
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/*global FORM_KEY*/
|
||||
define([
|
||||
'jquery',
|
||||
'jquery-ui-modules/widget'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.dashboardTotals', {
|
||||
options: {
|
||||
updateUrl: '',
|
||||
periodSelect: null
|
||||
},
|
||||
elementId: null,
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_create: function () {
|
||||
this.elementId = $(this.element).attr('id');
|
||||
|
||||
if (this.options.periodSelect) {
|
||||
$(document).on('change', this.options.periodSelect, $.proxy(function () {
|
||||
this.refreshTotals();
|
||||
}, this));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
refreshTotals: function () {
|
||||
var periodParam = '';
|
||||
|
||||
if (this.options.periodSelect && $(this.options.periodSelect).val()) {
|
||||
periodParam = 'period/' + $(this.options.periodSelect).val() + '/';
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: this.options.updateUrl + periodParam,
|
||||
showLoader: true,
|
||||
data: {
|
||||
'form_key': FORM_KEY
|
||||
},
|
||||
dataType: 'html',
|
||||
type: 'POST',
|
||||
success: $.proxy(function (response) {
|
||||
$('#' + this.elementId).replaceWith(response);
|
||||
}, this)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.dashboardTotals;
|
||||
});
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Backend/js/validate-store'
|
||||
], function ($, validateStore) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.deleteWithConfirm', validateStore, {});
|
||||
|
||||
return $.mage.deleteWithConfirm;
|
||||
});
|
||||
|
|
@ -1,147 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
|
||||
/*global byteConvert*/
|
||||
define([
|
||||
'jquery',
|
||||
'mage/template',
|
||||
'Magento_Ui/js/modal/alert',
|
||||
'Magento_Ui/js/form/element/file-uploader',
|
||||
'mage/translate',
|
||||
'jquery/file-uploader'
|
||||
], function ($, mageTemplate, alert, FileUploader) {
|
||||
'use strict';
|
||||
|
||||
var fileUploader = new FileUploader({
|
||||
dataScope: '',
|
||||
isMultipleFiles: true
|
||||
});
|
||||
|
||||
fileUploader.initUploader();
|
||||
|
||||
$.widget('mage.mediaUploader', {
|
||||
|
||||
/**
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
_create: function () {
|
||||
var self = this,
|
||||
progressTmpl = mageTemplate('[data-template="uploader"]'),
|
||||
isResizeEnabled = this.options.isResizeEnabled,
|
||||
resizeConfiguration = {
|
||||
action: 'resizeImage',
|
||||
maxWidth: this.options.maxWidth,
|
||||
maxHeight: this.options.maxHeight
|
||||
};
|
||||
|
||||
if (!isResizeEnabled) {
|
||||
resizeConfiguration = {
|
||||
action: 'resizeImage'
|
||||
};
|
||||
}
|
||||
|
||||
this.element.find('input[type=file]').fileupload({
|
||||
dataType: 'json',
|
||||
formData: {
|
||||
'form_key': window.FORM_KEY
|
||||
},
|
||||
dropZone: this.element.find('input[type=file]').closest('[role="dialog"]'),
|
||||
sequentialUploads: true,
|
||||
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
|
||||
maxFileSize: this.options.maxFileSize,
|
||||
|
||||
/**
|
||||
* @param {Object} e
|
||||
* @param {Object} data
|
||||
*/
|
||||
add: function (e, data) {
|
||||
var fileSize,
|
||||
tmpl;
|
||||
|
||||
$.each(data.files, function (index, file) {
|
||||
fileSize = typeof file.size == 'undefined' ?
|
||||
$.mage.__('We could not detect a size.') :
|
||||
byteConvert(file.size);
|
||||
|
||||
data.fileId = Math.random().toString(33).substr(2, 18);
|
||||
|
||||
tmpl = progressTmpl({
|
||||
data: {
|
||||
name: file.name,
|
||||
size: fileSize,
|
||||
id: data.fileId
|
||||
}
|
||||
});
|
||||
|
||||
$(tmpl).appendTo(self.element);
|
||||
});
|
||||
|
||||
$(this).fileupload('process', data).done(function () {
|
||||
data.submit();
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} e
|
||||
* @param {Object} data
|
||||
*/
|
||||
done: function (e, data) {
|
||||
if (data.result && !data.result.error) {
|
||||
self.element.trigger('addItem', data.result);
|
||||
} else {
|
||||
fileUploader.aggregateError(data.files[0].name, data.result.error);
|
||||
}
|
||||
|
||||
self.element.find('#' + data.fileId).remove();
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} e
|
||||
* @param {Object} data
|
||||
*/
|
||||
progress: function (e, data) {
|
||||
var progress = parseInt(data.loaded / data.total * 100, 10),
|
||||
progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar';
|
||||
|
||||
self.element.find(progressSelector).css('width', progress + '%');
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Object} e
|
||||
* @param {Object} data
|
||||
*/
|
||||
fail: function (e, data) {
|
||||
var progressSelector = '#' + data.fileId;
|
||||
|
||||
self.element.find(progressSelector).removeClass('upload-progress').addClass('upload-failure')
|
||||
.delay(2000)
|
||||
.hide('highlight')
|
||||
.remove();
|
||||
},
|
||||
|
||||
stop: fileUploader.uploaderConfig.stop
|
||||
});
|
||||
|
||||
this.element.find('input[type=file]').fileupload('option', {
|
||||
processQueue: [{
|
||||
action: 'loadImage',
|
||||
fileTypes: /^image\/(gif|jpeg|png)$/
|
||||
},
|
||||
resizeConfiguration,
|
||||
{
|
||||
action: 'saveImage'
|
||||
}]
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.mediaUploader;
|
||||
});
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Backend/js/validate-store'
|
||||
], function ($, validateStore) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.saveWithConfirm', validateStore, {
|
||||
|
||||
/**
|
||||
* Check is it need to show confirmation popup
|
||||
*
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
_needConfirm: function () {
|
||||
|
||||
var storeData = this.settings.storeData,
|
||||
|
||||
/* edit store view*/
|
||||
storeViewEdit = $('[name="store[store_id]"]').length,
|
||||
groupId = $('[name="store[group_id]"]').val(),
|
||||
isNewStoreView = !$('[name="store[store_id]"]').val(),
|
||||
|
||||
/* edit store */
|
||||
storeEdit = $('[name="group[group_id]"]').length,
|
||||
storeId = $('[name="group[group_id]"]').val(),
|
||||
rootCategoryId = $('[name="group[root_category_id]"]').val(),
|
||||
defaultStoreView = $('[name="group[default_store_id]"]').val(),
|
||||
|
||||
/* edit website */
|
||||
websiteEdit = $('[name="website[website_id]"]').length,
|
||||
defaultStore = $('[name="website[default_group_id]"]').val(),
|
||||
|
||||
/* conditions */
|
||||
storeViewUpdated = storeViewEdit && (isNewStoreView || storeData['group_id'] !== groupId),
|
||||
storeUpdated = storeEdit && storeId &&
|
||||
(rootCategoryId !== null && storeData['root_category_id'] !== rootCategoryId ||
|
||||
defaultStoreView !== null && storeData['default_store_id'] !== defaultStoreView),
|
||||
websiteUpdated = websiteEdit && defaultStore !== null && storeData['default_group_id'] !== defaultStore;
|
||||
|
||||
return storeViewUpdated || storeUpdated || websiteUpdated;
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.saveWithConfirm;
|
||||
});
|
||||
|
|
@ -1,127 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery'
|
||||
], function ($) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @param {Object} storeSwitchConfig
|
||||
*/
|
||||
return function (storeSwitchConfig) {
|
||||
var scopeSwitcherHandler;
|
||||
|
||||
(function () {
|
||||
var storesList = $('[data-role=stores-list]');
|
||||
|
||||
storesList.on('click', '[data-value]', function (event) {
|
||||
var val = $(event.target).data('value'),
|
||||
role = $(event.target).data('role'),
|
||||
switcher = $('[data-role=' + role + ']');
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
if (!switcher.val() || val !== switcher.val()) {
|
||||
|
||||
/* Set the value & trigger event */
|
||||
switcher.val(val).trigger('change');
|
||||
}
|
||||
});
|
||||
})($);
|
||||
|
||||
/**
|
||||
* Switch store scope
|
||||
*
|
||||
* @param {Object} obj
|
||||
* @return void
|
||||
*/
|
||||
function switchScope(obj) {
|
||||
var switcher = $(obj),
|
||||
scopeId = switcher.val(),
|
||||
scopeParams = '',
|
||||
switcherParams = {};
|
||||
|
||||
if (scopeId) {
|
||||
scopeParams = switcher.data('param') + '/' + scopeId + '/';
|
||||
}
|
||||
|
||||
if (obj.switchParams) {
|
||||
scopeParams += obj.switchParams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload function for switcher
|
||||
*/
|
||||
function reload() {
|
||||
var url;
|
||||
|
||||
if (!storeSwitchConfig.isUsingIframe) {
|
||||
|
||||
if (storeSwitchConfig.switchUrl && storeSwitchConfig.switchUrl.length > 0) {
|
||||
url = storeSwitchConfig.switchUrl + scopeParams;
|
||||
|
||||
/* eslint-disable no-undef */
|
||||
setLocation(url);
|
||||
}
|
||||
|
||||
} else {
|
||||
$('#preview_selected_store').val(scopeId);
|
||||
$('#preview_form').trigger('submit');
|
||||
|
||||
$('.store-switcher .dropdown-menu li a').each(function () {
|
||||
var $this = $(this);
|
||||
|
||||
if ($this.data('role') === 'store-view-id' && $this.data('value') === scopeId) {
|
||||
$('#store-change-button').html($this.text());
|
||||
}
|
||||
});
|
||||
|
||||
$('#store-change-button').trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof scopeSwitcherHandler !== 'undefined') {
|
||||
switcherParams = {
|
||||
scopeId: scopeId,
|
||||
scopeParams: scopeParams,
|
||||
useConfirm: storeSwitchConfig.useConfirm
|
||||
};
|
||||
|
||||
scopeSwitcherHandler(switcherParams);
|
||||
} else if (storeSwitchConfig.useConfirm) {
|
||||
require([
|
||||
'Magento_Ui/js/modal/confirm',
|
||||
'mage/translate'
|
||||
], function (confirm, $t) {
|
||||
confirm({
|
||||
content: $t('Please confirm scope switching. All data that hasn\'t been saved will be lost.'),
|
||||
actions: {
|
||||
|
||||
/**
|
||||
* Confirm action
|
||||
*/
|
||||
confirm: function () {
|
||||
reload();
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel action
|
||||
*/
|
||||
cancel: function () {
|
||||
obj.value = storeSwitchConfig.storeId ? storeSwitchConfig.storeId : '';
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
reload();
|
||||
}
|
||||
}
|
||||
|
||||
window.scopeSwitcherHandler = scopeSwitcherHandler;
|
||||
window.switchScope = switchScope;
|
||||
};
|
||||
});
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/* eslint-disable strict */
|
||||
define([
|
||||
'jquery',
|
||||
'mage/mage'
|
||||
], function ($) {
|
||||
$.extend(true, $, {
|
||||
mage: {
|
||||
translate: (function () {
|
||||
/**
|
||||
* Key-value translations storage
|
||||
* @type {Object}
|
||||
* @private
|
||||
*/
|
||||
var _data = {};
|
||||
|
||||
/**
|
||||
* Add new translation (two string parameters) or several translations (object)
|
||||
*/
|
||||
this.add = function () {
|
||||
if (arguments.length > 1) {
|
||||
_data[arguments[0]] = arguments[1];
|
||||
} else if (typeof arguments[0] === 'object') {
|
||||
$.extend(_data, arguments[0]);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Make a translation with parsing (to handle case when _data represents tuple)
|
||||
* @param {String} text
|
||||
* @return {String}
|
||||
*/
|
||||
this.translate = function (text) {
|
||||
return typeof _data[text] === 'string' ? _data[text] : text;
|
||||
};
|
||||
|
||||
return this;
|
||||
}())
|
||||
}
|
||||
});
|
||||
$.mage.__ = $.proxy($.mage.translate.translate, $.mage.translate);
|
||||
|
||||
return $.mage.__;
|
||||
});
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'jquery/ui',
|
||||
'mage/dataPost',
|
||||
'mage/backend/validation',
|
||||
'Magento_Ui/js/modal/confirm'
|
||||
], function ($, jqueryUi, dataPost, validation, modalConfirm) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.storeValidation', {
|
||||
|
||||
/**
|
||||
* Validation creation
|
||||
* @protected
|
||||
*/
|
||||
_create: function () {
|
||||
var form = this.element[0],
|
||||
validator = $.data(form, 'validator');
|
||||
|
||||
if (validator && validator.settings) {
|
||||
validator.settings.submitHandler = this._saveHandler;
|
||||
validator.settings.confirmCallback = this._needConfirm;
|
||||
$.extend(validator.settings, this.options);
|
||||
$.data(form, 'validator', validator);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Check is it need to show confirmation popup
|
||||
*
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
_needConfirm: function () {
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Save form with confirmation if needed
|
||||
*
|
||||
* @param {Object} form
|
||||
* @private
|
||||
*/
|
||||
_saveHandler: function (form) {
|
||||
var formData = {},
|
||||
requestData = {},
|
||||
options = $.data(form, 'validator').settings;
|
||||
|
||||
if ($(form).validation('isValid')) {
|
||||
$.each($(form).serializeArray(), function () {
|
||||
formData[this.name] = this.value || '';
|
||||
});
|
||||
requestData = {
|
||||
action: $(form).attr('action'),
|
||||
data: formData
|
||||
};
|
||||
|
||||
if (options.confirmCallback.call(this)) {
|
||||
modalConfirm({
|
||||
title: $.mage.__('Warning message'),
|
||||
content: $.mage.__('This operation can take a long time'),
|
||||
actions: {
|
||||
/**
|
||||
* 'Confirm' action handler.
|
||||
*/
|
||||
confirm: function () {
|
||||
$('body').trigger('processStart');
|
||||
dataPost().postData(requestData);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
dataPost().postData(requestData);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return $.mage.storeValidation;
|
||||
});
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<button class="action-delete"
|
||||
data-bind="
|
||||
click: function(){ $parent.processingDeleteRecord($record().index, $record().recordId); },
|
||||
attr: {
|
||||
title: $parent.deleteButtonLabel
|
||||
}
|
||||
">
|
||||
<span translate="$parent.deleteButtonLabel"></span>
|
||||
</button>
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
|
||||
<div class="admin__field-complex" if="$data.addButton">
|
||||
<div class="admin__field-complex-title">
|
||||
<span class="label" translate="'User Agent Rules'"></span>
|
||||
</div>
|
||||
|
||||
<div class="admin__field-complex-elements">
|
||||
<render args="fallbackResetTpl" if="$data.showFallbackReset && $data.isDifferedFromDefault"></render>
|
||||
<button attr="{disabled: disabled}"
|
||||
class="action-secondary"
|
||||
type="button"
|
||||
click="processingAddChild.bind($data, false, false, false)">
|
||||
<span translate="addButtonLabel"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="admin__field-complex-content"
|
||||
translate="'User agent exceptions override product and CMS pages rules.'"></div>
|
||||
</div>
|
||||
|
||||
<div class="admin__field admin__field-wide"
|
||||
visible="visible"
|
||||
disabled="disabled"
|
||||
css="$data.setClasses($data)"
|
||||
attr="'data-index': index">
|
||||
<label if="$data.label" class="admin__field-label" attr="for: $data.uid">
|
||||
<span translate="$data.label"></span>
|
||||
</label>
|
||||
|
||||
<div class="admin__field-control" data-role="grid-wrapper">
|
||||
<div class="admin__control-table-pagination" visible="!!element.getRecordCount()">
|
||||
<div class="admin__data-grid-pager">
|
||||
<button class="action-previous" type="button" data-bind="attr: {title: $t('Previous Page')}, click: previousPage, disable: isFirst()"></button>
|
||||
<input class="admin__control-text" type="number" data-bind="attr: {id: ++ko.uid}, value: currentPage"/>
|
||||
<label class="admin__control-support-text" data-bind="attr: {for: ko.uid}, text: 'of ' + pages()"></label>
|
||||
<button class="action-next" type="button" data-bind="attr: {title: $t('Next Page')}, click: nextPage, disable: isLast()"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin__control-table-wrapper">
|
||||
<table class="admin__dynamic-rows data-grid" data-role="grid">
|
||||
<thead if="element.columnsHeader">
|
||||
<tr>
|
||||
<th if="$data.dndConfig.enabled"
|
||||
class="data-grid-draggable-row-cell"></th>
|
||||
|
||||
<th repeat="foreach: labels, item: '$label'"
|
||||
class="data-grid-th"
|
||||
visible="$label().visible"
|
||||
disable="$label().disabled"
|
||||
css="setClasses($label())">
|
||||
<span translate="$label().label"></span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr repeat="foreach: elems, item: '$record'"
|
||||
class="data-row"
|
||||
css="'_odd-row': $index % 2">
|
||||
<td if="dndConfig.enabled"
|
||||
class="data-grid-draggable-row-cell"
|
||||
template="name: dndConfig.template, data: dnd"></td>
|
||||
|
||||
<!-- ko foreach: { data: $record().elems(), as: 'elem'} -->
|
||||
<td if="elem.template"
|
||||
visible="elem.visible() && elem.formElement !== 'hidden'"
|
||||
disable="elem.disabled"
|
||||
css="$parent.setClasses(elem)"
|
||||
template="elem.template"
|
||||
attr="'data-index': index"></td>
|
||||
<!-- /ko -->
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="messages">
|
||||
<div class="message message-notice notice">
|
||||
<span
|
||||
translate="'Search strings are either normal strings or regular expressions (PCRE). They are matched in the same order as entered.'"></span>
|
||||
<br/>
|
||||
<span
|
||||
translate="'Examples'"></span>:
|
||||
<span class="code-sample">Firefox: /^mozilla/i</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<!--
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
-->
|
||||
<button class="action-tertiary"
|
||||
click="element.restoreToDefault">
|
||||
<span translate="'Use Default Value'"></span>
|
||||
</button>
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
#bundle_product_container .tier {
|
||||
margin-bottom: 13px;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-qty > input[type='text'] {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-name {
|
||||
max-width: 250px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-sku {
|
||||
max-width: 170px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-draggable {
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-actions {
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
#bundle_product_container .col-qty,
|
||||
#bundle_product_container .col-uqty,
|
||||
#bundle_product_container .col-default {
|
||||
width: 70px;
|
||||
}
|
||||
|
||||
#bundle_product_container .field-option-req .control {
|
||||
top: 39px;
|
||||
}
|
||||
|
||||
.selection-search .massaction {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Sku, Price, Weight Fields */
|
||||
.field-sku .control .sku {
|
||||
display: inline-block;
|
||||
width: 140px;
|
||||
margin-right: 11px;
|
||||
}
|
||||
|
||||
.field-sku .control .sku > input[type='text'] {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.field-price .addon > .price {
|
||||
display: table;
|
||||
direction: rtl;
|
||||
float: left;
|
||||
width: 140px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.field-price .addon > .price > * {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.field-price .addon > .price + .select {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.field-weight .weight {
|
||||
display: inline-block;
|
||||
margin-right: 15px;
|
||||
vertical-align: top;
|
||||
width: 140px;
|
||||
}
|
||||
|
||||
.field-weight .weight .admin__control-addon .input-text {
|
||||
min-width: 10rem;
|
||||
}
|
||||
|
||||
.field-weight .weight .admin__control-addon .input-text,
|
||||
.field-weight .weight .admin__control-addon .admin__addon-suffix {
|
||||
flex-basis: 10rem;
|
||||
}
|
||||
|
||||
.ie9 .field-weight .weight .admin__control-addon .input-text {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.weight-switcher .admin__control-addon {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.field-weight .weight .field:first-child {
|
||||
width: 100%;
|
||||
}
|
||||
|
|
@ -1,297 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
/*global FORM_KEY*/
|
||||
/*global bSelection*/
|
||||
/**
|
||||
* @api
|
||||
*/
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Catalog/js/product/weight-handler',
|
||||
'Magento_Ui/js/modal/modal',
|
||||
'jquery/ui',
|
||||
'mage/translate',
|
||||
'Magento_Theme/js/sortable',
|
||||
'prototype'
|
||||
], function ($, weightHandler) {
|
||||
'use strict';
|
||||
|
||||
$.widget('mage.bundleProduct', {
|
||||
/** @inheritdoc */
|
||||
_create: function () {
|
||||
this._initOptionBoxes()
|
||||
._initSortableSelections()
|
||||
._bindCheckboxHandlers()
|
||||
._initCheckboxState()
|
||||
._bindAddSelectionDialog()
|
||||
._hideProductTypeSwitcher();
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_initOptionBoxes: function () {
|
||||
var syncOptionTitle;
|
||||
|
||||
this.element.sortable({
|
||||
axis: 'y',
|
||||
handle: '[data-role=draggable-handle]',
|
||||
items: '.option-box',
|
||||
update: this._updateOptionBoxPositions,
|
||||
tolerance: 'pointer'
|
||||
});
|
||||
|
||||
/**
|
||||
* @param {jQuery.Event} event
|
||||
*/
|
||||
syncOptionTitle = function (event) {
|
||||
var originalValue = $(event.target).attr('data-original-value'),
|
||||
currentValue = $(event.target).val(),
|
||||
optionBoxTitle = $('.title > span', $(event.target).closest('.option-box')),
|
||||
newOptionTitle = $.mage.__('New Option');
|
||||
|
||||
optionBoxTitle.text(currentValue === '' && !originalValue.length ? newOptionTitle : currentValue);
|
||||
};
|
||||
this._on({
|
||||
'change .field-option-title input[name$="[title]"]': syncOptionTitle,
|
||||
'keyup .field-option-title input[name$="[title]"]': syncOptionTitle,
|
||||
'paste .field-option-title input[name$="[title]"]': syncOptionTitle
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_initSortableSelections: function () {
|
||||
this.element.find('.option-box .form-list tbody').sortable({
|
||||
axis: 'y',
|
||||
handle: '[data-role=draggable-handle]',
|
||||
|
||||
/**
|
||||
* @param {jQuery.Event} event
|
||||
* @param {jQuery} ui
|
||||
* @return {jQuery}
|
||||
*/
|
||||
helper: function (event, ui) {
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
|
||||
return ui;
|
||||
},
|
||||
update: this._updateSelectionsPositions,
|
||||
tolerance: 'pointer'
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_initCheckboxState: function () {
|
||||
this.element.find('.is-required').each(function () {
|
||||
$(this).prop('checked', $(this).closest('.option-box').find('[name$="[required]"]').val() > 0);
|
||||
});
|
||||
|
||||
this.element.find('.is-user-defined-qty').each(function () {
|
||||
$(this).prop('checked', $(this).closest('.qty-box').find('.select').val() > 0);
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_bindAddSelectionDialog: function () {
|
||||
var widget = this;
|
||||
|
||||
this._on({
|
||||
/**
|
||||
* @param {jQuery.Event} event
|
||||
*/
|
||||
'click .add-selection': function (event) {
|
||||
var $optionBox = $(event.target).closest('.option-box'),
|
||||
$selectionGrid = $optionBox.find('.selection-search').clone(),
|
||||
optionIndex = $optionBox.attr('id').replace('bundle_option_', ''),
|
||||
productIds = [],
|
||||
productSkus = [],
|
||||
selectedProductList = {};
|
||||
|
||||
$optionBox.find('[name$="[product_id]"]').each(function () {
|
||||
if (!$(this).closest('tr').find('[name$="[delete]"]').val()) {
|
||||
productIds.push($(this).val());
|
||||
productSkus.push($(this).closest('tr').find('.col-sku').text());
|
||||
}
|
||||
});
|
||||
|
||||
bSelection.gridSelection.set(optionIndex, $H({}));
|
||||
bSelection.gridRemoval = $H({});
|
||||
bSelection.gridSelectedProductSkus = productSkus;
|
||||
|
||||
$selectionGrid.on('contentUpdated', bSelection.gridUpdateCallback);
|
||||
$selectionGrid.on('change', '.col-id input', function () {
|
||||
var tr = $(this).closest('tr');
|
||||
|
||||
if ($(this).is(':checked')) {
|
||||
selectedProductList[$(this).val()] = {
|
||||
name: tr.find('.col-name').html().trim(),
|
||||
sku: tr.find('.col-sku').html().trim(),
|
||||
'product_id': $(this).val(),
|
||||
'option_id': $('bundle_selection_id_' + optionIndex).val(),
|
||||
'selection_price_value': 0,
|
||||
'selection_qty': 1
|
||||
};
|
||||
} else {
|
||||
delete selectedProductList[$(this).val()];
|
||||
}
|
||||
});
|
||||
|
||||
$selectionGrid.modal({
|
||||
title: $optionBox.find('input[name$="[title]"]').val() === '' ?
|
||||
$.mage.__('Add Products to New Option') :
|
||||
$.mage.__('Add Products to Option "%1"').replace(
|
||||
'%1',
|
||||
$('<div>').text($optionBox.find('input[name$="[title]"]').val()).html()
|
||||
),
|
||||
modalClass: 'bundle',
|
||||
type: 'slide',
|
||||
|
||||
/**
|
||||
* @param {jQuery.Event} e
|
||||
* @param {Object} modalWindow
|
||||
*/
|
||||
closed: function (e, modalWindow) {
|
||||
modalWindow.modal.remove();
|
||||
},
|
||||
buttons: [{
|
||||
text: $.mage.__('Add Selected Products'),
|
||||
'class': 'action-primary action-add',
|
||||
|
||||
/** Click action. */
|
||||
click: function () {
|
||||
$.each(selectedProductList, function () {
|
||||
window.bSelection.addRow(optionIndex, this);
|
||||
});
|
||||
bSelection.gridRemoval.each(function (pair) {
|
||||
$optionBox.find('.col-sku').filter(function () {
|
||||
let text = $(this).text();
|
||||
|
||||
return text.trim() === pair.key; // find row by SKU
|
||||
}).closest('tr').find('button.delete').trigger('click');
|
||||
});
|
||||
widget.refreshSortableElements();
|
||||
widget._updateSelectionsPositions.apply(widget.element);
|
||||
$selectionGrid.modal('closeModal');
|
||||
}
|
||||
}]
|
||||
});
|
||||
$.ajax({
|
||||
url: bSelection.selectionSearchUrl,
|
||||
dataType: 'html',
|
||||
data: {
|
||||
index: optionIndex,
|
||||
products: productIds,
|
||||
'selected_products': productIds,
|
||||
'form_key': FORM_KEY
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {*} data
|
||||
*/
|
||||
success: function (data) {
|
||||
$selectionGrid.html(data).modal('openModal');
|
||||
},
|
||||
context: $('body'),
|
||||
showLoader: true
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_hideProductTypeSwitcher: function () {
|
||||
weightHandler.hideWeightSwitcher();
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_bindCheckboxHandlers: function () {
|
||||
this._on({
|
||||
/**
|
||||
* @param {jQuery.Event} event
|
||||
*/
|
||||
'change .is-required': function (event) {
|
||||
var $this = $(event.target);
|
||||
|
||||
$this.closest('.option-box').find('[name$="[required]"]').val($this.is(':checked') ? 1 : 0);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {jQuery.Event} event
|
||||
*/
|
||||
'change .is-user-defined-qty': function (event) {
|
||||
var $this = $(event.target);
|
||||
|
||||
$this.closest('.qty-box').find('.select').val($this.is(':checked') ? 1 : 0);
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_updateOptionBoxPositions: function () {
|
||||
$(this).find('[name^=bundle_options][name$="[position]"]').each(function (index) {
|
||||
$(this).val(index);
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Object}
|
||||
* @private
|
||||
*/
|
||||
_updateSelectionsPositions: function () {
|
||||
$(this).find('[name^=bundle_selections][name$="[position]"]').each(function (index) {
|
||||
$(this).val(index);
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @return {Object}
|
||||
*/
|
||||
refreshSortableElements: function () {
|
||||
this.element.sortable('refresh');
|
||||
this._updateOptionBoxPositions.apply(this.element);
|
||||
this._initSortableSelections();
|
||||
this._initCheckboxState();
|
||||
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'jquery',
|
||||
'Magento_Catalog/catalog/type-events',
|
||||
'Magento_Catalog/js/product/weight-handler'
|
||||
], function ($, productType, weight) {
|
||||
'use strict';
|
||||
|
||||
return {
|
||||
|
||||
/**
|
||||
* Constructor component
|
||||
*/
|
||||
'Magento_Bundle/js/bundle-type-handler': function () {
|
||||
this.bindAll();
|
||||
this._initType();
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind all
|
||||
*/
|
||||
bindAll: function () {
|
||||
$(document).on('changeTypeProduct', this._initType.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Init type
|
||||
* @private
|
||||
*/
|
||||
_initType: function () {
|
||||
if (
|
||||
productType.type.init === 'bundle' &&
|
||||
productType.type.current !== 'bundle' &&
|
||||
!weight.isLocked()
|
||||
) {
|
||||
weight.switchWeight();
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
define([
|
||||
'Magento_Ui/js/form/element/single-checkbox',
|
||||
'uiRegistry'
|
||||
], function (Checkbox, registry) {
|
||||
'use strict';
|
||||
|
||||
return Checkbox.extend({
|
||||
defaults: {
|
||||
clearing: false,
|
||||
parentContainer: '',
|
||||
parentSelections: '',
|
||||
changer: '',
|
||||
exports: {
|
||||
value: '${$.parentName}:isDefaultValue'
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
initObservable: function () {
|
||||
this._super().
|
||||
observe('elementTmpl');
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
initConfig: function () {
|
||||
this._super();
|
||||
this.imports.changeType = this.retrieveParentName(this.parentContainer) + '.' + this.changer + ':value';
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
onUpdate: function () {
|
||||
if (this.prefer === 'radio' && this.checked() && !this.clearing) {
|
||||
this.clearValues();
|
||||
}
|
||||
|
||||
this._super();
|
||||
},
|
||||
|
||||
/**
|
||||
* Checkbox to radio type changer.
|
||||
*
|
||||
* @param {String} type - type to change.
|
||||
*/
|
||||
changeType: function (type) {
|
||||
var typeMap = registry.get(this.retrieveParentName(this.parentContainer) + '.' + this.changer).typeMap;
|
||||
|
||||
this.prefer = typeMap[type];
|
||||
this.elementTmpl(this.templates[typeMap[type]]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Clears values in components like this.
|
||||
*/
|
||||
clearValues: function () {
|
||||
var records = registry.get(this.retrieveParentName(this.parentSelections)),
|
||||
index = this.index,
|
||||
uid = this.uid;
|
||||
|
||||
records.elems.each(function (record) {
|
||||
record.elems.filter(function (comp) {
|
||||
return comp.index === index && comp.uid !== uid;
|
||||
}).each(function (comp) {
|
||||
comp.clearing = true;
|
||||
comp.clear();
|
||||
comp.clearing = false;
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrieve name for the most global parent with provided index.
|
||||
*
|
||||
* @param {String} parent - parent name.
|
||||
* @returns {String}
|
||||
*/
|
||||
retrieveParentName: function (parent) {
|
||||
return this.name.replace(new RegExp('^(.+?\\.)?' + parent + '\\..+'), '$1' + parent);
|
||||
}
|
||||
});
|
||||
});
|
||||