[*] BO : #PI-107 refactoring product page JS - adding ProductTabsManager
This commit is contained in:
@@ -90,40 +90,4 @@
|
|||||||
</table>
|
</table>
|
||||||
<div class="clear"> </div>
|
<div class="clear"> </div>
|
||||||
<input type="hidden" name="arrayAttachments" id="arrayAttachments" value="{foreach $attach1 as $attach}{$attach.id_attachment},{/foreach}" />
|
<input type="hidden" name="arrayAttachments" id="arrayAttachments" value="{foreach $attach1 as $attach}{$attach.id_attachment},{/foreach}" />
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#addAttachment").live('click', function() {
|
|
||||||
$("#selectAttachment2 option:selected").each(function(){
|
|
||||||
var val = $('#arrayAttachments').val();
|
|
||||||
var tab = val.split(',');
|
|
||||||
for (var i=0; i < tab.length; i++)
|
|
||||||
if (tab[i] == $(this).val())
|
|
||||||
return false;
|
|
||||||
$('#arrayAttachments').val(val+$(this).val()+',');
|
|
||||||
});
|
|
||||||
return !$("#selectAttachment2 option:selected").remove().appendTo("#selectAttachment1");
|
|
||||||
});
|
|
||||||
$("#removeAttachment").live('click', function() {
|
|
||||||
$("#selectAttachment1 option:selected").each(function(){
|
|
||||||
var val = $('#arrayAttachments').val();
|
|
||||||
var tab = val.split(',');
|
|
||||||
var tabs = '';
|
|
||||||
for (var i=0; i < tab.length; i++)
|
|
||||||
if (tab[i] != $(this).val())
|
|
||||||
{
|
|
||||||
tabs = tabs+','+tab[i];
|
|
||||||
$('#arrayAttachments').val(tabs);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return !$("#selectAttachment1 option:selected").remove().appendTo("#selectAttachment2");
|
|
||||||
});
|
|
||||||
$("#product").submit(function() {
|
|
||||||
$("#selectAttachment1 option").each(function(i) {
|
|
||||||
$(this).attr("selected", "selected");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -25,15 +25,15 @@
|
|||||||
*}
|
*}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
var msg_combination_1 = '{l s='Please choose an attribute'}';
|
||||||
|
var msg_combination_2 = '{l s='Please choose a value'}';
|
||||||
|
var msg_combination_3 = '{l s='You can only add one combination per type of attribute'}';
|
||||||
|
var msg_new_combination = '{l s='New combination'}';
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
{if $product->is_virtual}
|
{if $product->is_virtual}
|
||||||
$('#virtual_good_attributes').show();
|
$('#virtual_good_attributes').show();
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
var msg_combination_1 = '{l s='Please choose an attribute'}';
|
|
||||||
var msg_combination_2 = '{l s='Please choose a value'}';
|
|
||||||
var msg_combination_3 = '{l s='You can only add one combination per type of attribute'}';
|
|
||||||
var msg_new_combination = '{l s='New combination'}';
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -98,11 +98,4 @@
|
|||||||
<img src="../img/admin/add.gif" alt="new_features" title="{l s='Add a new feature'}" /> {l s='Add a new feature'}
|
<img src="../img/admin/add.gif" alt="new_features" title="{l s='Add a new feature'}" /> {l s='Add a new feature'}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function(){
|
|
||||||
displayFlags(languages, id_language, allowEmployeeFormLang);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
{block name="autoload_tinyMCE"}
|
{block name="autoload_tinyMCE"}
|
||||||
// Execute when tab Informations has finished loading
|
// Execute when tab Informations has finished loading
|
||||||
new ProductTab('Informations').onDisplay(function(){
|
tabs_manager.onLoad('Informations', function(){
|
||||||
// change each by click to load only on click
|
// change each by click to load only on click
|
||||||
$(".autoload_rte").each(function(e){
|
$(".autoload_rte").each(function(e){
|
||||||
tinySetup({
|
tinySetup({
|
||||||
@@ -93,17 +93,22 @@
|
|||||||
var post_data = {$post_data};
|
var post_data = {$post_data};
|
||||||
|
|
||||||
var product_type;
|
var product_type;
|
||||||
|
{*var is_pack = {$is_pack};
|
||||||
|
var is_virtual = {$product->is_virtual};
|
||||||
|
var mce_maximum = '{l s='Maximum'}';
|
||||||
|
var mce_characters = '{l s='characters'}';*}
|
||||||
|
|
||||||
$(document).ready(function()
|
$(document).ready(function()
|
||||||
{
|
{
|
||||||
product_type = $("input[name=type_product]:checked").val();
|
product_type = $("input[name=type_product]:checked").val();
|
||||||
$('#product-tab-content-wait').show();
|
$('#product-tab-content-wait').show();
|
||||||
{if $is_pack}
|
{if $is_pack}
|
||||||
new ProductTab('Informations').onDisplay(function(){
|
tabs_manager.onLoad('Informations', function(){
|
||||||
$('#pack_product').attr('checked', 'checked');
|
$('#pack_product').attr('checked', 'checked');
|
||||||
});
|
});
|
||||||
$('li.tab-row a[id*="VirtualProduct"]').hide();
|
$('li.tab-row a[id*="VirtualProduct"]').hide();
|
||||||
{elseif $product->is_virtual}
|
{elseif $product->is_virtual}
|
||||||
new ProductTab('Informations').onDisplay(function(){
|
tabs_manager.onLoad('Informations', function(){
|
||||||
$('#virtual_product').attr('checked', 'checked');
|
$('#virtual_product').attr('checked', 'checked');
|
||||||
$('#condition').attr('disabled', 'disabled');
|
$('#condition').attr('disabled', 'disabled');
|
||||||
$('#condition option[value=new]').attr('selected', 'selected');
|
$('#condition option[value=new]').attr('selected', 'selected');
|
||||||
@@ -111,7 +116,7 @@
|
|||||||
$('li.tab-row a[id*="Pack"]').hide();
|
$('li.tab-row a[id*="Pack"]').hide();
|
||||||
$('li.tab-row a[id*="Shipping"]').hide();
|
$('li.tab-row a[id*="Shipping"]').hide();
|
||||||
{else}
|
{else}
|
||||||
new ProductTab('Informations').onDisplay(function(){
|
tabs_manager.onLoad('Informations', function(){
|
||||||
$('#simple_product').attr('checked', 'checked');
|
$('#simple_product').attr('checked', 'checked');
|
||||||
});
|
});
|
||||||
$('li.tab-row a[id*="Pack"]').hide();
|
$('li.tab-row a[id*="Pack"]').hide();
|
||||||
@@ -159,20 +164,20 @@
|
|||||||
{
|
{
|
||||||
$('li.tab-row a[id*="VirtualProduct"]').show().click();
|
$('li.tab-row a[id*="VirtualProduct"]').show().click();
|
||||||
|
|
||||||
new ProductTab('VirtualProduct').onDisplay(function(){
|
tabs_manager.onLoad('VirtualProduct', function(){
|
||||||
$('#is_virtual_good').attr('checked', true);
|
$('#is_virtual_good').attr('checked', true);
|
||||||
$('#virtual_good').show();
|
$('#virtual_good').show();
|
||||||
$('#is_virtual').val(1);
|
$('#is_virtual').val(1);
|
||||||
$("#virtual_good_attributes").show();
|
$("#virtual_good_attributes").show();
|
||||||
});
|
});
|
||||||
|
|
||||||
new ProductTab('Quantities').onDisplay(function(){
|
tabs_manager.onLoad('Quantities', function(){
|
||||||
$('.stockForVirtualProduct').hide();
|
$('.stockForVirtualProduct').hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('li.tab-row a[id*="Shipping"]').hide();
|
$('li.tab-row a[id*="Shipping"]').hide();
|
||||||
|
|
||||||
new ProductTab('Informations').onDisplay(function(){
|
tabs_manager.onLoad('Informations', function(){
|
||||||
$('#condition').attr('disabled', 'disabled');
|
$('#condition').attr('disabled', 'disabled');
|
||||||
$('#condition option[value=refurbished]').removeAttr('selected');
|
$('#condition option[value=refurbished]').removeAttr('selected');
|
||||||
$('#condition option[value=used]').removeAttr('selected');
|
$('#condition option[value=used]').removeAttr('selected');
|
||||||
@@ -215,7 +220,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($("#product-tab-content-"+id).hasClass('not-loaded') && !$("#product-tab-content-"+id).hasClass('loading'))
|
if ($("#product-tab-content-"+id).hasClass('not-loaded') && !$("#product-tab-content-"+id).hasClass('loading'))
|
||||||
ProductTab.display(id, true, 0, null);
|
tabs_manager.display(id, true, 0, null);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$("#product-tab-content-"+id).show(0, function(){
|
$("#product-tab-content-"+id).show(0, function(){
|
||||||
@@ -249,7 +254,7 @@
|
|||||||
if ($('#product-tab-content-Associations').hasClass('not-loaded'))
|
if ($('#product-tab-content-Associations').hasClass('not-loaded'))
|
||||||
disableSave();
|
disableSave();
|
||||||
|
|
||||||
new ProductTab('Associations').onDisplay(function(){
|
tabs_manager.onLoad('Associations', function(){
|
||||||
handleSaveButtons();
|
handleSaveButtons();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -275,7 +280,7 @@
|
|||||||
{/foreach}
|
{/foreach}
|
||||||
|
|
||||||
// Recursively load tabs starting with the first element of stack
|
// Recursively load tabs starting with the first element of stack
|
||||||
ProductTab.display(tabs_to_preload[0], false, 0, tabs_to_preload);
|
tabs_manager.display(tabs_to_preload[0], false, 0, tabs_to_preload);
|
||||||
|
|
||||||
$('.productTabs').show();
|
$('.productTabs').show();
|
||||||
$('#product_form').show();
|
$('#product_form').show();
|
||||||
|
|||||||
@@ -115,31 +115,17 @@
|
|||||||
<td class="col-left"><label>{l s='Options:'}</label></td>
|
<td class="col-left"><label>{l s='Options:'}</label></td>
|
||||||
<td style="padding-bottom:5px;">
|
<td style="padding-bottom:5px;">
|
||||||
<ul class="listForm">
|
<ul class="listForm">
|
||||||
<li><input type="checkbox" name="available_for_order" id="available_for_order" value="1" {if $product->available_for_order}checked="checked"{/if} />
|
<li>
|
||||||
<script type="text/javascript">
|
<input type="checkbox" name="available_for_order" id="available_for_order" value="1" {if $product->available_for_order}checked="checked"{/if} />
|
||||||
$(document).ready(function()
|
<label for="available_for_order" class="t">{l s='available for order'}</label>
|
||||||
{
|
</li>
|
||||||
$("#available_for_order").click(function(){
|
|
||||||
if ($(this).is(':checked'))
|
|
||||||
{
|
|
||||||
$('#show_price').attr('checked', 'checked');
|
|
||||||
$('#show_price').attr('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$('#show_price').attr('disabled', '');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<label for="available_for_order" class="t">{l s='available for order'}</label></li>
|
|
||||||
<li>
|
<li>
|
||||||
<input type="checkbox" name="show_price" id="show_price" value="1" {if $product->show_price}checked="checked"{/if} {if $product->available_for_order}disabled="disabled"{/if}/>
|
<input type="checkbox" name="show_price" id="show_price" value="1" {if $product->show_price}checked="checked"{/if} {if $product->available_for_order}disabled="disabled"{/if}/>
|
||||||
<label for="show_price" class="t">{l s='show price'}</label>
|
<label for="show_price" class="t">{l s='show price'}</label>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<input type="checkbox" name="online_only" id="online_only" value="1" {if $product->online_only}checked="checked"{/if} />
|
<input type="checkbox" name="online_only" id="online_only" value="1" {if $product->online_only}checked="checked"{/if} />
|
||||||
<label for="online_only" class="t">{l s='online only (not sold in store)'}</label>
|
<label for="online_only" class="t">{l s='online only (not sold in store)'}</label>
|
||||||
</li>
|
</li>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -251,37 +237,6 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<script type="text/javascript">
|
|
||||||
$(function() {
|
|
||||||
changeTagImage();
|
|
||||||
$('#createImageDescription input').change(function(){
|
|
||||||
changeTagImage();
|
|
||||||
});
|
|
||||||
|
|
||||||
var i = 0;
|
|
||||||
$('.addImageDescription').click(function(){
|
|
||||||
if (i == 0){
|
|
||||||
$('#createImageDescription').animate({
|
|
||||||
opacity: 1, height: 'toggle'
|
|
||||||
}, 500);
|
|
||||||
i = 1;
|
|
||||||
}else{
|
|
||||||
$('#createImageDescription').animate({
|
|
||||||
opacity: 0, height: 'toggle'
|
|
||||||
}, 500);
|
|
||||||
i = 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function changeTagImage(){
|
|
||||||
var smallImage = $('input[name=smallImage]:checked').attr('value');
|
|
||||||
var leftRight = $('input[name=leftRight]:checked').attr('value');
|
|
||||||
var imageTypes = $('input[name=imageTypes]:checked').attr('value');
|
|
||||||
var tag = '[img-'+smallImage+'-'+leftRight+'-'+imageTypes+']';
|
|
||||||
$('#resultImage').val(tag);
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
{/if}
|
{/if}
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -25,138 +25,8 @@
|
|||||||
*}
|
*}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
var msg_select_one = '{l s='Please select at least one product.' js=1}';
|
var msg_select_one = '{l s='Please select at least one product.' js=1}';
|
||||||
var msg_set_quantity = '{l s='Please set a quantity to add a product.' js=1}';
|
var msg_set_quantity = '{l s='Please set a quantity to add a product.' js=1}';
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
if ($('#ppack').attr('checked'))
|
|
||||||
{
|
|
||||||
$('#ppack').attr('disabled', 'disabled');
|
|
||||||
$('#ppackdiv').show();
|
|
||||||
}
|
|
||||||
|
|
||||||
$('div.ppack').hide();
|
|
||||||
|
|
||||||
$('#curPackItemName').autocomplete('ajax_products_list.php', {
|
|
||||||
delay: 100,
|
|
||||||
minChars: 1,
|
|
||||||
autoFill: true,
|
|
||||||
max:20,
|
|
||||||
matchContains: true,
|
|
||||||
mustMatch:true,
|
|
||||||
scroll:false,
|
|
||||||
cacheLength:0,
|
|
||||||
// param multipleSeparator:'||' ajouté à cause de bug dans lib autocomplete
|
|
||||||
multipleSeparator:'||',
|
|
||||||
formatItem: function(item) {
|
|
||||||
return item[1]+' - '+item[0];
|
|
||||||
},
|
|
||||||
extraParams: {
|
|
||||||
excludeIds : getSelectedIds(),
|
|
||||||
excludeVirtuals : 1
|
|
||||||
}
|
|
||||||
}).result(function(event, item){
|
|
||||||
$('#curPackItemId').val(item[1]);
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
function addPackItem()
|
|
||||||
{
|
|
||||||
var curPackItemId = $('#curPackItemId').val();
|
|
||||||
var curPackItemName = $('#curPackItemName').val();
|
|
||||||
var curPackItemQty = $('#curPackItemQty').val();
|
|
||||||
if (curPackItemId == '' || curPackItemName == '')
|
|
||||||
{
|
|
||||||
jAlert(msg_select_one);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (curPackItemId == '' || curPackItemQty == '')
|
|
||||||
{
|
|
||||||
jAlert(msg_set_quantity);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var lineDisplay = curPackItemQty+ 'x ' +curPackItemName;
|
|
||||||
|
|
||||||
var divContent = $('#divPackItems').html();
|
|
||||||
divContent += lineDisplay;
|
|
||||||
divContent += '<span onclick="delPackItem(' + curPackItemId + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />';
|
|
||||||
|
|
||||||
// QTYxID-QTYxID
|
|
||||||
// @todo : it should be better to create input for each items and each qty
|
|
||||||
// instead of only one separated by x, - and ¤
|
|
||||||
var line = curPackItemQty+ 'x' +curPackItemId;
|
|
||||||
|
|
||||||
$('#inputPackItems').val($('#inputPackItems').val() + line + '-');
|
|
||||||
$('#divPackItems').html(divContent);
|
|
||||||
$('#namePackItems').val($('#namePackItems').val() + lineDisplay + '¤');
|
|
||||||
|
|
||||||
$('#curPackItemId').val('');
|
|
||||||
$('#curPackItemName').val('');
|
|
||||||
$('p.listOfPack').show();
|
|
||||||
|
|
||||||
$('#curPackItemName').setOptions({
|
|
||||||
extraParams: {
|
|
||||||
excludeIds : getSelectedIds()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// show / hide save buttons
|
|
||||||
// if product has a name
|
|
||||||
handleSaveButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
function delPackItem(id)
|
|
||||||
{
|
|
||||||
var reg = new RegExp('-', 'g');
|
|
||||||
var regx = new RegExp('x', 'g');
|
|
||||||
|
|
||||||
var div = getE('divPackItems');
|
|
||||||
var input = getE('inputPackItems');
|
|
||||||
var name = getE('namePackItems');
|
|
||||||
var select = getE('curPackItemId');
|
|
||||||
var select_quantity = getE('curPackItemQty');
|
|
||||||
|
|
||||||
var inputCut = input.value.split(reg);
|
|
||||||
var nameCut = name.value.split(new RegExp('¤', 'g'));
|
|
||||||
|
|
||||||
input.value = '';
|
|
||||||
name.value = '';
|
|
||||||
div.innerHTML = '';
|
|
||||||
|
|
||||||
for (var i = 0; i < inputCut.length; ++i)
|
|
||||||
if (inputCut[i])
|
|
||||||
{
|
|
||||||
var inputQty = inputCut[i].split(regx);
|
|
||||||
if (inputQty[1] != id)
|
|
||||||
{
|
|
||||||
input.value += inputCut[i] + '-';
|
|
||||||
name.value += nameCut[i] + '¤';
|
|
||||||
div.innerHTML += nameCut[i] + ' <span onclick="delPackItem(' + inputQty[1] + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$('#curPackItemName').setOptions({
|
|
||||||
extraParams: {
|
|
||||||
excludeIds : getSelectedIds()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// if no item left in the pack, disable save buttons
|
|
||||||
handleSaveButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSelectedIds()
|
|
||||||
{
|
|
||||||
var ids = '';
|
|
||||||
if (typeof(id_product) != 'undefined')
|
|
||||||
ids += id_product + ',';
|
|
||||||
ids += $('#inputPackItems').val().replace(/\d*x/g, '').replace(/\-/g,',');
|
|
||||||
ids = ids.replace(/\,$/,'');
|
|
||||||
return ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<h4>{l s='Pack'}</h4>
|
<h4>{l s='Pack'}</h4>
|
||||||
@@ -183,7 +53,7 @@
|
|||||||
<input type="hidden" name="namePackItems" id="namePackItems" value="{$input_namepack_items}" />
|
<input type="hidden" name="namePackItems" id="namePackItems" value="{$input_namepack_items}" />
|
||||||
<input type="hidden" size="2" id="curPackItemId" />
|
<input type="hidden" size="2" id="curPackItemId" />
|
||||||
|
|
||||||
<span onclick="addPackItem();" class="button" style="cursor: pointer;">
|
<span id="add_pack_item" class="button" style="cursor: pointer;">
|
||||||
{l s='Add this product to the pack'}
|
{l s='Add this product to the pack'}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|||||||
@@ -3948,7 +3948,7 @@ class AdminProductsControllerCore extends AdminController
|
|||||||
));
|
));
|
||||||
|
|
||||||
$this->addJS(array(
|
$this->addJS(array(
|
||||||
_PS_JS_DIR_.'admin-product-tab.js',
|
_PS_JS_DIR_.'productTabsManager.js',
|
||||||
_PS_JS_DIR_.'admin-products.js',
|
_PS_JS_DIR_.'admin-products.js',
|
||||||
_PS_JS_DIR_.'attributesBack.js',
|
_PS_JS_DIR_.'attributesBack.js',
|
||||||
_PS_JS_DIR_.'price.js',
|
_PS_JS_DIR_.'price.js',
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* NOTICE OF LICENSE
|
|
||||||
*
|
|
||||||
* This source file is subject to the Open Software License (OSL 3.0)
|
|
||||||
* that is bundled with this package in the file LICENSE.txt.
|
|
||||||
* It is also available through the world-wide-web at this URL:
|
|
||||||
* http://opensource.org/licenses/osl-3.0.php
|
|
||||||
* If you did not receive a copy of the license and are unable to
|
|
||||||
* obtain it through the world-wide-web, please send an email
|
|
||||||
* to license@prestashop.com so we can send you a copy immediately.
|
|
||||||
*
|
|
||||||
* DISCLAIMER
|
|
||||||
*
|
|
||||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
|
||||||
* versions in the future. If you wish to customize PrestaShop for your
|
|
||||||
* needs please refer to http://www.prestashop.com for more information.
|
|
||||||
*
|
|
||||||
* @author PrestaShop SA <contact@prestashop.com>
|
|
||||||
* @copyright 2007-2012 PrestaShop SA
|
|
||||||
* @version Release: $Revision$
|
|
||||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
|
||||||
* International Registered Trademark & Property of PrestaShop SA
|
|
||||||
*/
|
|
||||||
|
|
||||||
var ProductTab = function(name){
|
|
||||||
this.name = name;
|
|
||||||
this.id;
|
|
||||||
this.container;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute a callback function when a specific tab has finished loading or right now if the tab is already loaded
|
|
||||||
*
|
|
||||||
* @param tab_name name of the tab that is checked for loading
|
|
||||||
* @param callback_function function to call
|
|
||||||
*/
|
|
||||||
this.onDisplay = function (callback_function)
|
|
||||||
{
|
|
||||||
if (typeof(this.selector) === 'undefined')
|
|
||||||
this.container = $('#product-tab-content-' + this.name);
|
|
||||||
|
|
||||||
if (this.container.length === 0)
|
|
||||||
throw 'Could not find container for tab name: ' + this.name;
|
|
||||||
|
|
||||||
if (this.container.hasClass('not-loaded'))
|
|
||||||
this.container.bind('loaded', callback_function);
|
|
||||||
else
|
|
||||||
callback_function();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a single tab or recursively get tabs in stack then display them
|
|
||||||
*
|
|
||||||
* @param int id position of the tab in the product page
|
|
||||||
* @param boolean selected is the tab selected
|
|
||||||
* @param int index current index in the stack (or 0)
|
|
||||||
* @param array stack list of tab ids to load (or null)
|
|
||||||
*/
|
|
||||||
ProductTab.display = function (id, selected, index, stack)
|
|
||||||
{
|
|
||||||
var myurl = $('#link-'+id).attr("href")+"&ajax=1";
|
|
||||||
var tab_selector = $("#product-tab-content-"+id);
|
|
||||||
// Used to check if the tab is already in the process of being loaded
|
|
||||||
tab_selector.addClass('loading');
|
|
||||||
|
|
||||||
if (selected)
|
|
||||||
$('#product-tab-content-wait').show();
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url : myurl,
|
|
||||||
async : true,
|
|
||||||
cache: false, // cache needs to be set to false or IE will cache the page with outdated product values
|
|
||||||
type: 'POST',
|
|
||||||
success : function(data)
|
|
||||||
{
|
|
||||||
tab_selector.html(data);
|
|
||||||
tab_selector.removeClass('not-loaded');
|
|
||||||
|
|
||||||
if (selected)
|
|
||||||
{
|
|
||||||
$("#link-"+id).addClass('selected');
|
|
||||||
tab_selector.show();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
complete : function(data)
|
|
||||||
{
|
|
||||||
$("#product-tab-content-"+id).removeClass('loading');
|
|
||||||
if (selected)
|
|
||||||
{
|
|
||||||
$('#product-tab-content-wait').hide();
|
|
||||||
tab_selector.trigger('displayed');
|
|
||||||
}
|
|
||||||
tab_selector.trigger('loaded');
|
|
||||||
if (stack && stack[index + 1])
|
|
||||||
ProductTab.display(stack[index + 1], selected, index + 1, stack);
|
|
||||||
},
|
|
||||||
beforeSend : function(data)
|
|
||||||
{
|
|
||||||
// don't display the loading notification bar
|
|
||||||
if (typeof(ajax_running_timeout) !== 'undefined')
|
|
||||||
clearTimeout(ajax_running_timeout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//ProductTab.tabs =
|
|
||||||
//
|
|
||||||
//ProductTab.getByName(name)
|
|
||||||
//{
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
+556
-293
@@ -23,216 +23,206 @@
|
|||||||
* International Registered Trademark & Property of PrestaShop SA
|
* International Registered Trademark & Property of PrestaShop SA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Combination */
|
// array of product tab objects containing methods and dom bindings
|
||||||
|
var product_tabs = [];
|
||||||
|
|
||||||
var posC = true;
|
product_tabs['Combinations'] = {
|
||||||
$(document).ready(function() {
|
'bindEdit' : function(){
|
||||||
$('#desc-product-newCombination').click(function() {
|
$('table[name=list_table]').delegate('a.edit', 'click', function(e){
|
||||||
if (posC == true)
|
e.preventDefault();
|
||||||
removeButtonCombination('add');
|
editProductAttribute(this.href, $(this).closest('tr'));
|
||||||
else
|
});
|
||||||
addButtonCombination('add');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function removeButtonCombination(item)
|
function editProductAttribute (url, parent){
|
||||||
{
|
$.ajax({
|
||||||
$('#add_new_combination').show();
|
url: url,
|
||||||
$('.process-icon-newCombination').removeClass('toolbar-new');
|
data: {
|
||||||
$('.process-icon-newCombination').addClass('toolbar-cancel');
|
id_product: id_product,
|
||||||
$('#desc-product-newCombination div').html($('#ResetBtn').val());
|
ajax: true,
|
||||||
$('id_product_attribute').val(0);
|
action: 'editProductAttribute'
|
||||||
init_elems();
|
},
|
||||||
posC = false;
|
context: document.body,
|
||||||
}
|
dataType: 'json',
|
||||||
|
context: this,
|
||||||
|
async: false,
|
||||||
|
success: function(data) {
|
||||||
|
// color the selected line
|
||||||
|
parent.siblings().removeClass('selected-line');
|
||||||
|
parent.addClass('selected-line');
|
||||||
|
|
||||||
function addButtonCombination(item)
|
$('#add_new_combination').show();
|
||||||
{
|
$('#attribute_quantity').show();
|
||||||
$('#add_new_combination').hide();
|
$('#product_att_list').html('');
|
||||||
$('.process-icon-newCombination').removeClass('toolbar-cancel');
|
removeButtonCombination('update');
|
||||||
$('.process-icon-newCombination').addClass('toolbar-new');
|
$.scrollTo('#add_new_combination', 1200, { offset: -100 });
|
||||||
$('#desc-product-newCombination div').html(msg_new_combination);
|
var wholesale_price = Math.abs(data[0]['wholesale_price']);
|
||||||
posC = true;
|
var price = Math.abs(data[0]['price']);
|
||||||
}
|
var weight = Math.abs(data[0]['weight']);
|
||||||
|
var unit_impact = Math.abs(data[0]['unit_price_impact']);
|
||||||
function deleteProductAttribute(url, parent)
|
var reference = data[0]['reference'];
|
||||||
{
|
var ean = data[0]['ean13'];
|
||||||
$.ajax({
|
var quantity = data[0]['quantity'];
|
||||||
url: url,
|
var image = false;
|
||||||
data: {
|
var product_att_list = new Array();
|
||||||
id_product: id_product,
|
for(i=0;i<data.length;i++)
|
||||||
action: 'deleteProductAttribute',
|
|
||||||
ajax: true
|
|
||||||
},
|
|
||||||
context: document.body,
|
|
||||||
dataType: 'json',
|
|
||||||
context: this,
|
|
||||||
async: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (data.status == 'ok')
|
|
||||||
{
|
|
||||||
showSuccessMessage(data.message);
|
|
||||||
parent.remove();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
showErrorMessage(data.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function defaultProductAttribute(url, parent)
|
|
||||||
{
|
|
||||||
$.ajax({
|
|
||||||
url: url,
|
|
||||||
data: {
|
|
||||||
id_product: id_product,
|
|
||||||
action: 'defaultProductAttribute',
|
|
||||||
ajax: true
|
|
||||||
},
|
|
||||||
context: document.body,
|
|
||||||
dataType: 'json',
|
|
||||||
context: this,
|
|
||||||
async: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (data.status == 'ok')
|
|
||||||
{
|
|
||||||
showSuccessMessage(data.message);
|
|
||||||
$('table.table').find('tr').attr('style', function() {
|
|
||||||
var style = $(this).attr('style');
|
|
||||||
if (style)
|
|
||||||
{
|
{
|
||||||
$(this).attr('style', '');
|
product_att_list.push(data[i]['group_name']+' : '+data[i]['attribute_name']);
|
||||||
var ids = $(this).find('a.edit').attr('ids');
|
product_att_list.push(data[i]['id_attribute']);
|
||||||
var token = $(this).find('a.edit').attr('token');
|
|
||||||
$(this).find('a.edit').after("<a title=\"Default\" onclick=\"javascript:defaultProductAttribute('"+ids+"', '"+token+"', $(this).parent('td').parent('tr'));\" class=\"pointer default\"><img alt=\"Default\" src=\"../img/admin/asterisk.gif\"></a>");
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
parent.find('a.default').hide();
|
var id_product_attribute = data[0]['id_product_attribute'];
|
||||||
parent.css('background','#BDE5F8');
|
var default_attribute = data[0]['default_on'];
|
||||||
}
|
var eco_tax = data[0]['ecotax'];
|
||||||
else
|
var upc = data[0]['upc'];
|
||||||
showErrorMessage(data.message);
|
var minimal_quantity = data[0]['minimal_quantity'];
|
||||||
|
var available_date = data[0]['available_date'];
|
||||||
|
var virtual_product_name_attribute = data[0]['display_filename'];
|
||||||
|
var virtual_product_filename_attribute = data[0]['display_filename'];
|
||||||
|
var virtual_product_nb_downloable = data[0]['nb_downloadable'];
|
||||||
|
var virtual_product_expiration_date_attribute = data[0]['date_expiration'];
|
||||||
|
var virtual_product_nb_days = data[0]['nb_days_accessible'];
|
||||||
|
var is_shareable = data[0]['is_shareable'];
|
||||||
|
if (wholesale_price != 0 && wholesale_price > 0)
|
||||||
|
{
|
||||||
|
$("#attribute_wholesale_price_full").show();
|
||||||
|
$("#attribute_wholesale_price_blank").hide();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$("#attribute_wholesale_price_full").hide();
|
||||||
|
$("#attribute_wholesale_price_blank").show();
|
||||||
|
}
|
||||||
|
fillCombination(
|
||||||
|
wholesale_price,
|
||||||
|
price,
|
||||||
|
weight,
|
||||||
|
unit_impact,
|
||||||
|
reference,
|
||||||
|
ean,
|
||||||
|
quantity,
|
||||||
|
image,
|
||||||
|
product_att_list,
|
||||||
|
id_product_attribute,
|
||||||
|
default_attribute,
|
||||||
|
eco_tax,
|
||||||
|
upc,
|
||||||
|
minimal_quantity,
|
||||||
|
available_date,
|
||||||
|
virtual_product_name_attribute,
|
||||||
|
virtual_product_filename_attribute,
|
||||||
|
virtual_product_nb_downloable,
|
||||||
|
virtual_product_expiration_date_attribute,
|
||||||
|
virtual_product_nb_days,
|
||||||
|
is_shareable
|
||||||
|
);
|
||||||
|
calcImpactPriceTI();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
}
|
'bindDefault' : function(){
|
||||||
|
$('table[name=list_table]').delegate('a.default', 'click', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
defaultProductAttribute(this.href, $(this).closest('tr'));
|
||||||
|
});
|
||||||
|
|
||||||
function editProductAttribute(url, parent)
|
function defaultProductAttribute (url, parent){
|
||||||
{
|
$.ajax({
|
||||||
$.ajax({
|
url: url,
|
||||||
url: url,
|
data: {
|
||||||
data: {
|
id_product: id_product,
|
||||||
id_product: id_product,
|
action: 'defaultProductAttribute',
|
||||||
ajax: true,
|
ajax: true
|
||||||
action: 'editProductAttribute'
|
},
|
||||||
},
|
context: document.body,
|
||||||
context: document.body,
|
dataType: 'json',
|
||||||
dataType: 'json',
|
context: this,
|
||||||
context: this,
|
async: false,
|
||||||
async: false,
|
success: function(data) {
|
||||||
success: function(data) {
|
if (data.status == 'ok')
|
||||||
// color the selected line
|
{
|
||||||
parent.siblings().removeClass('selected-line');
|
showSuccessMessage(data.message);
|
||||||
parent.addClass('selected-line');
|
$('table.table').find('tr').attr('style', function() {
|
||||||
|
var style = $(this).attr('style');
|
||||||
$('#add_new_combination').show();
|
if (style)
|
||||||
$('#attribute_quantity').show();
|
{
|
||||||
$('#product_att_list').html('');
|
$(this).attr('style', '');
|
||||||
removeButtonCombination('update');
|
var ids = $(this).find('a.edit').attr('ids');
|
||||||
$.scrollTo('#add_new_combination', 1200, { offset: -100 });
|
var token = $(this).find('a.edit').attr('token');
|
||||||
var wholesale_price = Math.abs(data[0]['wholesale_price']);
|
$(this).find('a.edit').after("<a title=\"Default\" onclick=\"javascript:defaultProductAttribute('"+ids+"', '"+token+"', $(this).parent('td').parent('tr'));\" class=\"pointer default\"><img alt=\"Default\" src=\"../img/admin/asterisk.gif\"></a>");
|
||||||
var price = Math.abs(data[0]['price']);
|
}
|
||||||
var weight = Math.abs(data[0]['weight']);
|
});
|
||||||
var unit_impact = Math.abs(data[0]['unit_price_impact']);
|
parent.find('a.default').hide();
|
||||||
var reference = data[0]['reference'];
|
parent.css('background','#BDE5F8');
|
||||||
var ean = data[0]['ean13'];
|
}
|
||||||
var quantity = data[0]['quantity'];
|
else
|
||||||
var image = false;
|
showErrorMessage(data.message);
|
||||||
var product_att_list = new Array();
|
}
|
||||||
for(i=0;i<data.length;i++)
|
});
|
||||||
{
|
|
||||||
product_att_list.push(data[i]['group_name']+' : '+data[i]['attribute_name']);
|
|
||||||
product_att_list.push(data[i]['id_attribute']);
|
|
||||||
}
|
|
||||||
|
|
||||||
var id_product_attribute = data[0]['id_product_attribute'];
|
|
||||||
var default_attribute = data[0]['default_on'];
|
|
||||||
var eco_tax = data[0]['ecotax'];
|
|
||||||
var upc = data[0]['upc'];
|
|
||||||
var minimal_quantity = data[0]['minimal_quantity'];
|
|
||||||
var available_date = data[0]['available_date'];
|
|
||||||
var virtual_product_name_attribute = data[0]['display_filename'];
|
|
||||||
var virtual_product_filename_attribute = data[0]['display_filename'];
|
|
||||||
var virtual_product_nb_downloable = data[0]['nb_downloadable'];
|
|
||||||
var virtual_product_expiration_date_attribute = data[0]['date_expiration'];
|
|
||||||
var virtual_product_nb_days = data[0]['nb_days_accessible'];
|
|
||||||
var is_shareable = data[0]['is_shareable'];
|
|
||||||
if (wholesale_price != 0 && wholesale_price > 0)
|
|
||||||
{
|
|
||||||
$("#attribute_wholesale_price_full").show();
|
|
||||||
$("#attribute_wholesale_price_blank").hide();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$("#attribute_wholesale_price_full").hide();
|
|
||||||
$("#attribute_wholesale_price_blank").show();
|
|
||||||
}
|
|
||||||
fillCombination(
|
|
||||||
wholesale_price,
|
|
||||||
price,
|
|
||||||
weight,
|
|
||||||
unit_impact,
|
|
||||||
reference,
|
|
||||||
ean,
|
|
||||||
quantity,
|
|
||||||
image,
|
|
||||||
product_att_list,
|
|
||||||
id_product_attribute,
|
|
||||||
default_attribute,
|
|
||||||
eco_tax,
|
|
||||||
upc,
|
|
||||||
minimal_quantity,
|
|
||||||
available_date,
|
|
||||||
virtual_product_name_attribute,
|
|
||||||
virtual_product_filename_attribute,
|
|
||||||
virtual_product_nb_downloable,
|
|
||||||
virtual_product_expiration_date_attribute,
|
|
||||||
virtual_product_nb_days,
|
|
||||||
is_shareable
|
|
||||||
);
|
|
||||||
calcImpactPriceTI();
|
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
}
|
'bindDelete' : function() {
|
||||||
/* END Combination */
|
$('table[name=list_table]').delegate('a.delete', 'click', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
deleteProductAttribute(this.href, $(this).closest('tr'));
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
function deleteProductAttribute(url, parent){
|
||||||
* Update the manufacturer select element with the list of existing manufacturers
|
$.ajax({
|
||||||
*/
|
url: url,
|
||||||
function getManufacturers()
|
data: {
|
||||||
{
|
id_product: id_product,
|
||||||
$.ajax({
|
action: 'deleteProductAttribute',
|
||||||
url: 'ajax-tab.php',
|
ajax: true
|
||||||
cache: false,
|
},
|
||||||
dataType: 'json',
|
context: document.body,
|
||||||
data: {
|
dataType: 'json',
|
||||||
ajaxProductManufacturers:"1",
|
context: this,
|
||||||
ajax : '1',
|
async: false,
|
||||||
token : token,
|
success: function(data) {
|
||||||
controller : 'AdminProducts',
|
if (data.status == 'ok')
|
||||||
action : 'productManufacturers'
|
{
|
||||||
},
|
showSuccessMessage(data.message);
|
||||||
success: function(j) {
|
parent.remove();
|
||||||
var options = $('select#id_manufacturer').html();
|
}
|
||||||
if (j)
|
else
|
||||||
for (var i = 0; i < j.length; i++)
|
showErrorMessage(data.message);
|
||||||
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
|
}
|
||||||
$("select#id_manufacturer").html(options);
|
});
|
||||||
},
|
}
|
||||||
error: function(XMLHttpRequest, textStatus, errorThrown)
|
},
|
||||||
|
'bindToggleAddCombination' : function (){
|
||||||
|
$('#desc-product-newCombination').click(function() {
|
||||||
|
if ($('.process-icon-newCombination').hasClass('toolbar-new'))
|
||||||
|
removeButtonCombination('add');
|
||||||
|
else
|
||||||
|
addButtonCombination('add');
|
||||||
|
|
||||||
|
function removeButtonCombination(item)
|
||||||
{
|
{
|
||||||
$("select#id_manufacturer").replaceWith("<p id=\"id_manufacturer\">[TECHNICAL ERROR] ajaxProductManufacturers: "+textStatus+"</p>");
|
$('#add_new_combination').show();
|
||||||
|
$('.process-icon-newCombination').removeClass('toolbar-new');
|
||||||
|
$('.process-icon-newCombination').addClass('toolbar-cancel');
|
||||||
|
$('#desc-product-newCombination div').html($('#ResetBtn').val());
|
||||||
|
$('id_product_attribute').val(0);
|
||||||
|
init_elems();
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
function addButtonCombination(item)
|
||||||
|
{
|
||||||
|
$('#add_new_combination').hide();
|
||||||
|
$('.process-icon-newCombination').removeClass('toolbar-cancel');
|
||||||
|
$('.process-icon-newCombination').addClass('toolbar-new');
|
||||||
|
$('#desc-product-newCombination div').html(msg_new_combination);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Combinations'].bindEdit();
|
||||||
|
product_tabs['Combinations'].bindDefault();
|
||||||
|
product_tabs['Combinations'].bindDelete();
|
||||||
|
product_tabs['Combinations'].bindToggleAddCombination();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -331,69 +321,84 @@ function handleSaveButtonsForPack()
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function enableProductName()
|
product_tabs['Seo'] = {
|
||||||
{
|
// Enable writing of the product name when the friendly url field in tab SEO is loaded
|
||||||
$('.copy2friendlyUrl').removeAttr('disabled');
|
'enableProductName' : function (){
|
||||||
|
$('.copy2friendlyUrl').removeAttr('disabled');
|
||||||
|
},
|
||||||
|
'onReady' : function() {
|
||||||
|
product_tabs['Seo'].enableProductName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleSpecificPrice()
|
product_tabs['Prices'] = {
|
||||||
{
|
// Bind to show/hide new specific price form
|
||||||
$('#show_specific_price').click(function()
|
'toggleSpecificPrice' : function (){
|
||||||
{
|
$('#show_specific_price').click(function()
|
||||||
$('#add_specific_price').slideToggle();
|
{
|
||||||
|
$('#add_specific_price').slideToggle();
|
||||||
|
|
||||||
$('#add_specific_price').append('<input type="hidden" name="submitPriceAddition"/>');
|
$('#add_specific_price').append('<input type="hidden" name="submitPriceAddition"/>');
|
||||||
|
|
||||||
$('#hide_specific_price').show();
|
$('#hide_specific_price').show();
|
||||||
$('#show_specific_price').hide();
|
$('#show_specific_price').hide();
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#hide_specific_price').click(function()
|
$('#hide_specific_price').click(function()
|
||||||
{
|
{
|
||||||
$('#add_specific_price').slideToggle();
|
$('#add_specific_price').slideToggle();
|
||||||
$('#add_specific_price').find('input[name=submitPriceAddition]').remove();
|
$('#add_specific_price').find('input[name=submitPriceAddition]').remove();
|
||||||
|
|
||||||
$('#hide_specific_price').hide();
|
$('#hide_specific_price').hide();
|
||||||
$('#show_specific_price').show();
|
$('#show_specific_price').show();
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
|
/**
|
||||||
/**
|
* Ajax call to delete a specific price
|
||||||
* Ajax call to delete a specific price
|
*
|
||||||
*
|
* @param ids
|
||||||
* @param ids
|
* @param token
|
||||||
* @param token
|
* @param parent
|
||||||
* @param parent
|
*/
|
||||||
*/
|
'deleteSpecificPrice' : function (url, parent){
|
||||||
function deleteSpecificPrice(url, parent)
|
$.ajax({
|
||||||
{
|
url: url,
|
||||||
$.ajax({
|
data: {
|
||||||
url: url,
|
ajax: true
|
||||||
data: {
|
},
|
||||||
ajax: true
|
context: document.body,
|
||||||
},
|
dataType: 'json',
|
||||||
context: document.body,
|
context: this,
|
||||||
dataType: 'json',
|
async: false,
|
||||||
context: this,
|
success: function(data) {
|
||||||
async: false,
|
if (data.status == 'ok')
|
||||||
success: function(data) {
|
{
|
||||||
if (data.status == 'ok')
|
showSuccessMessage(data.message);
|
||||||
{
|
parent.remove();
|
||||||
showSuccessMessage(data.message);
|
}
|
||||||
parent.remove();
|
else
|
||||||
|
showErrorMessage(data.message);
|
||||||
}
|
}
|
||||||
else
|
});
|
||||||
showErrorMessage(data.message);
|
},
|
||||||
}
|
// Bind to delete specific price link
|
||||||
});
|
'bindDelete' : function(){
|
||||||
|
$('#specific_prices_list').delegate('a[name="delete_link"]', 'click', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
deleteSpecificPrice(this.href, $(this).parents('tr'));
|
||||||
|
})
|
||||||
|
},
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Prices'].toggleSpecificPrice();
|
||||||
|
product_tabs['Prices'].deleteSpecificPrice();
|
||||||
|
product_tabs['Prices'].bindDelete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initAccessoriesAutocomplete()
|
product_tabs['Associations'] = {
|
||||||
{
|
'initAccessoriesAutocomplete' : function (){
|
||||||
/* function autocomplete */
|
|
||||||
$(document).ready(function() {
|
|
||||||
$('#product_autocomplete_input')
|
$('#product_autocomplete_input')
|
||||||
.autocomplete('ajax_products_list.php', {
|
.autocomplete('ajax_products_list.php', {
|
||||||
minChars: 1,
|
minChars: 1,
|
||||||
@@ -414,8 +419,6 @@ function initAccessoriesAutocomplete()
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function getAccessorieIds()
|
function getAccessorieIds()
|
||||||
{
|
{
|
||||||
var ids = id_product + ',';
|
var ids = id_product + ',';
|
||||||
@@ -424,11 +427,308 @@ function initAccessoriesAutocomplete()
|
|||||||
|
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
/**
|
||||||
|
* Update the manufacturer select element with the list of existing manufacturers
|
||||||
|
*/
|
||||||
|
'getManufacturers' : function(){
|
||||||
|
$.ajax({
|
||||||
|
url: 'ajax-tab.php',
|
||||||
|
cache: false,
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
ajaxProductManufacturers:"1",
|
||||||
|
ajax : '1',
|
||||||
|
token : token,
|
||||||
|
controller : 'AdminProducts',
|
||||||
|
action : 'productManufacturers'
|
||||||
|
},
|
||||||
|
success: function(j) {
|
||||||
|
var options = $('select#id_manufacturer').html();
|
||||||
|
if (j)
|
||||||
|
for (var i = 0; i < j.length; i++)
|
||||||
|
options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
|
||||||
|
$("select#id_manufacturer").html(options);
|
||||||
|
},
|
||||||
|
error: function(XMLHttpRequest, textStatus, errorThrown)
|
||||||
|
{
|
||||||
|
$("select#id_manufacturer").replaceWith("<p id=\"id_manufacturer\">[TECHNICAL ERROR] ajaxProductManufacturers: "+textStatus+"</p>");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Associations'].initAccessoriesAutocomplete();
|
||||||
|
product_tabs['Associations'].getManufacturers();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
product_tabs['Attachments'] = {
|
||||||
|
'bindAttachmentEvents' : function (){
|
||||||
|
$("#addAttachment").live('click', function() {
|
||||||
|
$("#selectAttachment2 option:selected").each(function(){
|
||||||
|
var val = $('#arrayAttachments').val();
|
||||||
|
var tab = val.split(',');
|
||||||
|
for (var i=0; i < tab.length; i++)
|
||||||
|
if (tab[i] == $(this).val())
|
||||||
|
return false;
|
||||||
|
$('#arrayAttachments').val(val+$(this).val()+',');
|
||||||
|
});
|
||||||
|
return !$("#selectAttachment2 option:selected").remove().appendTo("#selectAttachment1");
|
||||||
|
});
|
||||||
|
$("#removeAttachment").live('click', function() {
|
||||||
|
$("#selectAttachment1 option:selected").each(function(){
|
||||||
|
var val = $('#arrayAttachments').val();
|
||||||
|
var tab = val.split(',');
|
||||||
|
var tabs = '';
|
||||||
|
for (var i=0; i < tab.length; i++)
|
||||||
|
if (tab[i] != $(this).val())
|
||||||
|
{
|
||||||
|
tabs = tabs+','+tab[i];
|
||||||
|
$('#arrayAttachments').val(tabs);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return !$("#selectAttachment1 option:selected").remove().appendTo("#selectAttachment2");
|
||||||
|
});
|
||||||
|
$("#product").submit(function() {
|
||||||
|
$("#selectAttachment1 option").each(function(i) {
|
||||||
|
$(this).attr("selected", "selected");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Attachments'].bindAttachmentEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
product_tabs['Informations'] = {
|
||||||
|
'bindAvailableForOrder' : function (){
|
||||||
|
$("#available_for_order").click(function(){
|
||||||
|
if ($(this).is(':checked'))
|
||||||
|
{
|
||||||
|
$('#show_price').attr('checked', 'checked');
|
||||||
|
$('#show_price').attr('disabled', 'disabled');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$('#show_price').attr('disabled', '');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'bindTagImage' : function (){
|
||||||
|
function changeTagImage(){
|
||||||
|
var smallImage = $('input[name=smallImage]:checked').attr('value');
|
||||||
|
var leftRight = $('input[name=leftRight]:checked').attr('value');
|
||||||
|
var imageTypes = $('input[name=imageTypes]:checked').attr('value');
|
||||||
|
var tag = '[img-'+smallImage+'-'+leftRight+'-'+imageTypes+']';
|
||||||
|
$('#resultImage').val(tag);
|
||||||
|
}
|
||||||
|
changeTagImage();
|
||||||
|
$('#createImageDescription input').change(function(){
|
||||||
|
changeTagImage();
|
||||||
|
});
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
$('.addImageDescription').click(function(){
|
||||||
|
if (i == 0){
|
||||||
|
$('#createImageDescription').animate({
|
||||||
|
opacity: 1, height: 'toggle'
|
||||||
|
}, 500);
|
||||||
|
i = 1;
|
||||||
|
}else{
|
||||||
|
$('#createImageDescription').animate({
|
||||||
|
opacity: 0, height: 'toggle'
|
||||||
|
}, 500);
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/*'setup_tinymce': function(){
|
||||||
|
// change each by click to load only on click
|
||||||
|
$(".autoload_rte").each(function(e){
|
||||||
|
tinySetup({
|
||||||
|
mode :"exact",
|
||||||
|
editor_selector :"autoload_rte",
|
||||||
|
elements : $(this).attr("id"),
|
||||||
|
theme_advanced_buttons1 : "newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect",
|
||||||
|
theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,,|,forecolor,backcolor",
|
||||||
|
theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,|,fullscreen",
|
||||||
|
theme_advanced_buttons4 : "styleprops,|,cite,abbr,acronym,del,ins,attribs,pagebreak",
|
||||||
|
setup : function(ed) {
|
||||||
|
//Count the total number of the field
|
||||||
|
ed.onKeyUp.add(function(ed, e) {
|
||||||
|
tinyMCE.triggerSave();
|
||||||
|
textarea = $('#'+ed.id);
|
||||||
|
max = textarea.parent('div').find('span.counter').attr('max');
|
||||||
|
if (max != 'none')
|
||||||
|
{
|
||||||
|
textarea_value = textarea.val();
|
||||||
|
count = stripHTML(textarea_value).length;
|
||||||
|
rest = max - count;
|
||||||
|
if (rest < 0)
|
||||||
|
textarea.parent('div').find('span.counter').html('<span style="color:red;"> ' + mce_maximum + ' ' + max + ' ' + mce_characters + ' : ' + rest + '</span>');
|
||||||
|
else
|
||||||
|
textarea.parent('div').find('span.counter').html(' ');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},*/
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Informations'].bindAvailableForOrder();
|
||||||
|
product_tabs['Informations'].bindTagImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
product_tabs['Pack'] = {
|
||||||
|
'packFunctions' : function (){
|
||||||
|
if ($('#ppack').attr('checked'))
|
||||||
|
{
|
||||||
|
$('#ppack').attr('disabled', 'disabled');
|
||||||
|
$('#ppackdiv').show();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('div.ppack').hide();
|
||||||
|
|
||||||
|
$('#curPackItemName').autocomplete('ajax_products_list.php', {
|
||||||
|
delay: 100,
|
||||||
|
minChars: 1,
|
||||||
|
autoFill: true,
|
||||||
|
max:20,
|
||||||
|
matchContains: true,
|
||||||
|
mustMatch:true,
|
||||||
|
scroll:false,
|
||||||
|
cacheLength:0,
|
||||||
|
// param multipleSeparator:'||' ajouté à cause de bug dans lib autocomplete
|
||||||
|
multipleSeparator:'||',
|
||||||
|
formatItem: function(item) {
|
||||||
|
return item[1]+' - '+item[0];
|
||||||
|
},
|
||||||
|
extraParams: {
|
||||||
|
excludeIds : getSelectedIds(),
|
||||||
|
excludeVirtuals : 1
|
||||||
|
}
|
||||||
|
}).result(function(event, item){
|
||||||
|
$('#curPackItemId').val(item[1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#add_pack_item').bind('click', addPackItem);
|
||||||
|
|
||||||
|
function addPackItem()
|
||||||
|
{
|
||||||
|
var curPackItemId = $('#curPackItemId').val();
|
||||||
|
var curPackItemName = $('#curPackItemName').val();
|
||||||
|
var curPackItemQty = $('#curPackItemQty').val();
|
||||||
|
if (curPackItemId == '' || curPackItemName == '')
|
||||||
|
{
|
||||||
|
jAlert(msg_select_one);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (curPackItemId == '' || curPackItemQty == '')
|
||||||
|
{
|
||||||
|
jAlert(msg_set_quantity);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lineDisplay = curPackItemQty+ 'x ' +curPackItemName;
|
||||||
|
|
||||||
|
var divContent = $('#divPackItems').html();
|
||||||
|
divContent += lineDisplay;
|
||||||
|
divContent += '<span onclick="delPackItem(' + curPackItemId + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />';
|
||||||
|
|
||||||
|
// QTYxID-QTYxID
|
||||||
|
// @todo : it should be better to create input for each items and each qty
|
||||||
|
// instead of only one separated by x, - and ¤
|
||||||
|
var line = curPackItemQty+ 'x' +curPackItemId;
|
||||||
|
|
||||||
|
$('#inputPackItems').val($('#inputPackItems').val() + line + '-');
|
||||||
|
$('#divPackItems').html(divContent);
|
||||||
|
$('#namePackItems').val($('#namePackItems').val() + lineDisplay + '¤');
|
||||||
|
|
||||||
|
$('#curPackItemId').val('');
|
||||||
|
$('#curPackItemName').val('');
|
||||||
|
$('p.listOfPack').show();
|
||||||
|
|
||||||
|
$('#curPackItemName').setOptions({
|
||||||
|
extraParams: {
|
||||||
|
excludeIds : getSelectedIds()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// show / hide save buttons
|
||||||
|
// if product has a name
|
||||||
|
handleSaveButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
function delPackItem(id)
|
||||||
|
{
|
||||||
|
var reg = new RegExp('-', 'g');
|
||||||
|
var regx = new RegExp('x', 'g');
|
||||||
|
|
||||||
|
var div = getE('divPackItems');
|
||||||
|
var input = getE('inputPackItems');
|
||||||
|
var name = getE('namePackItems');
|
||||||
|
var select = getE('curPackItemId');
|
||||||
|
var select_quantity = getE('curPackItemQty');
|
||||||
|
|
||||||
|
var inputCut = input.value.split(reg);
|
||||||
|
var nameCut = name.value.split(new RegExp('¤', 'g'));
|
||||||
|
|
||||||
|
input.value = '';
|
||||||
|
name.value = '';
|
||||||
|
div.innerHTML = '';
|
||||||
|
|
||||||
|
for (var i = 0; i < inputCut.length; ++i)
|
||||||
|
if (inputCut[i])
|
||||||
|
{
|
||||||
|
var inputQty = inputCut[i].split(regx);
|
||||||
|
if (inputQty[1] != id)
|
||||||
|
{
|
||||||
|
input.value += inputCut[i] + '-';
|
||||||
|
name.value += nameCut[i] + '¤';
|
||||||
|
div.innerHTML += nameCut[i] + ' <span onclick="delPackItem(' + inputQty[1] + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#curPackItemName').setOptions({
|
||||||
|
extraParams: {
|
||||||
|
excludeIds : getSelectedIds()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// if no item left in the pack, disable save buttons
|
||||||
|
handleSaveButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelectedIds()
|
||||||
|
{
|
||||||
|
var ids = '';
|
||||||
|
if (typeof(id_product) != 'undefined')
|
||||||
|
ids += id_product + ',';
|
||||||
|
ids += $('#inputPackItems').val().replace(/\d*x/g, '').replace(/\-/g,',');
|
||||||
|
ids = ids.replace(/\,$/,'');
|
||||||
|
return ids;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'onReady' : function(){
|
||||||
|
product_tabs['Pack'].packFunctions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
product_tabs['Features'] = {
|
||||||
|
'onReady' : function(){
|
||||||
|
displayFlags(languages, id_language, allowEmployeeFormLang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tabs_manager = new ProductTabsManager();
|
||||||
|
tabs_manager.setTabs(product_tabs);
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
// The manager schedules the onReady() methods of each tab to be called when the tab is loaded
|
||||||
|
tabs_manager.onReady();
|
||||||
|
|
||||||
updateCurrentText();
|
updateCurrentText();
|
||||||
|
|
||||||
$("#name_"+defaultLanguage.id_lang+",#link_rewrite_"+defaultLanguage.id_lang)
|
$("#name_"+defaultLanguage.id_lang+",#link_rewrite_"+defaultLanguage.id_lang)
|
||||||
.live("change", function(e)
|
.live("change", function(e)
|
||||||
{
|
{
|
||||||
@@ -451,41 +751,4 @@ $(document).ready(function() {
|
|||||||
code = (e.keyCode ? e.keyCode : e.which);
|
code = (e.keyCode ? e.keyCode : e.which);
|
||||||
return (code == 13) ? false : true;
|
return (code == 13) ? false : true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Enable writing of the product name when the friendly url field in tab SEO is loaded
|
|
||||||
new ProductTab('Seo').onDisplay(enableProductName);
|
|
||||||
|
|
||||||
new ProductTab('Prices').onDisplay(function(){
|
|
||||||
// Bind to show/hide new specific price form
|
|
||||||
toggleSpecificPrice();
|
|
||||||
|
|
||||||
// Bind to delete specific price link
|
|
||||||
$('#specific_prices_list').delegate('a[name="delete_link"]', 'click', function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
deleteSpecificPrice(this.href, $(this).parents('tr'));
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
// Bind attribute list ajax actions (edit, default, delete)
|
|
||||||
new ProductTab('Combinations').onDisplay(function(){
|
|
||||||
$('table[name=list_table]').delegate('a.edit', 'click', function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
editProductAttribute(this.href, $(this).closest('tr'));
|
|
||||||
});
|
|
||||||
|
|
||||||
$('table[name=list_table]').delegate('a.delete', 'click', function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
deleteProductAttribute(this.href, $(this).closest('tr'));
|
|
||||||
});
|
|
||||||
|
|
||||||
$('table[name=list_table]').delegate('a.default', 'click', function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
defaultProductAttribute(this.href, $(this).closest('tr'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
new ProductTab('Associations').onDisplay(function(){
|
|
||||||
initAccessoriesAutocomplete();
|
|
||||||
getManufacturers();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* NOTICE OF LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the Open Software License (OSL 3.0)
|
||||||
|
* that is bundled with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://opensource.org/licenses/osl-3.0.php
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@prestashop.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* DISCLAIMER
|
||||||
|
*
|
||||||
|
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||||
|
* versions in the future. If you wish to customize PrestaShop for your
|
||||||
|
* needs please refer to http://www.prestashop.com for more information.
|
||||||
|
*
|
||||||
|
* @author PrestaShop SA <contact@prestashop.com>
|
||||||
|
* @copyright 2007-2012 PrestaShop SA
|
||||||
|
* @version Release: $Revision$
|
||||||
|
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||||
|
* International Registered Trademark & Property of PrestaShop SA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles loading of product tabs
|
||||||
|
*/
|
||||||
|
function ProductTabsManager(){
|
||||||
|
this.product_tabs = [];
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
this.setTabs = function(tabs){
|
||||||
|
this.product_tabs = tabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule execution of onReady() function for each tab
|
||||||
|
*/
|
||||||
|
this.onReady = function(){
|
||||||
|
for (var tab_name in this.product_tabs)
|
||||||
|
{
|
||||||
|
if (this.product_tabs[tab_name].onReady !== undefined)
|
||||||
|
this.onLoad(tab_name, this.product_tabs[tab_name].onReady);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute a callback function when a specific tab has finished loading or right now if the tab has already loaded
|
||||||
|
*
|
||||||
|
* @param tab_name name of the tab that is checked for loading
|
||||||
|
* @param callback_function function to call
|
||||||
|
*/
|
||||||
|
this.onLoad = function (tab_name, callback)
|
||||||
|
{
|
||||||
|
container = $('#product-tab-content-' + tab_name);
|
||||||
|
if (container.length === 0)
|
||||||
|
throw 'Could not find container for tab name: ' + tab_name;
|
||||||
|
|
||||||
|
// onReady() is always called after the dom has been created for the tab (similar to $(document).ready())
|
||||||
|
if (container.hasClass('not-loaded'))
|
||||||
|
container.bind('loaded', callback);
|
||||||
|
else
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a single tab or recursively get tabs in stack then display them
|
||||||
|
*
|
||||||
|
* @param int id position of the tab in the product page
|
||||||
|
* @param boolean selected is the tab selected
|
||||||
|
* @param int index current index in the stack (or 0)
|
||||||
|
* @param array stack list of tab ids to load (or null)
|
||||||
|
*/
|
||||||
|
this.display = function (id, selected, index, stack)
|
||||||
|
{
|
||||||
|
var myurl = $('#link-'+id).attr("href")+"&ajax=1";
|
||||||
|
var tab_selector = $("#product-tab-content-"+id);
|
||||||
|
// Used to check if the tab is already in the process of being loaded
|
||||||
|
tab_selector.addClass('loading');
|
||||||
|
|
||||||
|
if (selected)
|
||||||
|
$('#product-tab-content-wait').show();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url : myurl,
|
||||||
|
async : true,
|
||||||
|
cache: false, // cache needs to be set to false or IE will cache the page with outdated product values
|
||||||
|
type: 'POST',
|
||||||
|
success : function(data)
|
||||||
|
{
|
||||||
|
tab_selector.html(data);
|
||||||
|
tab_selector.removeClass('not-loaded');
|
||||||
|
|
||||||
|
if (selected)
|
||||||
|
{
|
||||||
|
$("#link-"+id).addClass('selected');
|
||||||
|
tab_selector.show();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
complete : function(data)
|
||||||
|
{
|
||||||
|
$("#product-tab-content-"+id).removeClass('loading');
|
||||||
|
if (selected)
|
||||||
|
{
|
||||||
|
$('#product-tab-content-wait').hide();
|
||||||
|
tab_selector.trigger('displayed');
|
||||||
|
}
|
||||||
|
tab_selector.trigger('loaded');
|
||||||
|
|
||||||
|
if (stack && stack[index + 1])
|
||||||
|
self.display(stack[index + 1], selected, index + 1, stack);
|
||||||
|
},
|
||||||
|
beforeSend : function(data)
|
||||||
|
{
|
||||||
|
// don't display the loading notification bar
|
||||||
|
if (typeof(ajax_running_timeout) !== 'undefined')
|
||||||
|
clearTimeout(ajax_running_timeout);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user