var appasyncadd = appasyncadd || [];
(function(){
var app = {}, am = {}, self = {};
var loader = function(an_app){
app = an_app;
am = app.misc;
app.addField = module;
self = module;
self.init();
};
setTimeout(function(){ appasyncadd.push(loader); }, 0);
var tmp = $('
0) {
$('a[href="#tab_inuse"]').tab('show');
} else {
$('a[href="#tab_inuse"]').tab('show');
}
});
$(document).on('click', '.js_pass_view', function(e) {
e.preventDefault();
var passId = $(this).data('id');
var passToken = $(this).data('token');
var modal = $('#show_view_pass');
$.fancybox.showLoading();
if (app.script.currentScriptType === 'quiz') {
am.analyticsRequest(
`api/script/${passId}/passes/${passToken}`,
{},
function(response) {
modal.find('.pass-log div.well').remove();
$.each(response.pass, (i, o) => {
modal.find('.modal-body .pass-log').append('' + o + '
');
});
modal.find('.js_operator').text('Анонимный пользователь');
modal.find('.js_source').text(response.source);
modal.modal();
$.fancybox.hideLoading();
$('.js_fields_excel').button('reset');
},
function(err) {
console.log('🦕 err', err)
$.fancybox.hideLoading();
$('.js_fields_excel').button('reset');
},
)
} else {
var data = {
method: 'script.get_pass_log',
id: passId
};
if (passToken) {
data.token = passToken;
}
am.promiseCmd(data).always(function () {
$.fancybox.hideLoading();
}).fail(function (err) {
console.log(JSON.stringify(err));
}).done(function (result) {
modal.find('.pass-log div.well').remove();
var text;
$.each(result.log, function (i, o) {
text = self.replaceFieldsToValues(o, result.fields);
text = self.replaceStaticFieldsToValues(text, result.static_fields);
modal.find('.modal-body .pass-log').append('' + text + '
');
});
modal.find('.js_operator').text(result.operator);
modal.find('.js_source').text(result.source);
modal.modal();
});
}
});
$('.js_pass_filter').click(function() {
self.loadPasses();
});
$(document).on('click', '.js_load_more button', function() {
var page = $(this).data('page');
self.loadPasses(page);
$(this).data('page', ++page);
});
$('.js_fields_excel').click(function(e) {
e.preventDefault();
var href = $(this).data('href');
var scheme = '';
app.all.addition.show(Translator.trans('passage_scheme_export'), scheme, function(){
var filter = {};
if ($('.js_pass_filter_operator').val()) {
filter.operator = $('.js_pass_filter_operator').val();
}
if ($('.js_pass_filter_from').val()) {
filter.from = $('.js_pass_filter_from').val();
}
if ($('.js_pass_filter_to').val()) {
filter.to = $('.js_pass_filter_to').val();
}
var schemeValue = $('[data-passage_scheme="Y"]').find('input[name=scheme]:checked').val();
filter.scheme = schemeValue;
href += '?' + $.param(filter);
window.location = href;
}, Translator.trans('passage_scheme_download'));
});
try {
$('.datepicker').datepicker({
beforeShow: function() {
setTimeout(function(){
$('.ui-datepicker').css('z-index', 99999999999999);
}, 0);
}
});
}
catch (e) {}
},
setEndOfContenteditable: function (contentEditableElement) {
var range,selection;
if(document.createRange)//Firefox, Chrome, Opera, Safari, IE 9+
{
range = document.createRange();
range.selectNodeContents(contentEditableElement);
range.collapse(false);
selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
else if(document.selection)//IE 8 and lower
{
range = document.body.createTextRange();
range.moveToElementText(contentEditableElement);
range.collapse(false);
range.select();
}
},
hasFieldById: function(fieldId) {
return !!self.fields[fieldId];
},
setFields: function(fields) {
self.fields = fields;
self.initFields();
},
getFieldValueByName: function(name){
for (let field in self.fields) {
if(self.fields[field].name===name)
return self.fields[field].value
}
return null;
},
setStaticFields: function(fields) {
self.staticFields = fields;
},
getFields: function() {
return self.fields;
},
getFieldsValues: function () {
return $('.js_view_box .view_box_sidebar').find('.js_script_field').map(function(i, o) {
var e = $(o);
var fieldId = e.attr('name') * 1;
var field = self.getField(fieldId);
var values = {id: fieldId};
if (field.options && field.options.address) {
var data = e.data();
if (data['suggestions'] && data['suggestions']['selection']) {
values['address'] = data['suggestions']['selection'];
}
}
if (field.type === 'checkbox') {
values['value'] = (e.is(':checked')) ? 1: 0;
} else {
values['value'] = e.val();
}
return values;
}).get();
},
getField: function(fieldId) {
return (self.fields[fieldId]) ? self.fields[fieldId] : false;
},
getCRMFields: function() {
return {
name: {
id: 'name',
name: Translator.trans('name'),
type: 'text'
},
lastname: {
id: 'lastname',
name: Translator.trans('lastname'),
type: 'text'
},
middlename: {
id: 'middlename',
name: Translator.trans('middlename')
},
company: {
id: 'company',
name: Translator.trans('company'),
type: 'text'
},
email: {
id: 'email',
name: 'Email',
type: 'text'
},
phone: {
id: 'phone',
name: Translator.trans('phone'),
type: 'text'
}
};
},
getCRMField: function(fieldId) {
let crmFields = self.getCRMFields();
return (crmFields[fieldId]) ? crmFields[fieldId] : null;
},
initField: function(field) {
if (!field.value && field.options && field.type === 'number') {
if(!field.options.numberFormula){
field.options['numberFormula'] = {
value: '',
context: {}
}
}
self.setFieldValue(field.id, self.calcNumberFormula(
field.options.numberFormula.value,
field.options.numberFormula.context
));
// var context = field.options.numberFormula.context;
// if (!context) {
// return;
// }
// $.each(context.fields || [], function(name, id) {
// var contextField = self.getField(id);
// if (!contextField) {
// return;
// }
// if (!contextField.numberFormulas) {
// contextField.numberFormulas = [];
// }
// if ($.inArray(field.id, contextField.numberFormulas) == -1) {
// contextField.numberFormulas.push(field.id);
// }
// });
}
},
getNamedFields: function(type) {
var namedFields = [];
$.each(self.fields, function(i, field) {
if (!type || (type && field.type && field.type === type)) {
field.full_name = field.name;
namedFields.push(field);
}
});
$.each(self.getProfileFields(), function(i, field) {
if (!type || (type && field.type && field.type === type)) {
field.full_name = field.name;
namedFields.push(field);
}
});
if (document.crm_fields) {
$.each(document.crm_fields, function(i, field) {
$.each(field.fields, function(i, entity) {
$.each(entity.fields, function(i, f) {
if (!type || (type && f.type && f.type === type)) {
namedFields.push(f);
}
});
});
});
}
return namedFields;
},
getFieldPassValue: function(fieldId) {
let value = $('input.js_script_field[name=' + fieldId + ']').val();
return (value) ? value.replace(',', '.').replace(' ', '') : null;
},
getProfileFields: function() {
return {
name: {
id: 'profile_firstname',
name: Translator.trans('field_operator_name'),
type: 'text'
},
lastname: {
id: 'profile_lastname',
name: Translator.trans('field_operator_lastname'),
type: 'text'
},
email: {
id: 'profile_email',
name: Translator.trans('field_operator_email'),
type: 'text'
},
link: {
id: 'profile_link',
name: Translator.trans('field_operator_link'),
type: 'text'
}
};
},
getProfileField: function (fieldId) {
let profileFields = self.getProfileFields();
return (profileFields[fieldId]) ? profileFields[fieldId] : null;
},
loadFields: function (cb, sid) {
let scriptId;
if (!sid) {
scriptId = $('.js_editor').data('id');
} else {
scriptId = sid;
}
if (!scriptId) return;
am.promiseCmd({
method: 'script.get_script_fields',
id: scriptId
}).done(function (result) {
self.fields = result;
self.initFields();
if (cb) cb();
}).always(function () {
});
},
initFields: function () {
$.each(self.fields, function (i, f) {
self.initField(f);
});
},
loadPasses: function(page) {
page = page || 0;
var scriptId = $('.js_editor').data('id');
if (!scriptId) return;
var passFilterOperatorSelect = $('.js_pass_filter_operator');
var filter = {};
if (passFilterOperatorSelect.val()) {
filter.operator = passFilterOperatorSelect.val();
}
if ($('.js_pass_filter_from').val()) {
filter.from = $('.js_pass_filter_from').val();
}
if ($('.js_pass_filter_to').val()) {
filter.to = $('.js_pass_filter_to').val();
}
$('.js_fields_excel').button('loading');
$.fancybox.showLoading();
function timeConverter(UNIX_timestamp) {
var a = new Date(UNIX_timestamp * 1000);
var months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
var sec = a.getSeconds();
return `${date}.${month}.${year} ${hour}:${min}:${sec}`
}
if (app.script.currentScriptType === 'quiz') {
var SCRIPT_ID = app.script.currentScriptId
// var SCRIPT_ID = 32643
// QUIZ
am.analyticsRequest(
`api/script/${SCRIPT_ID}/passes`,
{
page: page + 1,
from: filter.from ? Math.floor(new Date(filter.from.substr(6, 4), filter.from.substr(3, 2) - 1, filter.from.substr(0, 2)).getTime() / 1000) : undefined,
to: filter.to ? Math.floor(new Date(filter.to.substr(6, 4), filter.to.substr(3, 2) - 1, filter.to.substr(0, 2)).getTime() / 1000) : undefined,
},
function (response) {
console.log('🦕 response', response)
$('.js_passages_count').text((typeof response.count != 'undefined') ? response.count : 0)
$('.js_pass_count').removeClass('hidden').find('span').text((typeof response.count != 'undefined') ? response.count : 0);
var box = $('.js_fields_box');
if (!page) {
box.find('.js_passes_table').remove();
box.find('.js_load_more').remove();
box.append('');
}
var passBox = $('.js_passes_table');
var fields = self.getFieldArray();
if (!page) {
var thead = `
${Translator.trans('fields_date')} |
${Translator.trans('fields_duration')} |
Имя |
Телефон |
Email |
`
$.each(fields, (i, field) => {
thead += `${field.name} | `
})
thead += `
|
`
passBox.append(thead)
var tbody = ''
passBox.append(tbody)
}
var tr = ''
$.each(response.logs, (i, log) => {
var emptyCol = fields.length - log.fields.length > 0
? fields.length - log.fields.length
: 0
tr += `
${timeConverter(log.timestamp)} |
${log.duration} ${log.duration > 0 ? Translator.trans('sec') + '.' : ''} |
${log.result_fields
? `
${log.result_fields.name.value} |
${log.result_fields.phone.value} |
${log.result_fields.email.value} |
`
: ' | '.repeat(3)
}
${log.fields.map(field => field.type === 'checkbox' ? `${field.value == 1 ? 'Да' : 'Нет'} | ` : `${field.value} | `)}
${' | '.repeat(emptyCol)}
|
`
})
$('#quiz-logs').append(tr)
var currentCount = document.getElementById('quiz-logs').childElementCount
if (!page && response.count > currentCount) {
box.append('' +
'
');
}
if (response.count <= currentCount) {
box.find('.js_load_more').remove()
}
$.fancybox.hideLoading();
$('.js_fields_excel').button('reset');
},
function (err) {
console.log('🦕 err', err)
$.fancybox.hideLoading();
$('.js_fields_excel').button('reset');
},
)
} else {
// SCRIPT
am.promiseCmd({
method: 'script.get_passes',
filter: filter,
id: scriptId,
page: page
}).always(function(){
$.fancybox.hideLoading();
$('.js_fields_excel').button('reset');
}).fail(function(err){
console.log(JSON.stringify(err))
}).done(function(result){
$('.js_fields_excel').attr('data-href', result.excel);
$('.js_fields_excel').data('href', result.excel);
$('.js_pass_count').removeClass('hidden').find('span').text((typeof result.count != 'undefined') ?
result.count : 0);
passFilterOperatorSelect.find('option').remove();
passFilterOperatorSelect.append('');
if (result.users) {
$.each(result.users, function(i, user) {
passFilterOperatorSelect.append('');
});
}
var box = $('.js_fields_box');
if (!page) {
box.find('.js_passes_table').remove();
box.append('');
}
var passBox = $('.js_passes_table');
var htmlHead = '' +
'' + Translator.trans('fields_date') + ' | ' +
'' + Translator.trans('fields_duration') + ' | ' +
'' + Translator.trans('missing_answer') + ' | ';
var fields = self.getFieldArray();
$.each(fields, function(i, field) {
htmlHead += '';
if (result.role === 'ROLE_SCRIPT_WRITER' || result.role === 'ROLE_ADMIN') {
htmlHead += ' '
}
htmlHead += tmp.text(field.name).html();
if (result.role === 'ROLE_SCRIPT_WRITER' || result.role === 'ROLE_ADMIN') {
htmlHead += '';
}
htmlHead += ' | ';
});
htmlHead += ' | ' + ' |
';
if (!page) {
passBox.find('tr').remove();
passBox.append(htmlHead);
box.find('.js_load_more').remove();
}
$.each(result.passes, function(i, pass) {
var htmlRow = '';
htmlRow += '' + pass.created + ' | ';
htmlRow += '' + pass.duration + (pass.duration > 0 ? ' ' + Translator.trans('sec') + '.' : '') + ' | ';
htmlRow += '' + pass.unexpected_issue + ' | ';
$.each(fields, function(i, field) {
if (pass.fields[field.id]) {
if (field.type === 'checkbox') {
htmlRow += '' + ((pass.fields[field.id].value == 1) ? 'Да' : 'Нет') + ' | ';
}
else {
htmlRow += '' + pass.fields[field.id].value + ' | ';
}
}
else {
htmlRow += ' | ';
}
});
if (pass.entity_link && pass.entity_link.length) {
htmlRow += '' + pass.entity_name + ' | ';
} else {
htmlRow += ' | ';
}
htmlRow += ' |
';
passBox.append(htmlRow);
});
if (!page && !result.is_final) {
box.append('' +
'
');
}
if (result.is_final) {
box.find('.js_load_more').remove();
}
var options = {
items: '> th:not(.no-sort)',
placeholder: 'placeholder',
helperCells: null,
cancel: '.no-sort',
handle: '.js_field_pointer',
update: function() {
var data = [];
$(passBox.find('th.js_field_col')).each(function(index, elem) {
var block = $(elem),
newIndex = block.index();
block.data('position', (newIndex + 1));
data.push({id: block.data('id'), position: (newIndex + 1)})
});
$.fancybox.showLoading();
am.promiseCmd({
method: 'script.field_save_position',
fields: data
}).always(function(){
$.fancybox.hideLoading();
}).fail(function(err){
console.log(JSON.stringify(err));
}).done(function(result){
self.fields = result;
});
}
};
passBox.sorttable(options).disableSelection();
});
}
},
getFieldArray: function() {
var fieldsArr = [];
$.each(self.fields, function(i, field) {
fieldsArr.push(field);
});
fieldsArr.sort(function(a, b){
if (a.position == b.position) return 0;
return (a.position < b.position) ? -1 : 1;
});
return fieldsArr;
},
clearAddFieldForm: function() {
if (self.fields && Object.keys(self.fields).length > 0) {
$('a[href="#tab_inuse"]').tab('show');
} else {
$('a[href="#tab_new"]').tab('show');
}
// console.log('FIELDS', self.fields);
var fieldModal = $('#show_add_field');
fieldModal.find('.js_find_input').val('').trigger('keyup');
fieldModal.find('#field_name').val('');
// fieldModal.find('#field_type').val(fieldModal.find('#field_type').find(':first').val());
fieldModal.find('#field_type').val(fieldModal.find('#field_type').find(':first').val()).trigger('change');
fieldModal.find('#field_is_from_crm').prop('checked', false);
fieldModal.find('#field_sys_name_wrap').hide();
fieldModal.find('#field_sys_name').val('');
// fieldModal.find('.tab_new_simple_field_addtype').find('a:first').trigger('click');
fieldModal.find('#readonly').prop('checked', false);
// уже используемые поля
var tab_inuse = fieldModal.find('#tab_inuse');
tab_inuse.empty();
var fields_in_use = (self.editor ? self.getFieldsFromContent(self.editor.getContent()) : []);
var ul = $('', {class:"list-unstyled", style: 'margin-top:10px'});
$.each(self.fields, function(i, field){
var text = field.name;
var is_use = fields_in_use.filter(function(item) {return item === field});
if (is_use.length > 0) {
text = ' ' + text;
}
ul.append($('', {html: $('', {style: 'margin:2px', type: 'button', class: 'btn btn-default js_' + field.id, html: text})
.data(field)
.on('click', function(){
ul.find('button').removeClass('btn-primary');
$(this).addClass('btn-primary');
})
}));
});
tab_inuse.append(ul);
// системные поля
var tab_new_other = fieldModal.find('#tab_new_other');
tab_new_other.empty();
var div = $('', {style: 'margin-top:10px'});
$.each(self.getProfileFields(), function(i, field){
div.append($('', {style: 'margin:2px', type:'button', class:'btn btn-default js_' + field.id, text: field.name})
.data(field)
.on('click', function(){
div.find('button').removeClass('btn-primary');
$(this).addClass('btn-primary');
})
);
});
tab_new_other.append(div);
// поля из crm
var crm_fields = document.crm_fields;
if (!crm_fields) {
return;
}
var tab_new_crm = fieldModal.find('#tab_new_crm_standart');
if (tab_new_crm.find('button').size()) {
return;
}
tab_new_crm.empty();
var crm_names_ul = $('', {style: 'margin-top: 15px', class: 'nav nav-tabs', role: "tablist"});
var crm_names_div = $('', {class: 'tab-content'});
tab_new_crm.append(crm_names_ul).append(crm_names_div);
var index = 0;
$.each(crm_fields, function(i, field) {
var crm_names_ul2 = $('', {style: 'margin-top: 15px', class: 'nav nav-tabs', role: "tablist"});
var crm_names_div2 = $('', {class: 'tab-content'});
if (!field.name) {
return;
}
var name_loc = Translator.trans(field.name);
field.local_name = name_loc;
var li = $('', {class: index<1?'active':'' , role:"presentation"}).append($('', {role: "tab", 'data-toggle': "tab", href: '#' + field.name, text: name_loc}));
var lidiv = $('', {role: "tabpanel", class: (index<1?'active':'') + " tab-pane", id: field.name});
crm_names_ul.append(li);
crm_names_div.append(lidiv);
lidiv.append(crm_names_ul2).append(crm_names_div2);
var index2=0;
$.each(field.fields, function (i2, field2) {
if (!field2.name) {
return;
}
var key = field.name + '_' + field2.name;
var name_loc = Translator.trans(key);
field2.local_name = name_loc;
field2.parent = field;
var li2 = $('', {class: index2<1?'active':'', role:"presentation"}).append($('', {role: "tab", 'data-toggle': "tab", href: '#' + key, text: name_loc}));
var div = $('', {role: "tabpanel", class: (index2<1?'active':'') + " tab-pane", style: 'margin-top:10px', id: key});
$.each(field2.fields, function (i3, field3) {
if (!field3.name) {
return;
}
var key = field.name + '_' + field2.name + '_' + field3.name;
var name_loc = Translator.trans(key);
field3.full_name = field.local_name + ' | ' + field2.local_name + ' | ' + name_loc;
field3.local_name = name_loc;
field3.parent = field2;
field3.key = key;
var button = $('', {style: 'margin:2px', type: 'button', class: 'btn btn-default js_crm_btn js_' + key, text: name_loc})
.data(field3);
div.append(button);
});
crm_names_ul2.append(li2);
crm_names_div2.append(div);
index2++;
});
index++;
});
// клик по кнопке в списке полей црм
tab_new_crm.on('click', '.js_crm_btn', function () {
tab_new_crm.find('button').removeClass('btn-primary');
$(this).addClass('btn-primary');
var data = $(this).data();
fieldModal.find('#field_name').val(data.local_name);
fieldModal.find('#field_type').val(data.type);
$('#field_is_from_crm').prop('checked', true);
fieldModal.find('#field_sys_name').val(data.sysname);
});
},
showAddFieldsFromEditor: function(editor) {
self.editor = editor;
var fieldModal = $('#show_add_field');
fieldModal.find('.js_modal_field_id').val('');
fieldModal.find('.modal-title').text(Translator.trans('fields'));
fieldModal.find('.js_add_field').text(Translator.trans('add'));
$('.js_multilist_values').addClass('hidden');
$('.js_multilist_values').find(".js_multilist_values_li").remove();
fieldModal.modal();
self.clearAddFieldForm();
},
// получить список полей в текстовом поле шага
getFieldsFromContent: function (content) {
var pattern = /]*>([^<]*)<\/hs>/gi;
var result;
var field;
var results = [];
while ((result = pattern.exec(content)) !== null) {
var fieldId = result[2];
// статическое поле
if (result[1] == 'js_static_field') {
$.each(self.getProfileFields(), function(i, item) {
if (item.id == fieldId) {
field = item;
}
});
} else {
field = self.fields[parseInt(fieldId, 10)];
}
if (field) {
results.push(field);
}
}
return results;
},
replaceFieldsToValues: function (content, fields) {
let pattern = /]*><\/hs>/gi;
let that = this;
return content.replace(pattern, function (match, fieldId) {
let field = fields[parseInt(fieldId, 10)];
if (!field) return '';
if (field.type === 'checkbox') {
return '' + ((field.value == 1) ? 'Да' : 'Нет') + '';
} else {
let field_val = that.formatDate(field.value)
return '' + field_val + '';
}
});
},
replaceStaticFieldsToValues: function (content, fields) {
let pattern = /]*>([^<]*)<\/hs>/gi;
return content.replace(pattern, function (match, fieldId, fieldText) {
if (!fields) return '';
let field = fields[fieldId];
if (!field) {
return '[ ' +
fieldText + ' ]';
}
return '' +
field + '';
});
},
replaceFields: function(content, valueWrapper) {
valueWrapper = valueWrapper || false;
var pattern = /]*><\/hs>/gi;
return content.replace(pattern, function(match, fieldId) {
if (!self.fields) return '';
var field = self.fields[parseInt(fieldId, 10)];
if (!field) return '';
return '' +
self.getFieldHtml(field, valueWrapper) + '';
});
},
replaceStaticFields: function(content, valueWrapper) {
var pattern = /]*>([^<]*)<\/hs>/gi;
return content.replace(pattern, function(match, fieldId, fieldText) {
if (!self.staticFields) return '';
var field = self.staticFields[fieldId];
if (!field)
{
return '[ ' +
fieldText + ' ]';
}
return '' +
field + '';
});
},
replaceFieldsToObjects: function(content) {
var pattern = /]*><\/hs>/gi;
if (!content) return content;
return content.replace(pattern, function(match, fieldId) {
var field = self.fields[parseInt(fieldId, 10)];
if (!field) return '';
return '' + field.name + '';
});
},
backReplaceFieldsInEditor: function(content) {
content = content.replace(/\r|\n/g, '');
var linkPattern = /<\s*a\s*href="([\S]*)"\s*>(.*?)<\s*\/\s*a>/gi;
content = content.replace(linkPattern, function(match, link, title) {
return '' + title + '';
});
var pattern = /.*?<\/hs>/gi;
return content.replace(pattern, function(match, fieldId) {
return self.getFieldLabel(fieldId);
});
},
addFieldToEditor: function(field) {
self.editor.insertContent(self.getFieldLabel(field.id));
},
getFieldLabel: function(fieldId) {
return '';
},
setFieldValue: function(fieldId, value) {
if (self.fields[fieldId]) {
self.fields[fieldId].value = value;
}
},
getFieldValue: function(fieldId) {
return self.fields[fieldId] ? self.fields[fieldId].value : null;
},
clearFieldValues: function () {
if (!self.fields) return;
$.each(self.fields, function (i, field) {
if (!(!field || (field.options && field.options.numberFormula))
) {
field.value = '';
}
});
},
getNumberFormulaEnding: function(value) {
let match = value
.match(new RegExp('[^-+*/]+$'));
return match ? match[0] : '';
},
validateNumberFormula: function(value, context) {
let parts = value.trim();
if(parts.length == 0){
return false;
}
parts = value = parts.replaceAll(/.*?<\/hs>/, 0);
parts = parts.replaceAll(/[^\d+-/*()]/, '')
return parts.length === value.length;
},
getContextFieldsFormula: function (value) {
let fields = {};
value.replace(new RegExp(']*><\\/hs>', 'g'), function (match) {
var formula = value.match(new RegExp(']*>'));
if (formula) {
if (formula[1] !== undefined) {
var fieldId = formula[1];
if (self.fields[fieldId]) {
fields[fieldId] = self.fields[fieldId]
}
}
}
});
return fields;
},
calcNumberFormula: function (value, context) {
let hasErrors = false;
if (!value) return 0;
let lineFields = value.match(new RegExp(']*>.*?', 'g'));
if (lineFields) {
$.each(lineFields, function (index, field) {
let formula = field.match(new RegExp(']*>.*?'));
let match;
if (formula[1] !== undefined) {
match = parseInt(formula[1]);
} else {
hasErrors = true;
return 'Ошибка!';
}
if (self.fields[match] === undefined) {
hasErrors = true;
return 'Ошибка!';
}
let fieldValue = self.getFieldValue(self.fields[match].id);
if (self.fields[match].type === 'number' && self.fields[match].options.numberFormula && self.fields[match].options.numberFormula.value) {
fieldValue = self.calcNumberFormula(self.fields[match].options.numberFormula.value)
}
if (self.fields[match] === undefined) {
hasErrors = true;
return 'Ошибка!';
}
if ((self.fields[match] !== undefined) && (fieldValue !== self.fields[match].value)) {
fieldValue = self.fields[match].value
}
if (fieldValue === null) {
hasErrors = true;
return 'Ошибка!';
}
if (!fieldValue) {
fieldValue = 0;
}
value = value.replace(field, fieldValue);
})
}
if (hasErrors) {
return value;
}
return self.calcNumberExpression(value);
},
calcNumberExpression: function (expr) {
// eval вызывается только с числовыми выражениями
expr = expr.replace('Infinity', '0')
expr = expr.replace(new RegExp('[^-+*/()\\d]', 'g'), '')
expr = eval(expr);
return expr;
},
is_js_address_loaded: null,
formatDate: function (field) {
let field_val = field;
// format date-time strings
const regexDate = RegExp('^[0-9]{4}-[0-9]{2}-[0-9]{2}$');
if (regexDate.test(field_val))
field_val = field_val + 'T00:00';
const regex = RegExp('^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2})?$');
if (regex.test(field_val)) {
let dt = new Date(field_val);
field_val = dt.toLocaleString();
}
return field_val;
},
getFieldHtml: function(field, valueWrapper) {
valueWrapper = valueWrapper || false;
let html;
if (field.type === 'text') {
html = self.getTextFieldHtml(field);
}
else if (field.type === 'textarea') {
html = self.getTextareaFieldHtml(field);
}
else if (field.type === 'checkbox') {
html = self.getCheckboxFieldHtml(field);
}
else if (field.type === 'number') {
html = self.getNumberFieldHtml(field);
}
else if (field.type === 'date') {
html = self.getDateFieldHtml(field);
}
else if (field.type === 'datetime-local') {
html = self.getDateTimeFieldHtml(field);
}
else if (field.type === 'multilist') {
html = self.getMultiListFieldHtml(field);
}
if (field.value && valueWrapper && field.type !== 'checkbox') {
let field_val = this.formatDate(field.value);
html =
'' +
'' + field_val + '' +
html +
'';
}
let $html = $('').append(html);
if (field.type === 'multilist') {
$html.find('.field__value').hide();
}
if (field.options) {
if (field.options.readonly) {
$html.find('input, textarea').prop('readonly', true);
}
if(field.options.list_values) {
var select = $html.find('select');
for(var i=0; i');
opt.attr('value', optionVal);
if(Array.isArray(field.value)) {
var checkValues = [];
$.each(field.value, function (iV,vV) {
if(vV && vV.enum_id)
checkValues.push(vV.enum_id.toString());
});
if(checkValues.includes(optionVal)) {
opt.attr('selected', true);
} else {
opt.attr('selected', false);
}
} else if(!Array.isArray(field.value) && field.value && field.value.enum_id && field.value.enum_id == optionVal) {
opt.attr('selected', true);
} else {
opt.attr('selected', false);
}
opt.html(optionTitle);
select.append(opt);
}
}
if (field.options.address) {
$html.find('input').addClass('js_address').addClass('field_dadata_address');
var suggestions_init = function (address) {
if ($.Suggestions === undefined) {
return;
}
address = address || $('.js_address');
address.suggestions({
token: "4757ac4391ee4ec0c2207d3df3d728729bea3bdc",
type: "ADDRESS",
deferRequestBy: 200,
minChars: 2,
width: 500,
onSelectNothing: function () {
var item = $(this);
var name = item.prop('name');
$('.js_address').each(function (i,v) {
if (name == $(v).prop('name')) {
item.val('');
var group = $(v).closest('.js_field');
group.removeClass('has-success').addClass('has-error').addClass('has-feedback');
group.find('.form-control-feedback').remove();
$('', {class: "glyphicon glyphicon-remove form-control-feedback", 'aria-hidden': true}).insertAfter($(v));
$(v).tooltip('destroy');
}
});
},
onSelect: function(suggestion) {
if (suggestion == undefined) {
return;
}
var data = suggestion.data;
var title = 'Почтовый индекс: ' + (data.postal_code || '') + '
' +
'Регион / район: ' + (data.region_with_type || '') + '
' +
'Город / н.п.: ' + (data.city_with_type || '') + '
' +
'Район: ' + (data.settlement_with_type || '') + '
' +
'Улица: ' + (data.street_with_type || '') + '
' +
'КЛАДР: ' + (data.kladr_id || '') + '
' +
'ФИАС: ' + (data.fias_id || '') + '
';
var item = $(this);
var name = item.prop('name');
var d = item.data('suggestions');
d['selection'] = suggestion;
$('.js_address').each(function (i,v) {
if (name == $(v).prop('name')) {
var group = $(v).closest('.js_field');
group.find('.form-control-feedback').remove();
group.removeClass('has-error').addClass('has-success').addClass('has-feedback');
var span = $('', {class: "glyphicon glyphicon-ok form-control-feedback", 'aria-hidden': true});
$(v).tooltip({html: true}).tooltip('hide')
.attr('data-original-title', title);
span.insertAfter($(v));
$(v).data('suggestions', d);
}
});
},
});
};
if (self.is_js_address_loaded == null) {
self.is_js_address_loaded = true;
setTimeout(function () {
$('head').append('');
$.getScript('//cdn.jsdelivr.net/npm/suggestions-jquery@17.10.0/dist/js/jquery.suggestions.min.js', function (data) {
suggestions_init();
});
}, 10);
} else {
setTimeout(function () {
suggestions_init();
}, 10);
}
}
}
return $html.html();
},
encodeHTML: function (s) {
return String(s)
.split('&').join('&')
.split('<').join('<')
.split('"').join('"')
.split("'").join(''');
},
getTextFieldHtml: function(field) {
return '';
},
getTextareaFieldHtml: function(field) {
return '';
},
getCheckboxFieldHtml: function(field) {
return '' +
'' +
'';
},
getNumberFieldHtml: function(field) {
return '';
},
getDateFieldHtml: function(field) {
let val = field.value;
const regex = RegExp('^[0-9]{4}-[0-9]{2}-[0-9]{2}$');
if(regex.test(val))
val = val + 'T00:00';
return '';
},
getDateTimeFieldHtml: function(field) {
return '';
},
getMultiListFieldHtml: function(field) {
let multiple = 'multiple="multiple"';
if(field.options && field.options.simpleList) {
multiple = '';
}
let html = '' +
'';
return html;
},
addCRMField: function(field, editor) {
am.promiseCmd({
method: 'script.add_crm_field',
id: field.id,
script_id: $('.js_editor').data('id')
}).done(function(result) {
self.editor = editor;
self.loadFields(function(){
self.addFieldToEditor(result);
});
}).fail(function(err){
console.log(JSON.stringify(err));
});
},
getFieldMenu: function(editor) {
return;
var menu = [
{text: Translator.trans('add_field'), onclick: function() {
self.showAddFieldsFromEditor(editor);
}}
];
var reservedFields = self.getCRMFields();
var customCrmFields = [];
var first = false;
$.each(self.fields, function(i, field){
if (typeof field == 'undefined') return;
if (!field.sys_name) {
if (!first) {
first = true;
menu.push({text: '-'});
}
menu.push({
text: field.name,
onclick: function(){
editor.insertContent(self.replaceFieldsToObjects(self.getFieldLabel(field.id)));
}
});
} else if (!reservedFields[field.sys_name]) {
customCrmFields.push(field);
}
});
menu.push({text: '-'});
menu.push({text: Translator.trans('crm_fields'), classes: 'crm-separator'});
$.each(self.getCRMFields(), function(i, field) {
menu.push({
text: field.name,
onclick: function(){
self.addCRMField(field, editor);
}
})
});
// custom crm fields
if (customCrmFields.length > 0) {
//menu.push({text: '-'});
$.each(customCrmFields, function(i, field) {
menu.push({
text: field.name,
onclick: function(){
editor.insertContent(self.replaceFieldsToObjects(self.getFieldLabel(field.id)));
}
});
});
}
// adding into menu profile fields
menu.push({text: Translator.trans('profile_fields'), classes: 'crm-separator'});
$.each(self.getProfileFields(), function(i, field) {
menu.push({
text: field.name,
onclick: function(){
editor.insertContent(''+field.name+'');
}
})
});
return menu;
}
};
})();