function strip_html(html) {
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
var tmp2 = document.createElement("DIV");
tmp2.innerHTML = tmp.textContent || tmp.innerText || "";
return tmp2.textContent || tmp2.innerText || "";
}
var appasyncadd = appasyncadd || [];
(function() {
var app = {},
am = {},
self = {};
var loader = function(an_app) {
app = an_app;
am = app.misc;
app.script = module;
self = module;
self.init();
};
setTimeout(function() { appasyncadd.push(loader); }, 0);
var busy, edit, desk, jsp = null;
var module = {
role: null,
_isHs: null,
view_notes: [],
starred: {
data: [],
readonly: false,
_shrinkString: function(string, len = 35) {
let ret = string;
if (ret.length > len) {
let trimmedString = ret.substr(0, len);
ret = trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(" ")));
ret = ret + " ...";
}
if (ret.trim() === "")
ret = Translator.trans('default_step_title')
return ret;
},
itemHtml: function(id, title, withControls = true) {
return '
' +
'' +
(withControls ? '' : '') +
'
' + title + '' +
(withControls ? '
' : '') +
'
' +
'';
},
_getItemCategory(id) {
let cat = this.data.filter((g) => Array.isArray(g.s) ? g.s.includes(id) : null);
if (!cat || (Array.isArray(cat) && cat.length === 0)) return null;
return cat[0].n;
},
_getStepTitle: function(id, steps = null) {
let ret = '';
let filtered = [];
if (steps) {
filtered = steps.filter(step => step.id === id);
} else if (self.steps) {
filtered = self.steps.filter(step => step.id === id);
} else {
filtered = self.view.runningScriptData.steps.filter(step => step.id === id);
}
let step;
if (filtered.length > 0) {
step = filtered[0];
if (step.title && step.title.trim().length > 0)
ret = strip_html(step.title);
else
ret = strip_html(step.text);
} else {
ret = $('#' + id).find('.text').text();
}
ret = this._shrinkString(ret, 35);
return ret;
},
selectOperator(stepId) {
let fav_box = $('.js_starred_box');
fav_box.find('.js_starred_item').removeClass('selected');
fav_box.find('.js_starred_item[data-id=' + stepId + ']').addClass('selected');
fav_box.find('.js_starred_item[data-id=' + stepId + ']').addClass('visited');
},
clearBox: function() {
let ul = $(".js_starred_list_sorting");
ul.html("");
},
renderBox: function() {
this.bindStarredEvents();
let ul = $(".js_starred_list_sorting");
ul.html("");
this.data.forEach(function(group, index) {
if (group.s && Array.isArray(group.s)) {
let itemsUl = '';
group.s.forEach(function(item) {
let title = self.starred._getStepTitle(item)
itemsUl += self.starred.itemHtml(item, title);
});
itemsUl += '
';
if (group.s.length > 0)
ul.append('" + itemsUl + "");
}
});
$.each($('.js_starred_group'), function(index, el) {
$(el).children('div').prepend('');
let others = Translator.trans('step_category.others');
if ($(el).data("id") !== others)
$(el).children('div').append('' +
'');
});
$.each($('.js_starred_item'), function(i, e) {
let stepId = $(e).data('id');
let filtered = self.steps.filter(step => step.id === stepId);
let starred = false;
if (filtered.length > 0) {
starred = filtered[0].is_starred;
} else {
starred = $('#' + stepId).hasClass('is_starred');
}
self.starred.setDisabled($(e), !starred);
});
self.starred._bindSortables();
},
_bindSortables: function() {
let ul = $(".js_starred_list_sorting");
let ulItems = $(".starred-group-items");
try {
ul.sortable('destroy');
ulItems.sortable('destroy');
} catch (e) {}
ul.sortable({
connectWith: '.js_starred_list_sorting',
stop: function(e, ui) {
self.starred.refreshSorting();
}
});
ulItems.sortable({
connectWith: '.starred-group-items',
stop: function(e, ui) {
self.starred.refreshSorting();
}
});
},
setDisabled: function(itemEl, disabled) {
if (disabled) {
itemEl.find('.starred-eye-icon').removeClass('glyphicon-eye-close').addClass('glyphicon-eye-open');
itemEl.addClass('disabled');
} else {
itemEl.find('.starred-eye-icon').addClass('glyphicon-eye-close').removeClass('glyphicon-eye-open');
itemEl.removeClass('disabled');
}
},
bindStarredEvents: function() {
// search
$('.js_starred_search').off().on('change keyup', function() {
self.starred.search($(this));
});
let ul = $(".js_starred_list_sorting");
ul.off();
// item click
ul.on('click', '.js_starred_item a', function(e) {
e.preventDefault();
let stepId = $(this).data('id');
let stepEl = $('#' + stepId);
self.constructor.onStepSelected(stepEl);
$('.js_constructor_box').show();
$('.js_view_box').hide();
$('.js_scripts_action_view').addClass('open').removeClass('active');
$('.js_show_constructor').addClass('active');
$('html, body').animate({
scrollTop: stepEl.offset().top - 150,
scrollLeft: stepEl.offset().left - 350
}, 300);
});
//enabled/disabled
ul.on('click', '.starred-eye-icon', function(e) {
e.preventDefault();
let itemEl = $(this).closest('.js_starred_item');
let isStarred = itemEl.hasClass('disabled');
self.starred.setDisabled(itemEl, !isStarred);
let id = itemEl.data("id");
let s = $('#' + id);
s.data('is_starred', isStarred);
s.data('starred_text', '');
s[isStarred ? 'addClass' : 'removeClass']('is_starred');
am.trigger('constructor step is_starred changed', [s]);
});
ul.on('click', '.group-fold', function(e) {
e.preventDefault();
$(this).closest('.js_starred_group').find('.starred-group-items').toggleClass('folded');
});
// group edit
ul.on('click', '.starred-edit', function(e) {
e.preventDefault();
let groupLi = $(this).parents('.js_starred_group');
let category = groupLi.data("id");
app.get('all').done(function(all) {
let input = '';
all.addition.show(Translator.trans('rename_starred_group_message'), input, function() {
let newName = $('#rename_starred_group_input').val();
self.starred.data.map((g) => {
if (g.n === category) {
g.n = newName;
}
});
groupLi.attr("data-id", newName);
groupLi.children('div').children('a').text(newName);
self.starred.onDataChanged();
am.trigger("constructor starred category renamed");
});
});
});
// group delete
ul.on('click', '.starred-remove', function(e) {
e.preventDefault();
let groupLi = $(this).parents('.js_starred_group');
let category = groupLi.data("id");
app.get('all').done(function(all) {
all.confirm.show(Translator.trans('confirm_remove_starred_group') + " \"" + category + "\"?", function() {
let gsToRemove = self.starred.data.filter((g) => g.n === category);
if (Array.isArray(gsToRemove))
gsToRemove = gsToRemove[0];
else
return;
// move steps to others
let others = Translator.trans('step_category.others');
self.starred.data.map((g) => {
if (g.n === others) {
gsToRemove.s.forEach((s) => {
g.s.push(s);
});
}
})
self.starred.data = self.starred.data.filter((g) => g.n !== category);
self.starred.onDataChanged();
groupLi.remove();
am.trigger("constructor starred category removed");
self.starred.renderBox();
});
});
});
},
refreshSorting: function() {
let ul = $(".js_starred_list_sorting");
let newData = [];
$.each(ul.find('.js_starred_group'), function(index, el) {
let group = $(el).data("id");
let steps = []
$.each($(el).find('.js_starred_item'), function(idx, s) {
steps.push($(s).data("id"));
});
newData.push({
"n": group,
"s": steps
});
});
this.data = newData;
self.starred.onDataChanged();
am.trigger("constructor starred order changed");
},
remove: function(steps) {
$.each(steps, function(idx, jel) {
let sId = jel.attr("id");
self.starred.data.map((g) => {
g.s = g.s.filter(s => sId !== s);
});
$('.js_starred_item[data-id=' + sId + ']').remove();
});
self.starred.onDataChanged();
},
add: function(steps) {
let others = Translator.trans('step_category.others');
$.each(steps, function(idx, jel) {
let id = $(jel).attr("id");
if (self.starred.data.filter((g) => g.n === others).length < 1) {
//add new cat if not exist
self.starred.data.push({
"n": others,
"s": []
});
let ul = $(".js_starred_list_sorting");
let title = $(jel).find(".text").text();
ul.append('' +
'' +
"");
}
self.starred.data.map((g) => {
if (g.n === others) {
g.s.push(id);
}
});
$.each($('.js_starred_group>div>a'), function(idx, el) {
if ($(el).text().includes(others)) {
let ul = $(el).parents('.js_starred_group').find('.starred-group-items');
let title = $(jel).find(".text").text();
ul.append(self.starred.itemHtml(id, title));
}
});
self.starred.onDataChanged();
self.starred._bindSortables();
})
},
change: function(steps) {
$.each(steps, function(idx, jel) {
let id = $(jel).attr("id");
let title = $(jel).find(".text").text();
title = self.starred._shrinkString(title, 40);
$('.js_starred_item[data-id=' + id + ']>div>a').text(title);
let newCategory = $(jel).data('category');
let oldCategory = self.starred._getItemCategory(id);
if (newCategory && newCategory !== oldCategory) {
if (self.starred.data.filter((g) => g.n === newCategory).length < 1) {
//add new cat if not exist
self.starred.data.push({
"n": newCategory,
"s": []
});
}
self.starred.data.map((g) => {
if (g.n === oldCategory) {
let idx = g.s.indexOf(id);
if (idx > -1) {
g.s.splice(idx, 1);
}
}
if (g.n === newCategory) {
if (!g.s)
g.s = [];
g.s.push(id);
}
});
self.starred.onDataChanged();
self.starred.renderBox();
}
})
},
search: function(el) {
let q = el.val().toLowerCase();
let filtered = [];
if (self.steps) {
filtered = self.steps.filter(step => {
return (step.text && step.text.toLowerCase().includes(q)) || (step.title && step.title.toLowerCase().includes(q));
});
} else {
filtered = self.view.runningScriptData.steps.filter(step => {
return (step.text && step.text.toLowerCase().includes(q)) || (step.title && step.title.toLowerCase().includes(q));
});
}
$('.js_starred_item').hide();
$('.js_starred_group').hide();
filtered.forEach(s => {
let stEl = $('.js_starred_item[data-id=' + s.id + ']');
let parent = stEl.parents('.js_starred_group');
parent.show();
parent.find('.folded').removeClass('folded');
stEl.show();
})
},
set readOnly(readonly) {
this.readonly = readonly;
let ul = $(".js_starred_list_sorting");
if (readonly) {
ul.addClass('readonly');
} else {
ul.removeClass('readonly');
}
},
get readOnly() {
return this.readonly;
},
onDataChanged() {
// drop empty cats
this.data = this.data.filter((g) => Array.isArray(g.s) && g.s.length > 0);
// hide empty cats
$('.js_starred_group').hide();
this.data.forEach(g => {
$('.js_starred_group[data-id=\'' + g.n + '\']').show();
})
},
},
isHs: function() {
if (self._isHs === null) {
self._isHs = $('body').hasClass('hs');
$('body').removeClass('hs');
}
return self._isHs;
},
view: {
setProgress: function(percent) {
percent = Math.min(100, am.naturalize(percent));
$('.progressBar .progressPercent').text(percent);
$('.progressBar .progressLineFill').width(Math.round($('.progressBar .progressLineBack').width() * percent / 100));
},
nlToArray: function(str) {
if (typeof str === 'number') str = str.toString();
if (typeof str !== 'string') str = '';
str = str.trim();
var arr = str.split('\n');
if (arr.length === 1) return str;
return arr;
},
convertScript: function(data) {
if (!data || !data.steps || !$.isArray(data.steps)) {
throw 'Некорректные данные';
}
var hash = {};
var list = [];
$.each(data.steps, function(i, o) {
if (!o.id) {
throw 'Некорректный шаг в данных';
}
hash[o.id] = {
id: o.entity_id,
name: o.id,
is_starred: o.is_starred,
is_goal: o.is_goal,
starred_text: o.starred_text,
starred_sorting: o.starred_sorting,
text: self.view.nlToArray(o.text),
buttons: [],
tasks: o.tasks
};
list.push(hash[o.id]);
});
if (data.connections && $.isArray(data.connections)) {
$.each(data.connections, function(i, o) {
if (!o.source || !o.target || typeof o.condition !== 'string') {
throw 'Некорректная связь в данных';
}
var s = o.source;
var t = o.target;
if (!hash[s] || !hash[t]) {
throw 'Некорректная связь в данных';
}
hash[s].buttons.push({ state: t, text: o.condition, id: o.id, status: o.status });
});
}
return self.view.setNodeDistances(list);
},
setNodeDistances: function(data) {
if (!$.isArray(data) || data.length < 1) return data;
var Node = function(id) {
this.id = id;
this.distanceFromStart = null;
this.distanceToEnd = null;
this.parents = [];
this.children = [];
};
var start = null;
var net = {};
$.each(data, function(i, o) {
net[o.name] = new Node(o.name);
if (o.name === 'start') {
start = net[o.name];
}
});
if (!start) {
start = data[0];
}
$.each(data, function(i, o) {
if (!$.isArray(o.buttons)) return;
$.each(o.buttons, function(i, b) {
net[o.name].children.push(net[b.state]);
if ($.inArray(net[o.name], net[b.state].parents) < 0) {
net[b.state].parents.push(net[o.name]);
}
});
});
var ends = [];
$.each(net, function(i, o) {
if (o.children.length < 1) {
ends.push(o);
}
});
var updateDistance = function(waveFrontNodes, distProp, listProp, dist, waveName) {
if (waveFrontNodes.length < 1) return;
var nextWaveFrontNodes = [];
$.each(waveFrontNodes, function(i, o) {
if (o['wave' + waveName + 'passed']) return;
o['wave' + waveName + 'passed'] = true;
o[distProp] = dist;
nextWaveFrontNodes = nextWaveFrontNodes.concat(o[listProp]);
});
updateDistance(nextWaveFrontNodes, distProp, listProp, dist + 1, waveName);
};
updateDistance([start], 'distanceFromStart', 'children', 0, 'start');
updateDistance(ends, 'distanceToEnd', 'parents', 0, 'ends');
$.each(net, function(i, o) {
if (o.distanceFromStart === null) {
o.distanceFromStart = 0;
}
if (o.distanceToEnd === null) {
o.distanceToEnd = Infinity;
}
});
$.each(data, function(i, o) {
var fromStart = net[o.name].distanceFromStart;
var total = fromStart + net[o.name].distanceToEnd;
o.progress = total > 0 ? Math.round(fromStart / total * 1000) / 10 : 0;
});
return data;
},
appendUnexpectedBoxToLogItem: function(id) {
var box = $('.log').find('.item[data-id=' + id + ']');
var html =
'' +
'' +
'
';
box.append(html);
},
logStep: function(step, status, cid) {
am.trigger('log step', [step, status, cid]);
//If step from other script
var matches = step.name.match(/^(\d+)_(s\d+|start)/);
if (matches) {
var scriptId = matches[1],
stepName = matches[2];
//self.view.stopScriptAndSaveLog('cross', true);
busy = true;
$.fancybox.showLoading();
$('.log .item').addClass('previous-item');
self.crossScript = true;
let params = {};
params.method = 'api.getIntegrationScript';
params.user = self.view.scriptUser;
params.key = self.view.scriptUserKey;
params.apikey = self.view.scriptApiKey;
params.id = scriptId;
$.post(myDomain + '/ajax', params, function(data) {
let result = data.response;
busy = false;
$.fancybox.hideLoading();
let fields = result.fields;
$.each(fields, function(i, field) {
let val = app.addField.getFieldValueByName(field.name);
if (val) {
field.value = val;
}
});
app.addField.setFields(fields);
self.view.launchScript(result.id, result.ver, result.name, result.data, result.target, stepName);
});
return;
}
cid = cid || '';
var lel = $('.log');
lel.find('.unexpected_answer').remove();
var buttonsIsArray = step.buttons && $.isArray(step.buttons);
var html = [
' 0 ? 'n' : 'y') + '">',
'
' + (lel.find('.item').length + 1) + ' >
',
'
' + ($.isArray(step.text) ? step.text.join(' ') : step.text) + '
',
(buttonsIsArray ? $.map(step.buttons, function(b) {
var className = (b.status === 'positive' ? 'btn-success' : '') +
(b.status === 'negative' ? 'btn-danger' : '') +
(b.status !== 'positive' && b.status !== 'negative' ? 'btn-default' : '');
var button = $('
', {
class: "set_state btn " + className,
text: (b.text ? b.text : '...'),
'data-id': (b.id ? b.id : ''),
'data-state': (b.state ? b.state : 'no_state_defined')
});
return button[0].outerHTML;
}).join('') : ''),
(step.progress && step.progress >= 100 ?
'
' :
'
'),
'
'
].join('\n');
lel.find('.item').fadeTo(0, 0.5);
html = app.addField.replaceFields(html, true);
lel.append(html);
lel.find('.js_script_field_multilist').each(function(index, select) {
var placeholder = $(this).attr('placeholder');
$(this).select2({
width: '196px',
placeholder: placeholder
});
});
lel.scrollTop(lel[0].scrollHeight);
$('.js_view_box .progressBar .talk_is_over')[step.progress && step.progress >= 100 ? 'hide' : 'show']();
self.starred.selectOperator(step.name);
},
testProgressBar: function() {
var pr = 0;
var pi = setInterval(function() {
self.view.setProgress(pr++);
if (pr > 100) clearInterval(pi);
}, 100);
},
testLogHeight: function() {
for (var i = 0; i < 50; i++) {
$('.log').append('' + i + ' ' + Math.random() + '
');
}
},
openAndLaunchScript: function(id, ver, name, data, target) {
self.view.lastOpenData = [id, ver, name, data, target];
let vbel = $('.js_view_box');
vbel.find('.js_starred_search').val('');
vbel.find('.log').html('' +
'
');
vbel.find('.progressPercent').text(0);
vbel.find('.progressLineFill').width(0);
self.view.launchScript(id, ver, name, data, target);
},
lastOpenData: [],
reopenAndLaunchScript: function() {
self.view.openAndLaunchScript.apply(self.view, self.view.lastOpenData);
},
runningScriptId: null,
runningScriptVer: null,
scriptUser: null,
scriptUserKey: null,
scriptApiKey: null,
withoutSaving: null,
runningScriptData: null,
launchScript: function(id, ver, name, data, target, toState, cid) {
toState = toState || null;
cid = cid || null;
self.view.runningScriptData = data;
$('.log .heading h2').text(name);
$('.log .heading').show();
if (target) {
$('.script-target').show().find('.target-content').text(target);
} else {
$('.script-target').hide();
}
var f = new app.Fsm();
f.disableToCheck();
f.addState('init', {
name: 'init',
off: function() {
$('.log .heading').remove();
}
});
var steps = null;
try {
steps = self.view.convertScript(data);
} catch (e) {
alert('Что-то пошло не так при запуске скрипта, попробуйте перезагрузить страницу');
return;
}
$.each(steps, function(i, s) {
f.addState(s.name, {
name: s.name,
on: function(data) {
var cid;
if (typeof data != 'undefined') {
cid = data.cid;
}
self.view.logStep(s, this.next, cid);
self.view.setProgress(s.progress ? s.progress : 0);
}
});
});
if (data.starred)
self.starred.data = data.starred;
self.view.renderStarredBox(steps);
f.init('init');
self.view.fsm = f;
let vbel = $('.js_view_box');
vbel.unbind('click.setState').on('click.setState', '.js_starred_item>div>a, .item .set_state, button.set_state', function(e) {
e.preventDefault();
let button = $(this);
let par = button.parents('.item').first();
let removeCount = 0;
if (!par.is($('.log .item').last())) {
removeCount = par.nextAll().length;
par.nextAll().remove();
}
let nextState = button.data('state') || button.data('id');
if (!nextState) {
return;
}
let cid = button.data('id');
let script = par.data('script');
if (script && script.id != self.view.runningScriptId) {
busy = true;
$.fancybox.showLoading();
let params = {};
params.method = 'api.getIntegrationScript';
params.user = self.view.scriptUser;
params.key = self.view.scriptUserKey;
params.apikey = self.view.scriptApiKey;
params.id = script.id;
$.post(myDomain + '/ajax', params, function(data) {
let result = data.response;
busy = false;
$.fancybox.hideLoading();
let fields = result.fields;
app.addField.setFields(fields);
self.view.launchScript(
result.id, result.ver,
result.name, result.data, result.target,
button.data('state'), cid
);
});
} else {
f.to(nextState, { cid: cid });
}
try { top.postMessage({ type: 'state_changed', z: self.view.runningScriptId, s: nextState, c: cid, r: removeCount }, '*') } catch (e) {}
});
vbel.unbind('keyup.jsField change.jsField click.jsField')
.on('keyup.jsField change.jsField click.jsField', '.js_script_field', function() {
$('.js_view_box .js_field').removeClass('active');
$(this).parents('.js_field').addClass('active');
var value = $(this).val();
var fieldId = $(this).parents('.js_field').data('id');
var field = app.addField.getField(fieldId);
if (!field) return;
app.addField.setFieldValue(fieldId, value);
if (field.type === 'checkbox') {
app.addField.setFieldValue(fieldId, (($(this).is(':checked')) ? 1 : 0));
let checkboxes = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active').find('.js_script_field');
if ($(this).is(':checked')) {
checkboxes.prop('checked', true);
} else {
checkboxes.prop('checked', false);
}
try { top.postMessage({ type: 'field_changed', z: self.view.runningScriptId, id: fieldId, t: field.type, v: $(this).is(':checked') }, '*') } catch (e) {}
} else if (field.type === 'multilist') {
let multiField = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active');
multiField.find('.js_script_field').val(value).trigger('change.select2');
multiField.find('.field__value').text(value);
} else {
let elnactive = $('.js_view_box .js_field[data-id=' + fieldId + ']').not('.active');
elnactive.find('.js_script_field').val(value);
elnactive.find('.field__value').text(value);
// пересчет полей с формулами
if (field.type === 'number') {
$.each(app.addField.getFields(), function(id, fieldFormulas) {
if (fieldFormulas.type === 'number' &&
fieldFormulas.options.numberFormula &&
fieldFormulas.options.numberFormula.value &&
fieldFormulas.options.numberFormula.value.indexOf('data-id="' + field.id + '"') !== -1) {
let nffValue = app.addField.calcNumberFormula(
fieldFormulas.options.numberFormula.value
);
app.addField.setFieldValue(fieldFormulas.id, nffValue);
let fField = $('.js_view_box .js_field[data-id=' + fieldFormulas.id + ']').not('.active');
fField.find('.js_script_field').val(nffValue);
fField.find('.field__value').text(nffValue);
}
});
}
try { top.postMessage({ type: 'field_changed', z: self.view.runningScriptId, id: fieldId, t: field.type, v: value }, '*') } catch (e) {}
}
self.view.renderNotesBox($('.js_outnotes_box .outnotes_box-search input').val());
});
$('.js_view_box .progressBar .talk_is_over').show();
self.view.runningScriptId = id;
self.view.runningScriptVer = ver;
self.view.renderFieldsBox();
if (self.isHs() && !toState) {
f.to('start');
} else if (toState) {
if (cid) {
f.to(toState, { cid: cid });
} else {
f.to(toState);
}
}
try { top.postMessage('send_history', '*') } catch (e) {}
self.view.renderNotesBox();
$('.js_render_widgets, .js_starred_box, .js_outfields_box, .js_outnotes_box').removeClass('view_box__closed');
$('.outnotes_box-search input').val('');
$('.js_render_widgets').addClass('view_box__closed');
if (true) {
$('.js_outfields_box').addClass('view_box__closed');
$('.js_outnotes_box').addClass('view_box__closed');
} else {
$('.js_outfields_box').addClass('view_box__closed');
}
//self.view.renderClosedViewBox();
am.trigger('start script');
},
renderStarredBox: function(steps) {
let box = $('.js_starred_box');
box.parent('.view_box_sidebar').show();
box.hide();
let ul = $(".js_starred_list_operator");
ul.find('.js_starred_group').remove();
ul.html("");
let stepsStarred = self.starred.data;
if (!stepsStarred.length) {
return;
}
ul.off('click', '.group-fold').on('click', '.group-fold', function(e) {
e.preventDefault();
$(this).closest('.js_starred_group').find('.starred-group-items').toggleClass('folded');
$(this).toggleClass('folded');
});
stepsStarred.forEach(function(group, index) {
if (group.s && Array.isArray(group.s)) {
let ss = group.s.filter(s => {
let starred = false;
steps.forEach(function(step) {
if (step.name === s) {
starred = step.is_starred;
}
});
return starred;
});
let itemsUl = '';
ss.forEach(function(item) {
let title = self.starred._getStepTitle(item)
itemsUl += self.starred.itemHtml(item, title, false);
});
itemsUl += '
';
if (ss.length > 0)
ul.append('" + itemsUl + "");
}
});
box.show();
$('.js_starred_search').off().on('change keyup', function() {
self.starred.search($(this));
});
},
renderNotesBox: function(search) {
search = search || null;
var recommendNotes = app.notes.getRecommendNotes();
var box = $('.js_outnotes_box');
box.show();
box.find('.outnotes_box-item').remove();
box.find('.outnotes_box-ul').remove();
if (typeof self.view_notes != 'object' || self.view_notes.length === 0) {
box.hide();
return;
}
var array = [];
$.each(self.view_notes, function(i, item) {
item.style = null;
if ($.inArray(item.id, recommendNotes) != -1) {
item.priority = 999999 + item.priority;
item.style = 'font-weight: bold';
}
array.push(item);
});
var view_notes_sorted = array.sort(function(a, b) {
return b.priority - a.priority;
});
if (search) {
view_notes_sorted = $(view_notes_sorted).filter(function(i, o) {
if (o.title.toLowerCase().indexOf(search.toLowerCase()) == -1 &&
o.content.toLowerCase().indexOf(search.toLowerCase()) == -1) {
return;
}
return true;
});
}
var categories = [];
var categories_other = [];
$.each(view_notes_sorted, function(j, o) {
var ids = categories.map(function(value) { return value.id });
if (o.category_id && $.inArray(o.category_id, ids) < 0) {
categories.push({ id: o.category_id, text: o.category, childs: [] });
}
ids = categories.map(function(value) { return value.id });
var cat = $.inArray(o.category_id, ids);
if (cat > -1) {
categories[cat].childs.push(o);
} else {
categories_other.push(o);
}
});
$(categories_other).each(function(k, v) {
var div = $('', { class: "outnotes_box-item", text: v.title, style: v.style }).data('id', v.id);
box.append(div);
});
var ul = $('', { class: 'outnotes_box-ul', style: 'padding-left:0;' });
$(categories).each(function(k, v) {
var li = $('').on('click', '.category_show, .glyphicon', function() {
var libox = $(this).closest('li');
libox.find('span.glyphicon').toggleClass('glyphicon-chevron-down');
libox.find('li').toggle();
});
var ul2 = li
.append('')
.append($('', { text: v.text, class: 'category_show' }))
.append($('', { style: 'padding-left:0;' })).find('ul');
$(v.childs).each(function(k2, v2) {
var div = $('', { style: 'margin-left:10px;' + v2.style, class: "outnotes_box-item", text: v2.title }).data('id', v2.id);
ul2.append($('').append(div).hide());
});
ul.append(li);
});
box.append(ul);
$('.outnotes_box-recommend').hide();
$('.outnotes_box-other').addClass('hidden');
},
renderFieldsBox: function() {
var box = $('.js_outfields_box');
box.find('div,hs').remove();
var fields = app.addField.getFieldArray();
if (fields.length == 0) {
box.hide();
} else {
box.show();
box.parent('.view_box_sidebar').show();
}
$.each(fields, function(i, field) {
if (field.type == 'checkbox') {
box.append('' +
app.addField.getFieldHtml(field) + '');
} else {
box.append('' +
app.addField.getFieldHtml(field) + '' + '
');
}
});
box.find('.js_script_field_multilist').each(function(index, select) {
var placeholder = $(this).attr('placeholder');
$(this).select2({
width: '196px',
placeholder: placeholder
});
});
},
stopScriptAndSaveLog: function(endButton) {
am.trigger('stop script');
if (!self.crossScript) {
self.fields = app.addField.getFields();
}
if (busy) return;
if (!self.view.runningScriptId || !self.view.runningScriptVer) {
alert('Скрипт не запущен');
return;
}
busy = true;
$.fancybox.showLoading();
var outcome = 'unknown';
if (endButton.hasClass('talk_is_over')) {
var ls = $('.log .item').last();
if (ls.length > 0) {
if (ls.data('is_end') === 'y') {
outcome = 'ok';
} else {
outcome = 'forced_interruption';
}
} else {
outcome = 'forced_interruption';
}
} else if (endButton.hasClass('unexpected_answer')) {
outcome = 'unexpected_answer';
}
var script_ids = [];
var log = $('.log .item').map(function(i, o) {
var s = $(o);
var script = s.data('script');
var script_id = script.id * 1;
if (script_ids.indexOf(script_id) < 0) {
script_ids.push(script_id);
}
return { id: s.data('id'), cid: s.data('cid'), script: s.data('script') };
}).get();
var data = self.view.lastOpenData[3];
var steps = data.steps;
var is_goal = false;
steps.forEach(function(s, i) {
if (s.is_goal) {
log.forEach(function(s2) {
if (s2.id === s.id) {
is_goal = true;
}
});
}
});
Placeholders.disable();
var usedIds = [];
var fields = $('.js_view_box').find('.js_script_field').map(function(i, o) {
var e = $(o);
var fieldId = e.attr('name');
var field = app.addField.getField(fieldId);
if (usedIds.indexOf(fieldId) != -1) return;
usedIds.push(fieldId);
if (field.type == 'checkbox') {
return {
id: fieldId,
sys_name: field.sys_name,
name: field.name,
value: (e.is(':checked')) ? 1 : 0
}
} else if (field.type == 'multilist') {
var resultValue = [];
if (e.attr('multiple')) {
if (e.val()) {
$.each(e.val(), function(i, v) {
e.find('option').each(function(optionI, option) {
if ($(option).val() == v) {
resultValue.push({ id: $(option).val(), value: $(option).html() });
}
});
});
}
} else {
e.find('option').each(function(optionI, option) {
if ($(option).val() == e.val()) {
resultValue.push({ id: $(option).val(), value: $(option).html() });
}
});
}
return {
id: fieldId,
value: resultValue,
name: field.name,
sys_name: field.sys_name
}
} else {
return {
id: fieldId,
value: e.val(),
name: field.name,
sys_name: field.sys_name
}
}
}).get();
var unexpected = $('.log').find('.unexpected_answer_input').map(function(i, o) {
var e = $(o);
console.log("var e = $(o);");
return { id: e.data('id'), value: strip_html(e.val()) }
}).get();
if (unexpected.length > 0) {
outcome = 'unexpected_answer';
}
Placeholders.enable();
if (self.view.withoutSaving) {
busy = false;
$.fancybox.hideLoading();
self.view.runningScriptId = null;
self.view.runningScriptVer = null;
self.view.reopenAndLaunchScript();
return;
}
var script_save_log_func = function(scr_id, scr_ver, logs, duration) {
am.promiseCmd({
method: 'api.integration_save_log',
id: scr_id,
ver: scr_ver,
outcome: outcome,
log: logs,
user: self.view.scriptUser,
key: self.view.scriptUserKey,
apikey: self.view.scriptApiKey,
fields: fields,
unexpected: unexpected,
duration: duration
}).always(function() {
busy = false;
$.fancybox.hideLoading();
self.view.runningScriptId = null;
self.view.runningScriptVer = null;
}).fail(function(err) {
app.get('all').done(function(all) {
all.message.show('err: ' + JSON.stringify(err));
});
}).done(function(res) {
self.view.reopenAndLaunchScript();
});
};
if (script_ids.length) {
for (var i = 0; i < script_ids.length; i++) {
var script_id = script_ids[i];
var script_ver = null;
var logbyscr = $.map(log, function(o, i) {
if (script_id != o.script.id) {
return;
}
script_ver = o.script.ver;
return o;
});
var duratinonScr = app.passTimer.getTime();
if (i > 0) {
duratinonScr = 0;
}
script_save_log_func(script_id, script_ver, logbyscr, duratinonScr);
}
}
app.addField.clearFieldValues();
$(document).trigger('scriptDone', {
fields: fields,
is_goal: is_goal,
duration: app.passTimer.getTime(),
script_id: self.view.runningScriptId
});
},
fsm: null,
init: function() {
$('.js_view_box').on('click', '.talk_is_over', function(e) {
e.preventDefault();
self.view.stopScriptAndSaveLog($(this));
});
$('.log').on('click', '.item .unexpected_answer', function(e) {
e.preventDefault();
self.view.appendUnexpectedBoxToLogItem($(this).data('id'));
$(this).hide();
//self.view.stopScriptAndSaveLog($(this));
});
$('.log').on('click', '.item .field__value', function() {
var input = $(this).parents('.js_field').find('.js_script_field');
var me = $(this);
input.show();
input.focus();
me.hide();
input.on('blur', function() {
me.text(input.val());
me.show();
input.hide();
});
});
window.addEventListener('message', function(e) {
var m = e.data;
if (m && m.type === 'history' && $.isArray(m.l) && m.z === self.view.runningScriptId && self.view.fsm instanceof app.Fsm) {
m.l.forEach(function(m) {
if (m && m.type === 'state_changed') {
if (m.r > 0) {
$('.log .item').slice(-m.r).remove();
}
self.view.fsm.to(m.s, { cid: m.c });
} else if (m && m.type === 'field_changed') {
var sf = $('.js_view_box .js_field[data-id=' + m.id + '] .js_script_field').last();
if (m.t === 'checkbox') {
sf.prop('checked', m.v);
} else {
sf.val(m.v)
}
sf.trigger('change');
}
});
}
});
}
},
/*************************************************************************/
scripts: {
processed: false,
doSaveButtonGlimmering: false,
startSaveButtonGlimmering: function() {
if (self.scripts.doSaveButtonGlimmering) return;
self.scripts.doSaveButtonGlimmering = true;
var n = 0,
c = ['btn-success', 'js_scripts_action_save_btn_alarm'];
var fn = function() {
$('.js_scripts_action_save').switchClass(c[n], c[(n + 1) % 2], 1000, function() {
n = (n + 1) % 2;
if (n === 0 && !self.scripts.doSaveButtonGlimmering) return;
fn();
});
};
fn();
},
stopSaveButtonGlimmering: function() {
self.scripts.doSaveButtonGlimmering = false;
},
init: function() {
var boxel = $('.js_editor');
if (!boxel.size()) return;
am.on('add script start', function(e, callbackToPassScriptDataTo) {
if (!jsp) self.constructor.init();
self.constructor.reset(jsp);
if (typeof callbackToPassScriptDataTo === 'function') {
callbackToPassScriptDataTo(self.constructor.save(jsp));
}
}).on('add script done', function(e, res) {
$('.js_editor').data('id', res.id);
self.scripts.initScriptsList(res.scripts);
$('.js_scripts_list_box .js_show_script[data-id=' + res.id + ']').click();
});
$('.js_new_script').click(function(e) {
e.preventDefault();
$('.js_scripts_edit_box').show();
app.get('libAddScript').done(function(l) { l.showPopup() });
});
$('.js_rename_script').click(function(e) {
e.preventDefault();
$('#scriptsRenameFormError').val($('.js_selected_script_name').text());
$.fancybox.open($('.js_scripts_rename_script'));
});
$('.js_scripts_rename_script form').submit(function(e) {
e.preventDefault();
var name = $('#scriptsRenameFormError').val();
var scriptID = $('.js_editor').data('id');
if (self.busy) return;
self.busy = true;
$.fancybox.showLoading();
am.promiseCmd({
method: 'scripts.rename',
id: scriptID,
name: name
}).always(function() {
self.busy = false;
$.fancybox.hideLoading();
}).done(function(res) {
$('.js_selected_script_name').text(name);
$.fancybox.close();
}).fail(function(err) {
console.log(err);
});
});
$('.js_scripts_action_delete').click(function(e) {
e.preventDefault();
app.get('all').done(function(all) {
all.confirm.show('Вы действительно хотите удалить скрипт?', function() {
if (self.busy) return;
self.busy = true;
var boxel = $('.js_editor');
if (!boxel.size()) return;
$.fancybox.showLoading();
am.promiseCmd({
method: 'script.delete',
id: boxel.data('id')
}).always(function() {
self.busy = false;
$.fancybox.hideLoading();
}).done(function(res) {
am.cUrl.removeAnchorParam('s');
if (!res.scripts.length && self.isHs()) window.location.href = '/add_script';
self.scripts.initScriptsList(res.scripts);
self.constructor.reset(jsp);
boxel.find('.js_scripts_edit_box').hide();
$('.js_box').hide();
$.fancybox.close();
if (self.isHs()) {
$('.js_scripts_list .js_show_script').first().click();
}
}).fail(function(err) {});
});
});
});
$('.js_scripts_action_save').click(function(e) {
e.preventDefault();
var boxel = $('.js_editor');
if (!boxel.length) return;
if (busy) return;
busy = true;
am.trigger('constructor save started');
$('.js_show_constructor').trigger('click');
$.fancybox.showLoading();
am.promiseCmd({
method: 'scripts.update',
id: boxel.data('id'),
data: self.constructor.save(jsp)
}).always(function() {
busy = false;
$.fancybox.hideLoading();
}).done(function(res) {
boxel.data('id', res.id);
$.fancybox.close();
am.trigger('constructor has no changes');
am.trigger('constructor save finished');
}).fail(function(err) {
console.log(err);
});
});
$('.js_scripts_action_view').click(function(e) {
e.preventDefault();
$('.js_settings_box').hide();
var boxel = $('.js_editor');
if (boxel.length !== 1) return;
var sebel = $('.js_scripts_edit_box');
if (sebel.length < 1) return;
self.view.openAndLaunchScript(boxel.data('id'), boxel.data('ver'), boxel.data('name'), self.constructor.save(jsp));
$('.js_box').hide();
$('.js_view_box').show();
am.trigger('tab selected', ['js_view_box']);
});
self.scripts.initShowScriptButtons();
self.scripts.initTabs();
(function() {
var currentScript = am.cUrl.getAnchorParam('s');
if (currentScript) {
$('.js_scripts_list .js_show_script[data-id=' + currentScript + ']').click();
} else {
if (self.isHs()) {
var mcs = /(?:^|;|\s)crnscrd=(\d+)(?:;|$)/.exec(document.cookie);
if (mcs) {
$('.js_scripts_list .js_show_script[data-id=' + mcs[1] + ']').click();
} else {
$('.js_scripts_list .js_show_script').first().click();
}
}
}
})();
(function() {
var statJsp = null;
var statDesk = $('.js_stat_desk');
var statBox = $('.js_stats_box');
var busy = false;
var vss = $('.version_stats_sel').on('change', function() {
$('.js_show_conversion').trigger('click', [vss.val()]);
});
$('.js_show_conversion').click(function(e, maybeVer) {
e.preventDefault();
if (busy) return;
var id = am.naturalize($('.js_scripts_list .js_show_script.active').data('id'));
if (id < 1) return;
var ver = undefined;
if (am.naturalize(maybeVer) > 0) ver = am.naturalize(maybeVer);
busy = true;
if (statJsp instanceof jsPlumbInstance) {
statJsp.reset();
}
statJsp = jsPlumb.getInstance({
Endpoint: ['Dot', { radius: 2 }],
HoverPaintStyle: { strokeStyle: '#2b99d2', lineWidth: 2 },
ConnectionOverlays: [
['Arrow', { location: 1, id: 'arrow', length: 10, foldback: 0.5, width: 10 }],
['Label', { label: '-', location: 0.5, id: 'label', cssClass: 'condition' }]
],
Container: statDesk
});
self.constructor.unload(statJsp);
$.fancybox.showLoading();
vss.prop('disabled', true);
statDesk.find('.js_stats_notice').remove();
am.promiseCmd({
method: 'script.get_stats',
id: id,
ver: ver
}).always(function() {
busy = false;
$.fancybox.hideLoading();
}).done(function(res) {
$('.js_editor .js_conversion_count').text(am.naturalize(res.script_stats.conversion));
$('.js_editor .js_passages_count').text(res.script_stats.runs_count);
self.constructor.addStepOpts.disableAll();
self.constructor.load(statJsp, res.node_stats, true);
self.constructor.addStepOpts.enableAll();
vss.empty();
$.each(res.versions, function(i, o) {
vss.append('');
});
if (res.versions.length > 1) {
vss.val(res.ver).prop('disabled', false);
}
var runsCount = am.naturalize(res.ver_stats.runs_count);
$.each(['runs_count', 'runs_with_unexpected_answer_count', 'runs_forcefully_interrupted_count',
'runs_achieved_goal_count'
], function(i, o) {
var cnt = am.naturalize(res.ver_stats[o]);
var per = runsCount > 0 ? am.naturalize(Math.round(cnt / runsCount * 100)) : 0;
statBox.find('.stat_' + o).find('.count').text(cnt).end().find('.percent').text(per);
});
var workerList = statBox.find('.worker_list').empty();
$.each(res.worker_stats, function(i, o) {
workerList.append([
'' + o.name,
' = ' + am.naturalize(o.runs_achieved_goal_count),
'/' + am.naturalize(o.runs_count) + ' звонков ',
' (' + am.naturalize(Math.round(o.conversion)) + '%)',
'
'
].join(''));
});
if (typeof res.notice === 'string') {
statDesk.append('' + res.notice + '
');
}
});
});
})();
$('.js_menu').click(function() {
var c = $(this);
$('.js_menu').not(c).removeClass('active');
c.addClass('active');
});
am.on('constructor load done', function() {
am.trigger('constructor has no changes');
}).on('constructor has no changes', function() {
$('.js_scripts_action_save').hide();
self.scripts.stopSaveButtonGlimmering();
}).on('constructor step moved', function() {
am.trigger('constructor has changes');
}).on('constructor condition removed', function() {
am.trigger('constructor has changes');
}).on('constructor condition added', function() {
am.trigger('constructor has changes');
}).on('constructor step removed', function() {
am.trigger('constructor has changes');
}).on('constructor step added', function() {
am.trigger('constructor has changes');
}).on('constructor step is_goal changed', function() {
am.trigger('constructor has changes');
}).on('constructor step title changed', function() {
am.trigger('constructor has changes');
}).on('constructor step text changed', function() {
am.trigger('constructor has changes');
}).on('constructor condition text changed', function() {
am.trigger('constructor has changes');
}).on('constructor has changes', function() {
if ($.inArray(self.role, ['ROLE_SCRIPT_WRITER', 'ROLE_ADMIN']) >= 0) {
$('.js_scripts_action_save').show();
self.scripts.startSaveButtonGlimmering();
}
});
},
initShowScriptButtons: function() {
var boxel = $('.js_editor');
if (!boxel.size()) return;
var sclbel = $('.js_scripts_list_box');
sclbel.find('.js_show_script').click(function(e) {
e.preventDefault();
if (self.scripts.processed) return;
self.scripts.processed = true;
sclbel.find('.js_show_script').removeClass('active');
$(this).addClass('active');
$.fancybox.showLoading();
am.promiseCmd({
method: 'scripts.load',
id: $(this).data('id')
}).always(function() {
$.fancybox.hideLoading();
self.scripts.processed = false;
}).done(function(res) {
self.role = res.role;
$('.js_show_constructor').trigger('click');
boxel.data('id', res.id);
boxel.data('ver', res.ver);
boxel.data('name', res.name);
am.cUrl.setAnchorParam('s', res.id);
//am.cUrl.setAnchorParam('v', res.ver);
var sebel = $('.js_scripts_edit_box');
sebel.find('.js_name').add('.js_selected_script_name').text(res.name);
sebel.find('.js_conversion_count').text(res.conversion_count);
sebel.find('.js_operators_count').text(res.operators_count);
sebel.find('.js_passages_count').text(res.passages_count);
sebel.find('.js_user_access_count').text(res.user_access_count);
sebel.show();
if (!jsp) self.constructor.init();
self.constructor.load(jsp, res.data);
self.scripts.initRights();
if (res.role === 'ROLE_SCRIPT_READER') {
$('.js_scripts_action_view').click();
}
var expires = new Date(new Date().getTime() + 3600 * 24 * 1000).toUTCString();
document.cookie = 'crnscrd=' + res.id + '; Expires=' + expires + '; Path=/';
am.trigger('constructor load done');
});
});
},
initRights: function() {
if (self.role !== 'ROLE_SCRIPT_WRITER' && self.role !== 'ROLE_ADMIN') {
$('.js_show_constructor, .js_show_conversion, .js_show_access, .js_scripts_action_view, .js_show_integration').hide();
$('.js_scripts_action_save, .js_scripts_action_delete').hide();
$('.js_constructor_box').hide();
$('.js_view_box').show();
$('.sales-infos .sales-info').hide();
} else {
$('.js_show_constructor, .js_show_conversion, .js_show_access, .js_scripts_action_view, .js_show_integration').show();
$('.js_scripts_action_save, .js_scripts_action_delete').show();
$('.js_constructor_box').show();
$('.js_view_box').hide();
$('.sales-infos .sales-info').show();
// app.get('access').done(function(access){
// access.loadAccessUsers();
// });
}
},
initScriptsList: function(scripts) {
var con = $('.js_scripts_list');
if (self.isHs()) {
con.find('.js_show_script').remove();
$.each(scripts, function(i, o) {
con.append([
'',
' ' + o.name + '',
''
].join('\n'));
});
} else {
con.empty();
for (var i in scripts) {
var r = scripts[i];
var icon = null;
if (r.icon == 'OWNER') {
icon = 'user';
} else if (r.icon == 'READER') {
icon = 'eye-open';
} else if (r.icon == 'READER') {
icon = 'pencil';
}
con.append(
'' +
' ' +
r.name +
'');
}
}
self.scripts.initShowScriptButtons();
},
initTabs: function() {
var sebel = $('.js_scripts_edit_box');
if (!sebel.size()) return;
sebel.find('.js_show_box').click(function(e) {
e.preventDefault();
$('.js_settings_box').hide();
var box = $(this).data('box');
$('.js_box').hide();
$('.' + box).show();
am.trigger('tab selected', [box]);
});
}
},
init: function() {
self.scripts.init();
self.view.init();
app.get('keyCall').done(function(keyCall) {
keyCall.add({
map: function() {
if ($('.map_canvas').length > 0) {
$('.map_canvas').remove();
} else {
self.constructor.showCircleMap(70);
}
},
'try': function() {
self.constructor.doShowTryPattern = !self.constructor.doShowTryPattern;
}
});
});
}
};
})();