/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* global FORM_KEY */
/**
* @api
*/
define([
'jquery',
'mage/template',
'uiRegistry',
'jquery/colorpicker/js/colorpicker',
'prototype',
'jquery/ui',
'validation'
], function (jQuery, mageTemplate, rg) {
'use strict';
return function (config) {
var swatchOptionVisualDefaultInputType = 'radio',
swatchVisualOption = {
table: $('swatch-visual-options-table'),
itemCount: 0,
totalItems: 0,
rendered: 0,
isReadOnly: config.isReadOnly,
template: mageTemplate('#swatch-visual-row-template'),
/**
* Add new option using template
*
* @param {Object} data
* @param {Object} render
*/
add: function (data, render) {
var isNewOption = false,
element;
if (typeof data.id == 'undefined') {
data = {
'id': 'option_' + this.itemCount,
'sort_order': this.itemCount + 1,
'empty_class': 'unavailable'
};
isNewOption = true;
} else if (data.defaultswatch0 === '') {
data['empty_class'] = 'unavailable';
}
if (!data.intype) {
data.intype = swatchOptionVisualDefaultInputType;
}
element = this.template({
data: data
});
if (isNewOption && !this.isReadOnly) {
this.enableNewOptionDeleteButton(data.id);
}
this.itemCount++;
this.totalItems++;
this.elements += element;
if (render) {
this.render();
}
},
/**
* ColorPicker initialization process
*/
initColorPicker: function () {
var element = this,
hiddenColorPicker = !jQuery(element).data('colorpickerId');
jQuery(this).ColorPicker({
/**
* ColorPicker onShow action
*/
onShow: function () {
var color = jQuery(element).parent().parent().prev().prev('input').val(),
menu = jQuery(this).parents('.swatch_sub-menu_container');
menu.hide();
jQuery(element).ColorPickerSetColor(color);
},
/**
* ColorPicker onSubmit action
*
* @param {String} hsb
* @param {String} hex
* @param {String} rgb
* @param {String} el
*/
onSubmit: function (hsb, hex, rgb, el) {
var container = jQuery(el).parent().parent().prev();
jQuery(el).ColorPickerHide();
container.parent().removeClass('unavailable');
container.prev('input').val('#' + hex);
container.css('background', '#' + hex);
}
});
if (hiddenColorPicker) {
jQuery(this).ColorPickerShow();
}
},
/**
* Remove action
*
* @param {Object} event
*/
remove: function (event) {
var element = $(Event.findElement(event, 'tr')),
elementFlags; // !!! Button already have table parent in safari
// Safari workaround
element.ancestors().each(function (parentItem) {
if (parentItem.hasClassName('option-row')) {
element = parentItem;
throw $break;
} else if (parentItem.hasClassName('box')) {
throw $break;
}
});
if (element) {
elementFlags = element.getElementsByClassName('delete-flag');
if (elementFlags[0]) {
elementFlags[0].value = 1;
}
element.addClassName('no-display');
element.addClassName('template');
element.hide();
this.totalItems--;
this.updateItemsCountField();
}
},
/**
* Update items count field
*/
updateItemsCountField: function () {
$('swatch-visual-option-count-check').value = this.totalItems > 0 ? '1' : '';
},
/**
* Enable delete button for new option
*
* @param {String} id
*/
enableNewOptionDeleteButton: function (id) {
$$('#delete_button_swatch_container_' + id + ' button').each(function (button) {
button.enable();
button.removeClassName('disabled');
});
},
/**
* Bind remove button
*/
bindRemoveButtons: function () {
jQuery('#swatch-visual-options-panel').on('click', '.delete-option', this.remove.bind(this));
},
/**
* Render options
*/
render: function () {
Element.insert($$('[data-role=swatch-visual-options-container]')[0], this.elements);
this.elements = '';
},
/**
* Render elements with delay (performance fix)
*
* @param {Object} data
* @param {Number} from
* @param {Number} step
* @param {Number} delay
* @returns {Boolean}
*/
renderWithDelay: function (data, from, step, delay) {
var arrayLength = data.length,
len;
for (len = from + step; from < len && from < arrayLength; from++) {
this.add(data[from]);
}
this.render();
if (from === arrayLength) {
this.updateItemsCountField();
this.rendered = 1;
jQuery('body').trigger('processStop');
return true;
}
setTimeout(this.renderWithDelay.bind(this, data, from, step, delay), delay);
},
/**
* Ignore validate action
*/
ignoreValidate: function () {
var ignore = '.ignore-validate input, ' +
'.ignore-validate select, ' +
'.ignore-validate textarea';
jQuery('#edit_form').data('validator').settings.forceIgnore = ignore;
}
};
if ($('add_new_swatch_visual_option_button')) {
Event.observe(
'add_new_swatch_visual_option_button',
'click',
swatchVisualOption.add.bind(swatchVisualOption, {}, true)
);
}
jQuery('#swatch-visual-options-panel').on('render', function () {
swatchVisualOption.ignoreValidate();
if (swatchVisualOption.rendered) {
return false;
}
jQuery('body').trigger('processStart');
swatchVisualOption.renderWithDelay(config.attributesData, 0, 100, 300);
swatchVisualOption.bindRemoveButtons();
jQuery('#swatch-visual-options-panel').on(
'click',
'.colorpicker_handler',
swatchVisualOption.initColorPicker
);
});
jQuery('body').on('click', function (event) {
var element = jQuery(event.target);
if (
element.parents('.swatch_sub-menu_container').length === 1 ||
element.next('div.swatch_sub-menu_container').length === 1
) {
return true;
}
jQuery('.swatch_sub-menu_container').hide();
});
if (config.isSortable) {
jQuery(function ($) {
$('[data-role=swatch-visual-options-container]').sortable({
distance: 8,
tolerance: 'pointer',
cancel: 'input, button',
axis: 'y',
/**
* Update component
*/
update: function () {
$('[data-role=swatch-visual-options-container] [data-role=order]').each(
function (index, element) {
$(element).val(index + 1);
}
);
}
});
});
}
window.swatchVisualOption = swatchVisualOption;
window.swatchOptionVisualDefaultInputType = swatchOptionVisualDefaultInputType;
rg.set('swatch-visual-options-panel', swatchVisualOption);
jQuery(function ($) {
var swatchComponents = {
/**
* div wrapper for to hide all evement
*/
wrapper: null,
/**
* iframe component to perform file upload without page reload
*/
iframe: null,
/**
* form component for upload image
*/
form: null,
/**
* Input file component for upload image
*/
inputFile: null,
/**
* Create swatch component for upload files
*
* @this {swatchComponents}
* @public
*/
create: function () {
this.wrapper = $('<div>').css({
display: 'none'
}).appendTo($('body'));
this.iframe = $('<iframe></iframe>', {
id: 'upload_iframe',
name: 'upload_iframe'
}).appendTo(this.wrapper);
this.form = $('<form></form>', {
id: 'swatch_form_image_upload',
name: 'swatch_form_image_upload',
target: 'upload_iframe',
method: 'post',
enctype: 'multipart/form-data',
class: 'ignore-validate',
action: config.uploadActionUrl
}).appendTo(this.wrapper);
this.inputFile = $('<input />', {
type: 'file',
name: 'datafile',
class: 'swatch_option_file'
}).appendTo(this.form);
$('<input />', {
type: 'hidden',
name: 'form_key',
value: FORM_KEY
}).appendTo(this.form);
}
};
/**
* Create swatch components
*/
swatchComponents.create();
/**
* Register event for swatch input[type=file] change
*/
swatchComponents.inputFile.change(function () {
var container = $('#' + $(this).attr('data-called-by')).parents().eq(2).children('.swatch_window'),
/**
* @this {iframe}
*/
iframeHandler = function () {
var imageParams = $.parseJSON($(this).contents().find('body').html()),
fullMediaUrl = imageParams['swatch_path'] + imageParams['file_path'];
container.prev('input').val(imageParams['file_path']);
container.css({
'background-image': 'url(' + fullMediaUrl + ')',
'background-size': 'cover'
});
container.parent().removeClass('unavailable');
};
swatchComponents.iframe.off('load');
swatchComponents.iframe.load(iframeHandler);
swatchComponents.form.submit();
$(this).val('');
});
/**
* Register event for choose "upload image" option
*/
$(document).on('click', '.btn_choose_file_upload', function () {
swatchComponents.inputFile.attr('data-called-by', $(this).attr('id'));
swatchComponents.inputFile.trigger('click');
});
/**
* Register event for remove option
*/
$(document).on('click', '.btn_remove_swatch', function () {
var optionPanel = $(this).parents().eq(2);
optionPanel.children('input').val('');
optionPanel.children('.swatch_window').css('background', '');
optionPanel.addClass('unavailable');
jQuery('.swatch_sub-menu_container').hide();
});
/**
* Toggle color upload chooser
*/
$(document).on('click', '.swatches-visual-col', function () {
var currentElement = $(this).find('.swatch_sub-menu_container');
jQuery('.swatch_sub-menu_container').not(currentElement).hide();
currentElement.toggle();
});
});
};
});
|