browse.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. $(document).ready(function()
  2. {
  3. window.minField.integerDigits = parseInt(window.minField.integerDigits);
  4. window.maxField.integerDigits = parseInt(window.maxField.integerDigits);
  5. window.minField.decimalDigits = parseInt(window.minField.decimalDigits);
  6. window.maxField.decimalDigits = parseInt(window.maxField.decimalDigits);
  7. $('#fieldList').on('sort.sortable', function(e, data)
  8. {
  9. $.post(createLink('workflowfield', 'sort'), data.orders, function(response)
  10. {
  11. if(response.result == 'success')
  12. {
  13. return location.reload();
  14. }
  15. else
  16. {
  17. bootbox.alert(response.message);
  18. }
  19. }, 'json');
  20. });
  21. $(document).off('click', '.deleteField');
  22. $('.deleteField').click(function()
  23. {
  24. let $deleter = $(this);
  25. let confirmDeleteLang = defaultConfirmDelete;
  26. if(quotedFields.includes($deleter.data('field'))) confirmDeleteLang = confirmDeleteHasQuote;
  27. if($deleter.data('role') == 'quote') confirmDeleteLang = confirmDeleteInQuote;
  28. if(confirm(confirmDeleteLang))
  29. {
  30. $.getJSON($deleter.attr('href'), function(response)
  31. {
  32. if(response.result == 'success') return location.reload();
  33. return bootbox.alert({message:response.message, size: "small"});
  34. });
  35. }
  36. return false;
  37. });
  38. /* Toggle options. */
  39. $(document).on('change', '#control', function()
  40. {
  41. var control = $(this).val();
  42. $('#default, #rules, #type, #optionType, #sql, #optionsDIV, .dataTip, .set-expression').parents('tr').toggle(control != 'file');
  43. var isHiddenPlaceholder = hiddenPlaceholder != undefined ? !hiddenPlaceholder.includes(control) : false;
  44. $('.tipInfoBox').toggle(isHiddenPlaceholder);
  45. if(control == 'file') return false;
  46. var type = window.defaultField.type;
  47. var optionClass = window.defaultField.optionClass;
  48. var length = $('#length').val();
  49. var integerDigits = parseInt($('#integerDigits').val());
  50. var decimalDigits = parseInt($('#decimalDigits').val());
  51. var isOptionControl = (control == 'select' || control == 'multi-select' || control == 'radio' || control == 'checkbox');
  52. if(!length) length = window.defaultField.varcharLength;
  53. if(!integerDigits || integerDigits < window.minField.integerDigits || integerDigits > window.maxField.integerDigits) integerDigits = window.defaultField.integerDigits;
  54. if(!decimalDigits || decimalDigits < window.minField.decimalDigits || decimalDigits > window.maxField.decimalDigits) decimalDigits = window.defaultField.decimalDigits;
  55. switch(control)
  56. {
  57. case 'formula' :
  58. case 'decimal' :
  59. type = 'decimal';
  60. optionClass = 'decimal';
  61. length = '';
  62. break;
  63. case 'integer' :
  64. type = 'int';
  65. optionClass = 'integer';
  66. length = '';
  67. break;
  68. case 'multi-select' :
  69. case 'checkbox' :
  70. case 'textarea' :
  71. case 'richtext' :
  72. type = 'text';
  73. optionClass = 'text';
  74. length = '';
  75. break;
  76. case 'date' :
  77. type = 'date';
  78. optionClass = 'date';
  79. length = '';
  80. break;
  81. case 'datetime' :
  82. type = 'datetime';
  83. optionClass = 'time';
  84. length = '';
  85. break;
  86. }
  87. $('#length').val(length);
  88. $('#integerDigits').val(integerDigits);
  89. $('#decimalDigits').val(decimalDigits);
  90. $('#type option').show().not('.' + optionClass).hide();
  91. $('#type').val(type).change();
  92. $('.set-expression').parents('tr').toggle(control == 'formula');
  93. $('#optionType').change().parents('tr').toggle(isOptionControl);
  94. });
  95. $(document).on('change', '#type', function()
  96. {
  97. var type = $(this).val();
  98. if(type == 'char') $('#length').attr({'placeholder' : window.placeholder.charLength, 'title' : window.placeholder.charLength, 'max' : window.maxField.charLength});
  99. if(type == 'varchar') $('#length').attr({'placeholder' : window.placeholder.varcharLength, 'title' : window.placeholder.varcharLength, 'max' : window.maxField.varcharLength});
  100. $('.length').toggle(type == 'char' || type == 'varchar');
  101. $('.digits').toggle(type == 'decimal');
  102. $('#default').parents('tr').toggle(type != 'text');
  103. setDataTip();
  104. setDefaultControl();
  105. });
  106. $(document).on('change', '#length, #integerDigits, #decimalDigits', function()
  107. {
  108. setDataTip();
  109. setDefaultControl();
  110. });
  111. $(document).on('change', '#optionType', function()
  112. {
  113. var control = $('#control').val();
  114. var isOptionControl = (control == 'select' || control == 'multi-select' || control == 'radio' || control == 'checkbox');
  115. $('#optionTR').toggle(isOptionControl && $(this).val() == 'custom');
  116. $('#optionTR .input-group').fixInputGroup();
  117. $('.sqlTR').toggle(isOptionControl && $(this).val() == 'sql');
  118. $('#varsTR').toggle(isOptionControl && $(this).val() == 'sql' && $.trim($('#varsTD').html()) != '');
  119. $('#optionsDIVLabel, #sqlLabel').remove();
  120. $('#sql').css({'border-color' : '', 'margin-bottom' : 0});
  121. setDefaultControl();
  122. });
  123. $(document).on('change', 'input[name^=options], #sql', function()
  124. {
  125. setDefaultControl();
  126. });
  127. /* Add a option. */
  128. $(document).on('click', '.addItem', function()
  129. {
  130. var $parent = $(this).parents('.input-group');
  131. $parent.after($parent.prop('outerHTML').replace('checked="checked"', ''));
  132. $parent.next().find('input[type=text]').val('');
  133. });
  134. /* Delete a option. */
  135. $(document).on('click', '.delItem', function()
  136. {
  137. if($('#optionTR .subStatusTd').length > 0)
  138. {
  139. var $sortTd = $(this).closest('.sortTd');
  140. var rowCount = $sortTd.find('.input-group').length;
  141. if(rowCount == 2) $sortTd.find('.sort-btn').addClass('hidden');
  142. }
  143. if($(this).closest('td').find('div.input-group').size() == 1)
  144. {
  145. $(this).parents('.input-group').find('input').val('');
  146. }
  147. else
  148. {
  149. $(this).parents('.input-group').remove();
  150. }
  151. });
  152. $(document).on('change', '[name^=optionCode]', function()
  153. {
  154. $(this).parent('.input-group').find('[name^=optionDefault]').val($(this).val());
  155. });
  156. $(document).on('click', '[name=requestType]', function()
  157. {
  158. $('#selectList').toggle($(this).val() == 'select' || $(this).val() == 'multi-select');
  159. });
  160. $(document).on('click', '.delSqlVar', function()
  161. {
  162. $('#sql').val($('#sql').val().replace("'$" + $(this).parents('.varControl').attr('id') + "'", ''));
  163. $(this).parents('.varControl').remove();
  164. fixVarControls();
  165. });
  166. $(document).on('click', '.btn-expression', function()
  167. {
  168. var text = $(this).html();
  169. var data = $(this).data();
  170. var type = $(this).data('type');
  171. $('#expressionDIV .expression').append("<span class='item-expression item-" + type + "'>" + text + "</span>");
  172. window.expression.push(data);
  173. removeErrorLabel();
  174. });
  175. $(document).on('click', '.clear-last', function()
  176. {
  177. $('#expressionDIV .expression .item-expression:last').remove();
  178. window.expression.pop();
  179. removeErrorLabel();
  180. });
  181. $(document).on('click', '.clear-all', function()
  182. {
  183. $('#expressionDIV .expression .item-expression').remove();
  184. window.expression.length = 0;
  185. removeErrorLabel();
  186. });
  187. $(document).on('click', '.save-expression', function()
  188. {
  189. var hasError = checkExpression();
  190. if(!hasError)
  191. {
  192. $('#fieldTable .expression').html($('#expressionDIV .expression').html());
  193. $('#fieldTable #expression').val(JSON.stringify(window.expression));
  194. $('#expressionDIV').hide();
  195. $('#fieldTable').show();
  196. }
  197. });
  198. $(document).on('click', '.cancel-expression', function()
  199. {
  200. removeErrorLabel();
  201. $('#expressionDIV').hide();
  202. $('#fieldTable').show();
  203. });
  204. $(document).on('click', '.set-expression', function()
  205. {
  206. initExpression();
  207. $('#expressionLabel').remove();
  208. $('#expressionDIV').show();
  209. $('#fieldTable').hide();
  210. });
  211. $panelHeadingHeight = $('.panel-heading').outerHeight(true);
  212. $panelMarginBottom = $('.panel').css('margin-bottom').replace('px', '');
  213. $editorNavHeight = $('#editorNav').outerHeight(true);
  214. $editorMenuHeight = $('#editorMenu').outerHeight();
  215. $spaceHeight = $('.space.space-sm').outerHeight(true);
  216. $maxHeight = $(window).height() - $panelHeadingHeight - $panelMarginBottom - $editorNavHeight - $editorMenuHeight - $spaceHeight;
  217. $('.panel-body').css('max-height', $maxHeight + 'px');
  218. });
  219. function setDataTip()
  220. {
  221. var type = $('#type').val();
  222. var $dataTip = $('.dataTip');
  223. switch(type)
  224. {
  225. case 'tinyint' :
  226. case 'smallint' :
  227. case 'mediumint' :
  228. case 'int' :
  229. var max = window.maxField[type];
  230. var min = window.minField[type];
  231. $dataTip.html(window.tips.number.replace(/MAX/, max).replace(/MIN/, min)).parents('tr').show();
  232. break;
  233. case 'decimal' :
  234. var integerDigits = $('#integerDigits').val();
  235. integerDigits = integerDigits ? parseInt(integerDigits) : 0;
  236. integerDigits = integerDigits > window.maxField.integerDigits ? window.maxField.integerDigits : integerDigits;
  237. integerDigits = integerDigits < window.minField.integerDigits ? window.defaultField.integerDigits : integerDigits;
  238. integerDigits = parseInt(integerDigits);
  239. var decimalDigits = $('#decimalDigits').val();
  240. decimalDigits = decimalDigits ? parseInt(decimalDigits) : 0;
  241. decimalDigits = decimalDigits > window.maxField.decimalDigits ? window.maxField.decimalDigits : decimalDigits;
  242. decimalDigits = decimalDigits < window.minField.integerDigits ? window.defaultField.decimalDigits : decimalDigits;
  243. decimalDigits = parseInt(decimalDigits);
  244. var max = '.'.padStart(integerDigits + 1, 9).padEnd(integerDigits + decimalDigits + 1, 9);
  245. var min = '-' + max;
  246. $dataTip.html(window.tips.number.replace(/MAX/, max).replace(/MIN/, min)).parents('tr').show();
  247. break;
  248. case 'char' :
  249. var length = $('#length').val();
  250. length = length ? parseInt(length) : 0;
  251. length = length > window.maxField.charLength ? window.maxField.charLength : length;
  252. length = length < window.minField.charLength ? window.defaultField.charLength : length;
  253. $dataTip.html(window.tips.string.replace(/LENGTH/, length)).parents('tr').show();
  254. break;
  255. case 'varchar' :
  256. var length = $('#length').val();
  257. length = length ? parseInt(length) : 0;
  258. length = length > window.maxField.varcharLength ? window.maxField.varcharLength : length;
  259. length = length < window.minField.varcharLength ? window.defaultField.varcharLength : length;
  260. $dataTip.html(window.tips.string.replace(/LENGTH/, length)).parents('tr').show();
  261. break;
  262. default :
  263. $('#length').val('');
  264. $('#integerDigits').val('');
  265. $('#decimalDigits').val('');
  266. $dataTip.html('').parents('tr').hide();
  267. }
  268. }
  269. function setDefaultControl()
  270. {
  271. var control = $('#control').val();
  272. var type = $('#type').val();
  273. var optionType = $('#optionType').val();
  274. var defaultValue = $('#default').val();
  275. if(control == 'input' || control == 'textarea' || control == 'multi-select' || control == 'checkbox' || control == 'richtext' || control == 'file')
  276. {
  277. $('#default').parent().html("<input type='text' name='default' value='" + defaultValue + "' id='default' class='form-control' autocomplete='off'>");
  278. return false;
  279. }
  280. if(control == 'date')
  281. {
  282. var dateOptions =
  283. {
  284. language: config.clientLang,
  285. weekStart: 1,
  286. todayBtn: 1,
  287. autoclose: 1,
  288. todayHighlight: 1,
  289. startView: 2,
  290. minView: 2,
  291. forceParse: 0,
  292. format: 'yyyy-mm-dd'
  293. };
  294. $('#default').parent().html("<input type='text' name='default' value='" + defaultValue + "' id='default' class='form-control form-date' autocomplete='off'>");
  295. $('#default').datetimepicker(dateOptions);
  296. return false;
  297. }
  298. if(control == 'datetime')
  299. {
  300. var datetimeOptions =
  301. {
  302. language: config.clientLang,
  303. weekStart: 1,
  304. todayBtn: 1,
  305. autoclose: 1,
  306. todayHighlight: 1,
  307. startView: 2,
  308. forceParse: 0,
  309. showMeridian: 1,
  310. format: 'yyyy-mm-dd hh:ii'
  311. };
  312. $('#default').parent().html("<input type='text' name='default' value='" + defaultValue + "' id='default' class='form-control form-datetime' autocomplete='off'>");
  313. $('#default').datetimepicker(datetimeOptions);
  314. return false;
  315. }
  316. if(control == 'integer')
  317. {
  318. var type = $('#type').val();
  319. var max = window.maxField[type];
  320. var min = window.minField[type];
  321. $('#default').parent().html("<input type='number' name='default' value='" + defaultValue + "' id='default' max='" + max + "' min='" + min + "' step='1' class='form-control' autocomplete='off'>");
  322. return false;
  323. }
  324. if(control == 'decimal' || control == 'formula')
  325. {
  326. var integerDigits = $('#integerDigits').val();
  327. integerDigits = integerDigits ? parseInt(integerDigits) : 0;
  328. integerDigits = integerDigits > window.maxField.integerDigits ? window.maxField.integerDigits : integerDigits;
  329. integerDigits = integerDigits < window.minField.integerDigits ? window.defaultField.integerDigits : integerDigits;
  330. integerDigits = parseInt(integerDigits);
  331. var decimalDigits = $('#decimalDigits').val();
  332. decimalDigits = decimalDigits ? parseInt(decimalDigits) : 0;
  333. decimalDigits = decimalDigits > window.maxField.decimalDigits ? window.maxField.decimalDigits : decimalDigits;
  334. decimalDigits = decimalDigits < window.minField.integerDigits ? window.defaultField.decimalDigits : decimalDigits;
  335. decimalDigits = parseInt(decimalDigits);
  336. var max = '.'.padStart(integerDigits + 1, 9).padEnd(integerDigits + decimalDigits + 1, 9);
  337. var min = '-' + max;
  338. var step = '0.'.padEnd(decimalDigits + 1, 0) + 1;
  339. $('#default').parent().html("<input type='number' name='default' value='" + defaultValue + "' id='default' max='" + max + "' min='" + min + "' step='" + step + "' class='form-control' autocomplete='off'>");
  340. return false;
  341. }
  342. if(!optionType || optionType == 'category' || optionType == 'prevModule')
  343. {
  344. $('#default').parent().html("<input type='text' name='default' value='" + defaultValue + "' id='default' class='form-control' autocomplete='off'>");
  345. return false;
  346. }
  347. if(typeof defaultValue === 'string') defaultValue = defaultValue.split(',');
  348. if(optionType == 'custom')
  349. {
  350. var name = (control == 'multi-select' || control == 'checkbox') ? 'default[]' : 'default';
  351. var multiple = (control == 'multi-select' || control == 'checkbox') ? 'multiple' : '';
  352. $('#default').parent().html("<select name='" + name + "' id='default' class='form-control'" + multiple + '>');
  353. $('#default').append("<option></option>");
  354. $('input[id^=options][id*=code]').each(function(index, code)
  355. {
  356. var code = $(this).val();
  357. var name = $(this).closest('.input-group').find('input[id^=options][id*=name]').val();
  358. $('#default').append("<option value='" + code + "'>" + name + '</option>');
  359. });
  360. $('#default').val(defaultValue).chosen();
  361. }
  362. else
  363. {
  364. var type = $('#type').val();
  365. var sql = $('#sql').val();
  366. control = window.btoa(encodeURI(control));
  367. sql = window.btoa(encodeURI(sql));
  368. value = window.btoa(encodeURI(defaultValue));
  369. var link = createLink('workflowfield', 'ajaxGetDefaultControl', 'mode=advanced&control=' + control + '&optionType=' + optionType + '&type=' + type + '&sql=&sqlVar=&elementName=&default=' + value);
  370. $.post(link, {sql: sql}, function(data)
  371. {
  372. $('#default').parent().html(data);
  373. initDefault($('#default'), control, optionType, type, sql);
  374. })
  375. }
  376. return false;
  377. }
  378. function initDefault($selector, control, optionType, type, sql)
  379. {
  380. if($selector.find('option[value=ajax_search_more]').length == 1)
  381. {
  382. $selector.find('option[value=ajax_search_more]').remove();
  383. var url = createLink('workflowfield', 'ajaxGetMoreDefault', 'mode=advanced&control=' + control + '&optionType=' + optionType + '&type=' + type + '&sql=' + sql + '&sqlVars=&search={search}');
  384. initPicker($selector, {remote: url});
  385. }
  386. else
  387. {
  388. $selector.chosen();
  389. }
  390. }
  391. function fixVarControls()
  392. {
  393. var varControls = $('#varsTD .varControl');
  394. if(varControls.size() == 0) $('#varsTR').hide();
  395. for(i = 0; i < varControls.size(); i++)
  396. {
  397. if(i % 2 == 0)
  398. {
  399. $(varControls[i]).removeClass('pull-left pull-right').addClass('pull-left');
  400. }
  401. else
  402. {
  403. $(varControls[i]).removeClass('pull-left pull-right').addClass('pull-right');
  404. }
  405. if(i > 1)
  406. {
  407. $(varControls[i]).css('padding-top', '5px');
  408. }
  409. else
  410. {
  411. $(varControls[i]).css('padding', '0');
  412. }
  413. }
  414. }
  415. function initExpression()
  416. {
  417. let name = $('#name').val() == '' ? window.formulaLang.common : $('#name').val();
  418. let $expression = $('#expressionDIV .expression');
  419. $expression.find('.item-name').html(name);
  420. $expression.find('.item-expression').remove();
  421. if($('#expression').val())
  422. {
  423. window.expression = JSON.parse($('#expression').val());
  424. appendExpression(window.expression, $expression);
  425. }
  426. else
  427. {
  428. window.expression.length = 0;
  429. }
  430. }
  431. function appendExpression(expression, $selector)
  432. {
  433. for(var i in expression)
  434. {
  435. let current = expression[i];
  436. let text = current.text;
  437. if(current.type == 'target')
  438. {
  439. if(current.function)
  440. {
  441. text = window.formulaLang.functions[current.function].replace('%s', window.modules[current.module]).replace('%s', window.moduleFields[current.module][current.field]);
  442. }
  443. else
  444. {
  445. text = window.modules[current.module] + '_' + window.moduleFields[current.module][current.field];
  446. }
  447. }
  448. $selector.append("<span class='item-expression item-" + current.type + "'>" + text + "</span>");
  449. }
  450. }
  451. function checkExpression()
  452. {
  453. if(window.expression.length == 0)
  454. {
  455. appendErrorLabel(window.formulaLang.error.empty);
  456. return true;
  457. }
  458. else
  459. {
  460. let fakeExpression = [];
  461. for(var i in window.expression)
  462. {
  463. let current = window.expression[i];
  464. if(current.type == 'target') fakeExpression.push(current.field);
  465. if(current.type == 'operator') fakeExpression.push(current.operator);
  466. if(current.type == 'number') fakeExpression.push(current.value);
  467. }
  468. fakeExpression = fakeExpression.join('');
  469. try
  470. {
  471. math.parse(fakeExpression);
  472. }
  473. catch(error)
  474. {
  475. appendErrorLabel(window.formulaLang.error.error);
  476. return true;
  477. }
  478. let error = false;
  479. let length = window.expression.length;
  480. for(var i in window.expression)
  481. {
  482. i = parseInt(i);
  483. let current = window.expression[i];
  484. let prev = '';
  485. let next = '';
  486. if(i > 0) prev = window.expression[i - 1];
  487. if(i < length -1) next = window.expression[i + 1];
  488. switch(current.type)
  489. {
  490. case 'target' :
  491. if(prev != '' && (prev.type != 'operator' || prev.operator == ')'))
  492. {
  493. error = true;
  494. break;
  495. }
  496. if(next != '' && (next.type != 'operator' || next.operator == '('))
  497. {
  498. error = true;
  499. break;
  500. }
  501. break;
  502. case 'number' :
  503. if(current.value == '.')
  504. {
  505. if(prev == '' || prev.type != 'number' || prev.value == '.')
  506. {
  507. error = true;
  508. break;
  509. }
  510. if(next == '' || next.type != 'number' || next.value == '.')
  511. {
  512. error = true;
  513. break;
  514. }
  515. }
  516. else
  517. {
  518. if(prev != '' && (prev.type == 'target' || (prev.type == 'operator' && prev.operator == ')')))
  519. {
  520. error = true;
  521. break;
  522. }
  523. if(next != '' && (next.type == 'target' || (next.type == 'operator' && next.operator == '(')))
  524. {
  525. error = true;
  526. break;
  527. }
  528. }
  529. break;
  530. case 'operator' :
  531. switch(current.operator)
  532. {
  533. case '(' :
  534. if(prev != '' && (prev.type != 'operator' || prev.operator == ')'))
  535. {
  536. error = true;
  537. break;
  538. }
  539. if(next == '' || (next.type == 'number' && next.value == '.') || (next.type == 'operator' && next.operator != '('))
  540. {
  541. error = true;
  542. break;
  543. }
  544. break;
  545. case ')' :
  546. if(prev == '' || (prev.type == 'number' && prev.value == '.') || (prev.type == 'operator' && prev.operator != ')'))
  547. {
  548. error = true;
  549. break;
  550. }
  551. if(next != '' && (next.type != 'operator' || next.operator == '('))
  552. {
  553. error = true;
  554. break;
  555. }
  556. break;
  557. default :
  558. if(prev == '' || (prev.type == 'operaor' && prev.operator != ')') || (prev.type == 'number' && prev.value == '.'))
  559. {
  560. error = true;
  561. break;
  562. }
  563. if(next == '' || (next.type == 'operaor' && next.operator != '(') || (next.type == 'number' && next.value == '.'))
  564. {
  565. error = true;
  566. break;
  567. }
  568. }
  569. break;
  570. }
  571. if(error)
  572. {
  573. appendErrorLabel(window.formulaLang.error.error);
  574. return true;
  575. }
  576. }
  577. return false;
  578. }
  579. }
  580. function appendErrorLabel(message)
  581. {
  582. removeErrorLabel();
  583. $('#expressionDIV .expression').css('border-color', '#953B39').after("<span id='expressionLabel' for='expression' class='text-error red'>" + message + '</span>');
  584. $('.fieldForm').parents('.modal-body').scrollTop(0);
  585. }
  586. function removeErrorLabel()
  587. {
  588. $('#expressionDIV .expression').css('border-color', '').next('#expressionLabel').remove();
  589. }