mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-12 23:14:18 +01:00
248 lines
8.9 KiB
Twig
248 lines
8.9 KiB
Twig
|
|
{# @copyright Copyright (C) 2010-2023 Combodo SARL #}
|
|
{# @license http://opensource.org/licenses/AGPL-3.0 #}
|
|
|
|
{# SET WIDGET #}
|
|
{% set oDataProvider = oUIBlock.GetDataProvider() %}
|
|
let oWidget{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').selectize({
|
|
|
|
{# Global options #}
|
|
{% if oDataProvider.IsAjaxProviderType %}
|
|
preload: true, {# call ajax directly #}
|
|
loadingClass: '',
|
|
{% endif %}
|
|
itemClass: 'item attribute-set-item',
|
|
hasError: {{ oUIBlock.HasError()|var_export() }},
|
|
placeholder: '{{ oUIBlock.GetPlaceholder() }}',
|
|
|
|
{# Remove button plugin #}
|
|
plugins: {
|
|
{# PLUGIN update operations #}
|
|
'combodo_update_operations' : {
|
|
initial: {{ oUIBlock.GetInitialValue()|raw }}
|
|
},
|
|
{# PLUGIN combodo auto position #}
|
|
'combodo_auto_position' : {
|
|
maxDropDownHeight: 300, {# in px #}
|
|
},
|
|
{# PLUGIN combodo add button #}
|
|
{% if oUIBlock.HasAddOptionButton() %}
|
|
'combodo_add_button' : {
|
|
title: '{{ oUIBlock.GetAddButtonTitle() }}'
|
|
},
|
|
{% endif %}
|
|
{% if oUIBlock.IsMultiValuesSynthesis() %}
|
|
'combodo_multi_values_synthesis' : {
|
|
|
|
tooltip_links_will_be_created_for_all_objects: '{{ 'UI:Links:Bulk:LinkWillBeCreatedForAllObjects'|dict_s }}',
|
|
tooltip_links_will_be_deleted_from_all_objects: '{{ 'UI:Links:Bulk:LinkWillBeDeletedFromAllObjects'|dict_s }}',
|
|
tooltip_links_will_be_created_for_one_object: '{{ 'UI:Links:Bulk:LinkWillBeCreatedFor1Object'|dict_s }}',
|
|
tooltip_links_will_be_deleted_from_one_object: '{{ 'UI:Links:Bulk:LinkWillBeDeletedFrom1Object'|dict_s }}',
|
|
tooltip_links_will_be_created_for_x_objects: '{{ 'UI:Links:Bulk:LinkWillBeCreatedForXObjects'|dict_s }}',
|
|
tooltip_links_will_be_deleted_from_x_objects: '{{ 'UI:Links:Bulk:LinkWillBeDeletedFromXObjects'|dict_s }}',
|
|
tooltip_links_exist_for_all_objects: '{{ 'UI:Links:Bulk:LinkExistForAllObjects'|dict_s }}',
|
|
tooltip_links_exist_for_one_object: '{{ 'UI:Links:Bulk:LinkExistForOneObject'|dict_s }}',
|
|
tooltip_links_exist_for_x_objects: '{{ 'UI:Links:Bulk:LinkExistForXObjects'|dict_s }}'
|
|
},
|
|
{% endif %}
|
|
{# PLUGIN remove button #}
|
|
{% if oUIBlock.HasRemoveItemButton() %}
|
|
'remove_button' : {},
|
|
{% endif %}
|
|
|
|
{# PLUGIN min items #}
|
|
{% if oUIBlock.GetMinItems() is not empty %}
|
|
'combodo_min_items' : {
|
|
minItems: {{ oUIBlock.GetMinItems() }},
|
|
errorTitle: '{{ 'UI:Component:Input:ChangeNotAllowed'|dict_s()|escape('js') }}',
|
|
errorMessage: '{{ 'UI:Component:Input:Set:MinimumItems'|dict_format(oUIBlock.GetMinItems())|escape('js') }}'
|
|
},
|
|
{% endif %}
|
|
},
|
|
|
|
{# Max items you can select #}
|
|
{% if oUIBlock.GetMaxItems() is not empty %}
|
|
maxItems: {{ oUIBlock.GetMaxItems() }},
|
|
{% endif %}
|
|
|
|
{# Max options available #}
|
|
{% if oUIBlock.GetMaxOptions() is not empty %}
|
|
maxOptions: {{ oUIBlock.GetMaxOptions() }},
|
|
{% endif %}
|
|
|
|
{# Data fields #}
|
|
valueField: '{{ oDataProvider.GetDataValueField() }}',
|
|
labelField: '{{ oDataProvider.GetDataLabelField() }}',
|
|
searchField: {{ oDataProvider.GetDataSearchFields()|json_encode()|raw }},
|
|
optgroupField: '{{ oDataProvider.GetGroupField() }}',
|
|
tooltipField: '{{ oDataProvider.GetTooltipField() }}',
|
|
|
|
{# Initial options data, may be oveeride by ajax load method #}
|
|
options: {{ oDataProvider.GetOptions()|json_encode()|raw }},
|
|
|
|
{# Groups data #}
|
|
optgroups: {{ oDataProvider.GetOptionsGroups()|json_encode()|raw }},
|
|
|
|
{# Items data #}
|
|
items: {{ oUIBlock.GetValue()|raw }},
|
|
|
|
inputClass: 'ibo-input ibo-input-selectize ibo-input-set attribute-set selectize-input',
|
|
|
|
{# Ajax data load #}
|
|
{% if oDataProvider.IsAjaxProviderType %}
|
|
load: function (query, callback) {
|
|
let me = this;
|
|
$.ajax({
|
|
url: '{{ get_absolute_url_app_root() }}pages/ajax.render.php?route={{ oDataProvider.GetRoute() }}&search=' + query + '{{ oDataProvider.GetParamsAsQueryString|e('js') }}',
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: me.convertParamArray('{{ oDataProvider.GetPostParamsAsJsonString()|raw }}'),
|
|
error: function (e) {
|
|
callback();
|
|
console.error(e);
|
|
if(!me.settings.hasError) {
|
|
me.toggleErrorClass(true);
|
|
}
|
|
},
|
|
success: function (res) {
|
|
|
|
// Handle errors
|
|
if(!me.settings.hasError){
|
|
me.toggleErrorClass(!res.data.success);
|
|
if(!res.data.success) return;
|
|
}
|
|
|
|
// Retrieve current input value
|
|
let aSelectedItems = me.getValue();
|
|
// Filter old options data to keep selected values
|
|
// (options with force flag will be kept event if they doesn't be part of the current value)
|
|
let options = Object.values(me.options);
|
|
options = options.filter(item => (typeof(item.force) !== "undefined" && item.force === true) || aSelectedItems.includes(item['{{ oDataProvider.GetDataValueField() }}']));
|
|
// Merge kept and new values
|
|
options = $.merge(options, res.data.search_data);
|
|
// Compute groups
|
|
$.each(options, function(index, value) {
|
|
me.addOptionGroup(value['{{ oDataProvider.GetGroupField() }}'], {
|
|
label: value['{{ oDataProvider.GetGroupField() }}'],
|
|
value: value['{{ oDataProvider.GetGroupField() }}']
|
|
});
|
|
});
|
|
// Clear all options
|
|
me.clearOptions();
|
|
// Add merged values
|
|
callback(options);
|
|
// Restore input value
|
|
me.addItems(aSelectedItems, true);
|
|
}
|
|
});
|
|
},
|
|
{% endif %}
|
|
|
|
{# Renderers #}
|
|
render: {
|
|
|
|
{# Options #}
|
|
{% if oUIBlock.HasOptionsTemplate() %}
|
|
option: function(option) {
|
|
return CombodoGlobalToolbox.RenderTemplate('#{{ oUIBlock.GetId() }}_options_template', option, this.settings.optionClass)[0].outerHTML;
|
|
},
|
|
{% endif %}
|
|
|
|
{# Items #}
|
|
{% if oUIBlock.HasItemsTemplate() %}
|
|
item: function (item) {
|
|
return CombodoGlobalToolbox.RenderTemplate('#{{ oUIBlock.GetId() }}_items_template', item, this.settings.itemClass)[0].outerHTML;
|
|
},
|
|
{% endif %}
|
|
|
|
},
|
|
|
|
onInitialize: function(){
|
|
|
|
/**
|
|
* Function to convert param array.
|
|
*
|
|
* EVAL_JAVASCRIPT{code_to_eval}
|
|
*/
|
|
this.convertParamArray = function(paramArray){
|
|
let postParam = JSON.parse(paramArray);
|
|
let data = {};
|
|
Object.entries(postParam).forEach(([key, value]) => {
|
|
let matches = null;
|
|
if(typeof(value) === 'string'){
|
|
matches = value.match(/^EVAL_JAVASCRIPT{(.*)}$/);
|
|
}
|
|
if(matches != null){
|
|
data[key] = eval(matches[1]);
|
|
}
|
|
else{
|
|
data[key] = value;
|
|
}
|
|
});
|
|
return data;
|
|
};
|
|
|
|
/**
|
|
* Function to show error.
|
|
*
|
|
*/
|
|
this.toggleErrorClass = function(bValue){
|
|
this.$control.toggleClass('selectize-input-error', bValue);
|
|
};
|
|
|
|
{# Error #}
|
|
this.toggleErrorClass(this.settings.hasError);
|
|
},
|
|
|
|
onDropdownOpen: function (oDropdownElem) {
|
|
oDropdownElem.addClass('set-dropdown');
|
|
},
|
|
|
|
{# On item add #}
|
|
onItemAdd: function(value, $item){
|
|
$item.addClass(this.settings.itemClass);
|
|
$item.attr({
|
|
'data-tooltip-content': this.options[value][this.settings.tooltipField],
|
|
'data-tooltip-html-enabled': true
|
|
});
|
|
CombodoTooltip.InitTooltipFromMarkup($item);
|
|
|
|
{% if oUIBlock.GetOnItemAddJs() is not null %}
|
|
{{ oUIBlock.GetOnItemAddJs()|raw }}
|
|
{% endif %}
|
|
},
|
|
|
|
{# On item remove #}
|
|
onItemRemove: function(value, $item){
|
|
{% if oUIBlock.GetOnItemRemoveJs() is not null %}
|
|
{{ oUIBlock.GetOnItemRemoveJs()|raw }}
|
|
{% endif %}
|
|
},
|
|
|
|
{# On option remove #}
|
|
onOptionRemove: function(value, $item){
|
|
{% if oUIBlock.GetOnOptionRemoveJs() is not null %}
|
|
{{ oUIBlock.GetOnOptionRemoveJs()|raw }}
|
|
{% endif %}
|
|
},
|
|
|
|
{# On option add #}
|
|
onOptionAdd: function(value, $item){
|
|
{% if oUIBlock.GetOnOptionAddJs() is not null %}
|
|
{{ oUIBlock.GetOnOptionAddJs()|raw }}
|
|
{% endif %}
|
|
},
|
|
|
|
{# plugin combodo_add_button #}
|
|
{% if oUIBlock.HasAddOptionButton() and oUIBlock.HasAddOptionButtonJsOnClick() %}
|
|
onAdd: function(){
|
|
{{ oUIBlock.GetAddOptionButtonJsOnClick()|raw }}
|
|
|
|
},
|
|
{% endif %}
|
|
|
|
});
|
|
|
|
|
|
|