Current File : //var/www/vinorea/src/PrestaShopBundle/Resources/views/Admin/TwigTemplateForm/typeahead.html.twig |
{#**
* Copyright since 2007 PrestaShop SA and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
*
* 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.md.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* 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 https://devdocs.prestashop.com/ for more information.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
*#}
{% block typeahead_product_collection_widget %}
<div
class="autocomplete-search"
data-formid="{{ form.vars.id }}"
data-fullname="{{ form.vars.full_name }}"
data-mappingvalue="{{ mapping_value }}"
data-mappingname="{{ mapping_name }}"
data-remoteurl="{{ remote_url|raw }}"
data-limit="{{ limit }}"
>
<div class="search search-with-icon">
{# We want the attributes from the form type to be added to the input so we merge class form attribute to required ones #}
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' form-control search typeahead ' ~ form.vars.id)|trim }) -%}
{# We do not want the initial input name because the data is handled via a collection input with name="full_name[data][]" #}
{%- set full_name = '' -%}
<input type="text" placeholder="{{ placeholder }}" autocomplete="off" {{ block('widget_attributes') }}>
</div>
<small class="form-text text-muted text-right typeahead-hint">
{% if help %}
{{ help|raw }}
{% endif %}
</small>
<ul id="{{ form.vars.id }}-data" class="typeahead-list nostyle col-sm-12 product-list">
{% if collection is defined and collection|length > 0 %}
{% for item in collection %}
<li class="media">
<div class="media-left">
<img class="media-object image" src="{{ item.image }}" />
</div>
<div class="media-body media-middle">
{{ template_collection|format(item.name)|raw }}
</div>
<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="{{ item.id }}" />
</li>
{% endfor %}
{% endif %}
</ul>
<div class="invisible" id="tplcollection-{{ form.vars.id }}">
{{ template_collection|raw }}
</div>
</div>
<script type="text/javascript">
$('#{{ form.vars.id }}').on('focusout', function resetSearchBar() {
$('#{{ form.vars.id }}').typeahead('val', '');
});
</script>
{% endblock %}
{% block typeahead_product_pack_collection_widget %}
<h2 class="title-products {{ collection is defined and collection|length > 0 ? '' : 'hide' }}">{{ 'List of products for this pack'|trans({}, 'Admin.Catalog.Feature') }}</h2>
<ul id="{{ form.vars.id }}-data" class="typeahead-list pack nostyle row">
{% if collection is defined and collection|length > 0 %}
{% for item in collection %}
<li data-product="{{ item.id }}-{{ item.id_product_attribute }}" class="col-xl-3 col-lg-6 mb-1">
<div class="pack-product">
<img class="cover" src="{{ item.image }}" /> {{ template_collection|format(item.name, item.ref, item.quantity)|raw }}
<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="{{ item.quantity }}x{{ item.id }}x{{ item.id_product_attribute }}" />
<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="{{ item.quantity }}x{{ item.id }}x{{ item.id_product_attribute }}" />
</div>
</li>
{% endfor %}
{% endif %}
</ul>
<h2>{{ form.vars.label }}</h2>
<div class="row mb-2">
<div class="col-md-6">
<input type="text" id="{{ form.vars.id }}" class="form-control typeahead search {{ form.vars.id }}" placeholder="{{ placeholder }}" autocomplete="off" />
</div>
<div class="col-md-3">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">×</span>
</div>
<input type="number" id="{{ form.vars.id }}-curPackItemQty" class="form-control curPackItemQty" min="1" value="1">
</div>
</div>
<div class="col-md-3">
<div class="input-group">
<button id="{{ form.vars.id }}-curPackItemAdd" class="btn btn-secondary btn-block">
<i class="material-icons">add</i>
{{ "Add"|trans({}, "Admin.Actions") }}
</button>
</div>
</div>
<div class="clearfix"></div>
<script>
$( document ).ready(function() {
//remove collection item
$(document).on( 'click', '#{{ form.vars.id }}-data .delete', function(e) {
e.preventDefault();
var _this = $(this);
modalConfirmation.create(translate_javascripts['Are you sure you want to delete this item?'], null, {
onContinue: function(){
_this.closest('li').remove();
if(_this.parent().parent().length == 0){
$('#js_{{ form.vars.id }} h4.title-products').addClass('hide');
}
}
}).show();
});
$('#{{ form.vars.id }}-curPackItemAdd').click(function(e){
e.preventDefault();
if($(this).data('currentItem')){
var number = $('#{{ form.vars.id }}-curPackItemQty').val();
var data = $(this).data('currentItem');
var value = number + 'x' + data.id + 'x' + (data.id_product_attribute ? data.id_product_attribute : 0);
var html = '<li data-product="' + data.id + '-' + (data.id_product_attribute ? data.id_product_attribute : 0) + '" class="col-xl-3 col-lg-6 mb-1">';
html += '<div class="pack-product">';
html += '<img class="cover" src="' + data.image +'" />';
html += sprintf('{% apply spaceless %}{{ template_collection|raw }}{% endapply %}', data.{{ mapping_name }}, data.ref, number);
html += '<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="' + value + '" />';
html += '</div>';
html += '</li>';
$('#{{ form.vars.id }}-data').append(html);
$('#js_{{ form.vars.id }} h4.title-products').removeClass('hide');
$('#{{ form.vars.id }}').val('');
}
$(this).data('currentItem', null);
$('#{{ form.vars.id }}-curPackItemQty').val(1);
});
//define source
this['{{ form.vars.id }}_source'] = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
identify: function(obj) {
return obj.{{ mapping_value }};
},
remote: {
url: '{{ remote_url|raw }}',
cache: false,
wildcard: '%QUERY',
transform: function(response){
var newResponse = [];
if(!response){
return newResponse;
}
//generate excludes IDs and filter results
var excludeIds = [];
$.each($('#{{ form.vars.id }}-data li'), function(key, val){
excludeIds.push($(val).attr('data-product'));
});
$.each(response, function(key, item){
if(excludeIds.indexOf(item.id + '-' + item.id_product_attribute) === -1){
newResponse.push(item);
}
});
return newResponse;
}
}
});
//define typeahead
$('#{{ form.vars.id }}').typeahead({
limit: 20,
minLength: 2,
highlight: true,
hint: false
}, {
display: '{{ mapping_name }}',
source: this['{{ form.vars.id }}_source'],
limit: 30,
templates: {
suggestion: function(item){
return '<div>' +
'<table><tr>' +
'<td rowspan="2"><img src="'+ item.image +'" style="width:50px; margin-right: 7px;" /></td>' +
'<td>' + item.name + '</td></tr>' +
'<tr><td>REF: ' + item.ref + '</td></tr>' +
'</table></div>'
}
}
}).bind('typeahead:select', function(ev, suggestion) {
$('#{{ form.vars.id }}-curPackItemAdd').data('currentItem', suggestion);
});
});
</script>
</div>
{% endblock %}
{% block typeahead_customer_collection_widget %}
{{ form_errors(form) }}
<input type="text" id="{{ form.vars.id }}" class="form-control typeahead {{ form.vars.id }}" placeholder="{{ placeholder }}" autocomplete="off" />
<ul id="{{ form.vars.id }}-data" class="typeahead-list product-list nostyle col-sm-12">
{% if collection is defined and collection|length > 0 %}
{% for item in collection %}
<li class="media">
<div class="media-body">
{{ template_collection|format(item.name)|raw }}
</div>
<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="{{ item.id }}" />
</li>
{% endfor %}
{% endif %}
</ul>
<script>
$( document ).ready(function() {
//remove collection item
$(document).on( 'click', '#{{ form.vars.id }}-data .delete', function(e) {
e.preventDefault();
var _this = $(this);
modalConfirmation.create(translate_javascripts['Are you sure you want to delete this item?'], null, {
onContinue: function(){
_this.closest('li').remove();
_this.parent().parent().hide();
_this.parent().remove();
}
}).show();
});
//define source
this['{{ form.vars.id }}_source'] = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
identify: function(obj) {
return obj.{{ mapping_value }};
},
remote: {
url: '{{ remote_url|raw }}',
cache: false,
wildcard: '%QUERY',
transform: function(response){
if(!response){
return [];
}
return response;
}
}
});
//define typeahead
$('#{{ form.vars.id }}').typeahead({
limit: 200,
minLength: 2,
highlight: true,
cache: false,
hint: false,
}, {
display: '{{ mapping_name }}',
source: this['{{ form.vars.id }}_source'],
limit: 30,
templates: {
suggestion: function(item){
return '<div>'+ item.{{ mapping_name }} +'</div>'
}
}
}).bind('typeahead:select', function(ev, suggestion) {
//if collection length is up to limit, return
if({{ limit }} != 0 && $('#{{ form.vars.id }}-data li').length >= {{ limit }}){
return;
}
var value = suggestion.{{ mapping_value }};
if (suggestion.id_product_attribute) {
value = value+','+suggestion.id_product_attribute;
}
var html = '<li class="media">';
html += sprintf('{% apply spaceless %}{{ template_collection|raw }}{% endapply %}', suggestion.{{ mapping_name }});
html += '<input type="hidden" name="{{ form.vars.full_name }}[data][]" value="' + value + '" />';
html += '</li>';
$('#{{ form.vars.id }}-data').show();
$('#{{ form.vars.id }}-data').append(html);
}).bind('typeahead:close', function(ev) {
$(ev.target).val('');
});
});
</script>
{% endblock %}