|
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
- define([
- 'underscore',
- 'jquery',
- 'mage/utils/objects'
- ], function (_, $, utils) {
- 'use strict';
-
- var defaultAttributes,
- ajaxSettings,
- map;
-
- defaultAttributes = {
- method: 'post',
- enctype: 'multipart/form-data'
- };
-
- ajaxSettings = {
- default: {
- method: 'POST',
- cache: false,
- processData: false,
- contentType: false
- },
- simple: {
- method: 'POST',
- dataType: 'json'
- }
- };
-
- map = {
- 'D': 'DDD',
- 'dd': 'DD',
- 'd': 'D',
- 'EEEE': 'dddd',
- 'EEE': 'ddd',
- 'e': 'd',
- 'yyyy': 'YYYY',
- 'yy': 'YY',
- 'y': 'YYYY',
- 'a': 'A'
- };
-
- return {
-
- /**
- * Generates a unique identifier.
- *
- * @param {Number} [size=7] - Length of a resulting identifier.
- * @returns {String}
- */
- uniqueid: function (size) {
- var code = Math.random() * 25 + 65 | 0,
- idstr = String.fromCharCode(code);
-
- size = size || 7;
-
- while (idstr.length < size) {
- code = Math.floor(Math.random() * 42 + 48);
-
- if (code < 58 || code > 64) {
- idstr += String.fromCharCode(code);
- }
- }
-
- return idstr;
- },
-
- /**
- * Limits function call.
- *
- * @param {Object} owner
- * @param {String} target
- * @param {Number} limit
- */
- limit: function (owner, target, limit) {
- var fn = owner[target];
-
- owner[target] = _.debounce(fn.bind(owner), limit);
- },
-
- /**
- * Converts mage date format to a moment.js format.
- *
- * @param {String} mageFormat
- * @returns {String}
- */
- normalizeDate: function (mageFormat) {
- var result = mageFormat;
-
- _.each(map, function (moment, mage) {
- result = result.replace(
- new RegExp(mage + '(?=([^\u0027]*\u0027[^\u0027]*\u0027)*[^\u0027]*$)'),
- moment
- );
- });
- result = result.replace(/'(.*?)'/g, '[$1]');
- return result;
- },
-
- /**
- * Puts provided value in range of min and max parameters.
- *
- * @param {Number} value - Value to be located.
- * @param {Number} min - Min value.
- * @param {Number} max - Max value.
- * @returns {Number}
- */
- inRange: function (value, min, max) {
- return Math.min(Math.max(min, value), max);
- },
-
- /**
- * Serializes and sends data via POST request.
- *
- * @param {Object} options - Options object that consists of
- * a 'url' and 'data' properties.
- * @param {Object} attrs - Attributes that will be added to virtual form.
- */
- submit: function (options, attrs) {
- var form = document.createElement('form'),
- data = utils.serialize(options.data),
- attributes = _.extend({}, defaultAttributes, attrs || {});
-
- if (!attributes.action) {
- attributes.action = options.url;
- }
-
- data['form_key'] = window.FORM_KEY;
-
- _.each(attributes, function (value, name) {
- form.setAttribute(name, value);
- });
-
- data = _.map(
- data,
- function (value, name) {
- return '<input type="hidden" ' +
- 'name="' + _.escape(name) + '" ' +
- 'value="' + _.escape(value) + '"' +
- ' />';
- }
- ).join('');
-
- form.insertAdjacentHTML('afterbegin', data);
- document.body.appendChild(form);
-
- form.submit();
- },
-
- /**
- * Serializes and sends data via AJAX POST request.
- *
- * @param {Object} options - Options object that consists of
- * a 'url' and 'data' properties.
- * @param {Object} config
- */
- ajaxSubmit: function (options, config) {
- var t = new Date().getTime(),
- settings;
-
- options.data['form_key'] = window.FORM_KEY;
- options.data = this.prepareFormData(options.data, config.ajaxSaveType);
- settings = _.extend({}, ajaxSettings[config.ajaxSaveType], options || {});
-
- if (!config.ignoreProcessEvents) {
- $('body').trigger('processStart');
- }
-
- return $.ajax(settings)
- .done(function (data) {
- if (config.response) {
- data.t = t;
- config.response.data(data);
- config.response.status(undefined);
- config.response.status(!data.error);
- }
- })
- .fail(function () {
- if (config.response) {
- config.response.status(undefined);
- config.response.status(false);
- config.response.data({
- error: true,
- messages: 'Something went wrong.',
- t: t
- });
- }
- })
- .always(function () {
- if (!config.ignoreProcessEvents) {
- $('body').trigger('processStop');
- }
- });
- },
-
- /**
- * Creates FormData object and append this data.
- *
- * @param {Object} data
- * @param {String} type
- * @returns {FormData}
- */
- prepareFormData: function (data, type) {
- var formData;
-
- if (type === 'default') {
- formData = new FormData();
- _.each(utils.serialize(data), function (val, name) {
- formData.append(name, val);
- });
- } else if (type === 'simple') {
- formData = utils.serialize(data);
- }
-
- return formData;
- },
-
- /**
- * Filters data object. Finds properties with suffix
- * and sets their values to properties with the same name without suffix.
- *
- * @param {Object} data - The data object that should be filtered
- * @param {String} suffix - The string by which data object should be filtered
- * @param {String} separator - The string that is separator between property and suffix
- *
- * @returns {Object} Filtered data object
- */
- filterFormData: function (data, suffix, separator) {
- data = data || {};
- suffix = suffix || 'prepared-for-send';
- separator = separator || '-';
-
- _.each(data, function (value, key) {
- if (_.isObject(value) && !Array.isArray(value)) {
- this.filterFormData(value, suffix, separator);
- } else if (_.isString(key) && ~key.indexOf(suffix)) {
- data[key.split(separator)[0]] = value;
- delete data[key];
- }
- }, this);
-
- return data;
- },
-
- /**
- * Replaces special characters with their corresponding HTML entities.
- *
- * @param {String} string - Text to escape.
- * @returns {String} Escaped text.
- */
- escape: function (string) {
- return string ? $('<p></p>').text(string).html().replace(/"/g, '"') : string;
- },
-
- /**
- * Replaces symbol codes with their unescaped counterparts.
- *
- * @param {String} data
- *
- * @returns {String}
- */
- unescape: function (data) {
- var unescaped = _.unescape(data),
- mapCharacters = {
- ''': '\''
- };
-
- _.each(mapCharacters, function (value, key) {
- unescaped = unescaped.replace(key, value);
- });
-
- return unescaped;
- },
-
- /**
- * Converts PHP IntlFormatter format to moment format.
- *
- * @param {String} format - PHP format
- * @returns {String} - moment compatible formatting
- */
- convertToMomentFormat: function (format) {
- var newFormat;
-
- newFormat = format.replace(/yyyy|yy|y/, 'YYYY'); // replace the year
- newFormat = newFormat.replace(/dd|d/g, 'DD'); // replace the date
-
- return newFormat;
- },
-
- /**
- * Get Url Parameters.
- *
- * @param {String} url - Url string
- * @returns {Object}
- */
- getUrlParameters: function (url) {
- var params = {},
- queries = url.split('?'),
- temp,
- i,
- l;
-
- if (!queries[1]) {
- return params;
- }
-
- queries = queries[1].split('&');
-
- for (i = 0, l = queries.length; i < l; i++) {
- temp = queries[i].split('=');
-
- if (temp[1]) {
- params[temp[0]] = decodeURIComponent(temp[1].replace(/\+/g, '%20'));
- } else {
- params[temp[0]] = '';
- }
- }
-
- return params;
- }
- };
- });
|