$(document).ready(function() { /* Set action to up when in last actions. */ $(".moreActions").click(function() { var height = $(this).offset().top - $('#actionListTable').offset().top + $(this).parent().parent().height() + $(this).next(".dropdown-menu").height(); var maxHeight = $('#actionListTable').parent().css('max-height').replace("px", ""); if(height > maxHeight) { $(this).next(".dropdown-menu").addClass('dropup'); } }); $(document).on('hide.zui.modal', '#triggerModal.layout-modal', function() { var action = $(this).data('action'); $('#actionList tr[data-action=' + action + '] .select-action' ).click(); }); $('#actionList').on('sort.sortable', function(e, data) { $.post(createLink('workflowaction', 'sort'), data.orders, function(response) { if(response.result == 'success') { return location.reload(); } else { bootbox.alert(response.message); } }, 'json'); }); $('#actionList .select-action').click(function() { $('#actionList tr.checked').removeClass('checked row-check-begin row-check-end'); var $tr = $(this).parents('tr').addClass('checked row-check-begin row-check-end'); var data = $tr.data(); $('#previewArea .panel-heading').html('' + data.name + ''); if(data.buildin && data.extensiontype != 'override') { $('.layout-buildin-tip').show(); $('.layout-empty-tip').hide(); $('.layout-no-tip').hide(); $('.layout-preview').hide(); } else if(data.open != 'none') { if(data.virtual) { var nextModule = data.action.substring(0, data.action.lastIndexOf('_')); var nextAction = data.action.substring(data.action.lastIndexOf('_') + 1); var previewLink = createLink('workflowaction', 'ajaxPreview', 'module=' + nextModule + '&action=' + nextAction); } else { var previewLink = createLink('workflowaction', 'ajaxPreview', 'module=' + window.moduleName + '&action=' + data.action); } $('#previewArea .layout-preview').load(previewLink, function(response) { if(!response) { var setLayoutLink = createLink('workflowlayout', 'admin', 'module=' + window.moduleName + '&action=' + data.action); var setLayoutButton = "" + window.setLayout + ''; $('.layout-buildin-tip').hide(); $('.layout-empty-tip').find('.setLayout').remove(); $('.layout-empty-tip').append(setLayoutButton).show(); $('.layout-no-tip').hide(); $('.layout-preview').hide(); return false; } $('.preview-content .chosen').chosen(); $('.example-text-holder').each(function() { $(this).attr('data-size', Math.floor(Math.random() * 8) + 2); }); $('.btn-group').fixInputGroup(); }); $('.layout-buildin-tip').hide(); $('.layout-empty-tip').hide(); $('.layout-no-tip').hide(); $('.layout-preview').show(); } else { $('.layout-buildin-tip').hide(); $('.layout-empty-tip').hide(); $('.layout-no-tip').show(); $('.layout-preview').hide(); } }); $('#actionList .select-action:first').click(); /* Action */ $(document).on('change', '#actionTable #type', function() { $('#batchMode').parents('tr').toggle($(this).val() == 'batch'); $('#position, #show').parents('tr').toggle($(this).val() == 'single'); $('#open option[value=modal]').toggle($(this).val() == 'single'); if($(this).val() == 'batch' && $('#open').val() == 'modal') { $('#open').val('normal'); } }); /* Condition */ $(document).on('change', '#conditionTable #conditionType', function() { $('.sqlTR').toggle($(this).val() == 'sql'); $('.dataTR').toggle($(this).val() == 'data'); }); $(document).on('click', '#conditionTable .addCondition', function() { $(this).parents('tr').after(window.itemRow.replace(/KEY/g, window.conditionKey)); $(this).parents('tr').next().find('[name*=field]').chosen(); window.conditionKey++; }); $(document).on('click', '#conditionTable .delCondition', function() { $(this).parents('tr').remove(); }); $(document).on('change', '#conditionTable [name*=field]', function() { var $tr = $(this).parents('tr'); var key = $tr.data('key'); var name = window.btoa(encodeURI('param[' + key + ']')); var link = createLink('workflowfield', 'ajaxGetFieldControl', 'module=' + window.moduleName + '&field=' + $(this).val() + '&value=&elementName=' + name); $tr.find('#paramTD').load(link, function() { $tr.find('select.chosen').chosen(); $tr.find('.form-date').datetimepicker(dateOptions); $tr.find('.form-datetime').datetimepicker(datetimeOptions); initSelect($tr.find('#paramTD .picker-select')); }); }); /* Linkage */ $(document).on('change', '#linkageTable [name^=source]', function() { processField(); var $tr = $(this).parents('tr'); var $td = $tr.find('td.value'); var field = $(this).find('option:selected').val(); var $value = $(this).parents('tr').find('[name^=value]'); var value = $value.val(); var name = $value.attr('name'); var id = $value.attr('id'); value = window.btoa(encodeURI(value)); name = window.btoa(encodeURI(name)); $td.load(createLink('workflowfield', 'ajaxGetFieldControl', 'module=' + window.moduleName + '&field=' + field + '&value=' + value + '&elementName=' + name + '&elementID=' + id), function() { $td.find('select.chosen').chosen(); $tr.find('.form-date').datetimepicker(dateOptions); $tr.find('.form-datetime').datetimepicker(datetimeOptions); initSelect($td.find('.picker-select')); }); }); $(document).on('click', '#linkageTable .addTarget', function() { var $rowspan = parseInt($('th.target').attr('rowspan')); $rowspan++; $('th.target').attr('rowspan', $rowspan); $(this).parents('tr').after(window.targetRow.replace(/KEY/g, window.targetIndex)); $(this).parents('tr').next().find('.chosen').chosen(); window.targetIndex++; processField(); }) $(document).on('click', '#linkageTable .delTarget', function() { if($('.delTarget').length == 1) { $(this).parents('tr').find('input,select').val(''); $(this).parents('tr').find('.chosen').trigger('chosen:updated'); return false; } var rowspan = parseInt($('th.target').attr('rowspan')); rowspan--; if($(this).parents('tr').find('th').length) { $(this).parents('tr').next().prepend(window.th.replace(/ROWSPAN/g, rowspan)); } else { $('th.target').attr('rowspan', rowspan); } $(this).parents('tr').remove(); processField(); }) $(document).on('change', '#linkageTable [name^=target]', function() { processField(); }); $(document).on('change', '#linkageTable [name^=source], #linkageTable [name^=operator], #linkageTable [name^=value]', function() { $('#sourceLabel').remove(); }); $(document).on('change', '#linkageTable [name^=target], #linkageTable [name^=status]', function() { $('#targetLabel').remove(); }); /* Verification */ $(document).on('change', '#verificationTable [name*=\\[field\\]], #verificationTable [name*=paramType]', function() { var $tr = $(this).closest('tr'); var $td = $tr.find('.paramTD'); var $paramType = $tr.find('[name*=paramType]'); var module = window.moduleName; var key = $tr.data('key'); var name = 'param[' + key + ']'; if($tr.hasClass('dataTR')) name = 'verifications[param][' + key + ']'; loadParam($tr, $td, $paramType, module, name); }); $(document).on('click', '#verificationTable .addVerification, #verificationTable .addVar', function() { var $tr = $(this).parents('tr'); if($(this).hasClass('addVar')) { $tr.after(window.varRow.replace(/KEY/g, window.verificationVarKey)); window.verificationVarKey++; } else if($(this).hasClass('addVerification')) { $tr.after(window.verificationRow.replace(/KEY/g, window.verificationDataKey)); window.verificationDataKey++; } $tr.next().find('.chosen').chosen(); }); $(document).on('click', '#verificationTable .delVerification, #verificationTable .delVar', function() { if($(this).hasClass('delVar')) { $('#sql').val($('#sql').val().replace("'$" + $(this).parents('tr').find('#varName').val() + "'", '')); if($('.delVar').size() == 1) { $(this).parents('tr').find('input,select').val('').find('.chosen').trigger('chosen:updated'); $(this).parents('tr').find('.chosen-single span').html(''); return; } } $(this).parents('tr').remove(); }); $(document).on('change', '#verificationTable [name*=varName]', function() { if($(this).val() != '') $('#sql').val($('#sql').val() + "'$" + $(this).val() + "'"); }); /* Hook */ $(document).on('change', '.hookForm #conditionType', function() { $('.sqlTR').toggle($(this).val() == 'sql'); $('.dataTR').toggle($(this).val() == 'data'); }); $(document).on('change', '.hookForm #action, .hookForm #table', function() { $('.fieldTR').toggle($('#action').val() != 'delete'); if($('#action').val() == 'insert') { $('.whereTR').hide().find('input,select').attr('disabled', 'disabled'); } else { $('.whereTR').show().find('input,select').removeAttr('disabled'); } if($(this).attr('id') == 'table') { var link = createLink('workflowhook', 'ajaxGetTableFields', 'table=' + $(this).val()); $('.field').load(link, function() { $('.field').trigger('chosen:updated'); }); } loadTarget(); }); $(document).on('click', '.hookForm .toggleCondition', function() { var val = $('#condition').val() == 1 ? 0 : 1; $('#condition').val(val); $('#conditionDIV').toggle(); }); $(document).on('change', '.hookForm [name*=\\[field\\]], .hookForm [name*=paramType]', function() { var $tr = $(this).closest('tr'); var $td = $tr.find('.paramTD'); var $paramType = $tr.find('[name*=paramType]'); var module = $('#table').val(); var key = $tr.data('key'); var name = 'param[' + key + ']'; if($tr.hasClass('dataTR')) module = window.moduleName; if($tr.hasClass('dataTR')) name = 'conditions[param][' + key + ']'; if($tr.hasClass('fieldTR')) name = 'fields[param][' + key + ']'; if($tr.hasClass('whereTR')) name = 'wheres[param][' + key + ']'; loadParam($tr, $td, $paramType, module, name); }); $(document).on('click', '.hookForm .addVar, .hookForm .addCondition, .hookForm .addField, .hookForm .addWhere', function() { var $tr = $(this).parents('tr'); if($(this).hasClass('addVar')) { $tr.after(window.varRow.replace(/KEY/g, window.hookVarKey)); window.hookVarKey++; } else if($(this).hasClass('addCondition')) { $tr.after(window.conditionRow.replace(/KEY/g, window.hookDataKey)); window.hookDataKey++; } else if($(this).hasClass('addField')) { $tr.after(window.fieldRow.replace(/KEY/g, window.hookFieldKey)); window.hookFieldKey++; var link = createLink('workflowhook', 'ajaxGetTableFields', 'table=' + $('#table').val()); $tr.next('tr').find('.field').load(link, function() { $(this).trigger('chosen:updated'); }); } else if($(this).hasClass('addWhere')) { $tr.after(window.whereRow.replace(/KEY/g, window.hookWhereKey)); window.hookWhereKey++; var link = createLink('workflowhook', 'ajaxGetTableFields', 'table=' + $('#table').val()); $tr.next('tr').find('.field').load(link, function() { $(this).trigger('chosen:updated'); }); } $tr.next().find('.chosen').chosen(); $tr.next().find('#param_chosen').hide(); }); $(document).on('click', '.hookForm .delVar, .hookForm .delCondition, .hookForm .delField, .hookForm .delWhere', function() { if($(this).hasClass('delVar')) { $('#sql').val($('#sql').val().replace("'$" + $(this).parents('tr').find('#varName').val() + "'", '')); if($('.delVar').size() == 1) { $(this).parents('tr').find('input,select').val('').find('.chosen').trigger('chosen:updated'); $(this).parents('tr').find('.chosen-single span').html(''); return; } } $(this).parents('tr').remove(); }); $(document).on('change', '.hookForm [name*=varName]', function() { if($(this).val() != '') $('#sql').val($('#sql').val() + "'$" + $(this).val() + "'"); }); $panelHeadingHeight = $('.panel-heading').outerHeight(true); $panelMarginBottom = $('.panel').css('margin-bottom').replace('px', ''); $editorNavHeight = $('#editorNav').outerHeight(true); $editorMenuHeight = $('#editorMenu').outerHeight(); $spaceHeight = $('.space.space-sm').outerHeight(true); $maxHeight = $(window).height() - $panelHeadingHeight - $panelMarginBottom - $editorNavHeight - $editorMenuHeight - $spaceHeight; $('.panel-body').css('max-height', $maxHeight + 'px'); $(document).on('click', '.addBlock', function() { $(this).parents('li').after($('.blockData').html().replace(/blockKey/g, window.blockKey)); window.blockKey++; return false; }); $(document).on('click', '.addTab', function() { if($(this).parents('li').find('ul').length > 0) { $(this).parents('li').find('ul').append($('.tabData').html().replace(/tabKey/g, window.tabKey)); } else { $(this).parents('li').append(""); } window.tabKey++; return false; }); $(document).on('click', '.removeBlock', function() { if($(this).parents('ul').children('li').length > 1) { $(this).parents('li').remove(); } else { $(this).parents('li').find('input').val(''); } }); $(document).on('click', '.removeTab', function() { if($(this).parents('ul.tabList').children('li').length > 1) { $(this).parents('li.tab').remove(); } else { $(this).parents('ul.tabList').remove(); } }); $(document).on('click', '#blockForm .form-actions .btn', function() { $('[name^=key]').each(function(index) {$(this).val(index); }); $('[name^=parent]').each(function(index) { $(this).val($(this).parents('li').find('[name^=key]').val()); }); $('#blockForm').submit(); }); $.setAjaxForm('#blockForm', function(response) { if(response.result == 'success') $.reloadAjaxModal(); }); }); /** * Make sure each field be selected only once. * * @access public * @return void */ function processField() { $('#linkageTable [name^=source]').each(function() { var $this = $(this); var selected = $this.val(); $this.empty().append($('#fieldTemplate').html()); $('#linkageTable [name^=source]').not(this).each(function() { var next = $(this).val(); if(next != 0) $this.find('option[value=' + next + ']').remove(); }); $('#linkageTable [name^=target]').each(function() { var next = $(this).val(); if(next != 0) $this.find('option[value=' + next + ']').remove(); }); $this.val(selected).trigger('chosen:updated'); }); $('#linkageTable [name^=target]').each(function() { var $this = $(this); var selected = $this.val(); $this.empty().append($('#fieldTemplate').html()); $('#linkageTable [name^=target]').not(this).each(function() { var next = $(this).val(); if(next != 0) $this.find('option[value=' + next + ']').remove(); }); $('#linkageTable [name^=source]').each(function() { var next = $(this).val(); if(next != 0) $this.find('option[value=' + next + ']').remove(); }); $this.val(selected).trigger('chosen:updated'); }); } var dateOptions = { language: config.clientLang, weekStart: 1, todayBtn: 1, autoclose: 1, todayHighlight: 1, startView: 2, minView: 2, forceParse: 0, format: 'yyyy-mm-dd' }; var datetimeOptions = { language: config.clientLang, weekStart: 1, todayBtn: 1, autoclose: 1, todayHighlight: 1, startView: 2, forceParse: 0, showMeridian: 1, format: 'yyyy-mm-dd hh:ii' }; function loadParam($tr, $td, $paramType, module, name) { var paramType = $paramType.val(); var value = $td.find('.paramValue').length == 1 ? $td.find('.paramValue').val() : ''; switch(paramType) { case 'today': case 'now': case 'actor': case 'currentDept': case 'deptManager': $td.html(""); break; case 'form': case 'record': var paramFields = paramType + 'Fields'; $td.html(window[paramFields].replace(/NAME/g, name)); $td.find('[name*=param]').val(value); $td.find('.chosen').chosen(); break; case 'formula': var id = name.replace(/\[/g, '').replace(/\]/g, ''); $td.html("" + window.formulaLang.set + ''); break; default: if(paramType == 'custom') { var field = $tr.find('[name*=field]').val(); if(!field) { $td.html(""); } else { var field = $tr.find('[name*=field]').val(); if(!field) return false; name = window.btoa(encodeURI(name)); value = window.btoa(encodeURI(value)); var link = createLink('workflowfield', 'ajaxGetFieldControl', 'module=' + module + '&field=' + field + '&value=' + value + '&elementName=' + name); $td.load(link, function() { $td.find('.chosen').chosen(); $td.find('.form-date').datetimepicker(dateOptions); $td.find('.form-datetime').datetimepicker(datetimeOptions); initSelect($td.find('.picker-select')); }); } } else { name = window.btoa(encodeURI(name)); value = window.btoa(encodeURI(value)); var link = createLink('workflowfield', 'ajaxGetParamOptions', 'paramType=' + paramType + '&value=' + value + '&elementName=' + name); $td.load(link, function() { $td.find('.chosen').chosen(); $td.find('.form-date').datetimepicker(dateOptions); $td.find('.form-datetime').datetimepicker(datetimeOptions); initSelect($td.find('.picker-select')); }); } } } $(function() { $(document).on('click', '.hookForm .btn-expression', function() { var text = $(this).html(); var data = $(this).data(); var type = $(this).data('type'); $('.hookForm #expressionDIV .expression').append("" + text + ""); window.expression.push(data); removeErrorLabel(); }); $(document).on('click', '.hookForm .clear-last', function() { $('.hookForm #expressionDIV .expression .item-expression:last').remove(); window.expression.pop(); removeErrorLabel(); }); $(document).on('click', '.hookForm .clear-all', function() { $('.hookForm #expressionDIV .expression .item-expression').remove(); window.expression.length = 0; removeErrorLabel(); }); $(document).on('click', '.hookForm .save-expression', function() { let hasError = checkExpression(); if(!hasError) { let key = $('.hookForm #expressionDIV').attr('data-key'); $('.hookForm .fieldTR[data-key=' + key + '] .paramTD [name*=param]').val(JSON.stringify(window.expression)); $('.hookForm #expressionDIV').hide(); $('.hookForm #hookDIV').show(); $('.hookForm #conditionDIV').toggle($('#condition').val() == 1); } }); $(document).on('click', '.hookForm .cancel-expression', function() { removeErrorLabel(); $('.hookForm #expressionDIV').hide(); $('.hookForm #hookDIV').show(); $('.hookForm #conditionDIV').toggle($('.hookForm #condition').val() == 1); }); $(document).on('click', '.hookForm .set-expression', function() { var $tr = $(this).parents('tr'); initExpression($tr); $('.hookForm #expressionLabel').remove(); $('.hookForm #expressionDIV').show(); $('.hookForm #conditionDIV, .hookForm #hookDIV').hide(); }); }) function loadTarget() { var action = $('.hookForm #action').val(); var table = $('.hookForm #table').val(); $('.hookForm #expressionDIV .target-detail .detail-content .dynamic-target').remove(); if(action == 'update' && table != window.moduleName) { $.get(createLink('workflowhook', 'ajaxGetNumberFields', 'table=' + table), function(fields) { $('.hookForm #expressionDIV .target-detail .detail-content').prepend(fields); }); } } function initExpression($tr) { let key = $tr.data('key'); let field = $tr.find('.field option:selected').text(); let name = field == '' ? window.formulaLang.common : field; let expression = $tr.find('.paramTD [name*=param]').val(); $('.hookForm #expressionDIV').attr('data-key', key); $('.hookForm #expressionDIV .expression .item-name').html(name); $('.hookForm #expressionDIV .expression .item-expression').remove(); if(expression) { window.expression = JSON.parse(expression); for(var i in window.expression) { let current = window.expression[i]; let text = current.text; if(current.type == 'target') { if(current.function) { text = window.formulaLang.functions[current.function].replace('%s', window.modules[current.module]).replace('%s', window.moduleFields[current.module][current.field]); } else { text = window.modules[current.module] + '_' + window.moduleFields[current.module][current.field]; } } $('.hookForm #expressionDIV .expression').append("" + text + ""); } } else { window.expression.length = 0; } } function checkExpression() { if(window.expression.length == 0) { appendErrorLabel(window.formulaLang.error.empty); return true; } else { let fakeExpression = []; for(var i in window.expression) { let current = window.expression[i]; if(current.type == 'target') fakeExpression.push(current.field); if(current.type == 'operator') fakeExpression.push(current.operator); if(current.type == 'number') fakeExpression.push(current.value); } fakeExpression = fakeExpression.join(''); try { math.parse(fakeExpression); } catch(error) { appendErrorLabel(window.formulaLang.error.error); return true; } let error = false; let length = window.expression.length; for(var i in window.expression) { i = parseInt(i); let current = window.expression[i]; let prev = ''; let next = ''; if(i > 0) prev = window.expression[i - 1]; if(i < length -1) next = window.expression[i + 1]; switch(current.type) { case 'target' : if(prev != '' && (prev.type != 'operator' || prev.operator == ')')) { error = true; break; } if(next != '' && (next.type != 'operator' || next.operator == '(')) { error = true; break; } break; case 'number' : if(current.value == '.') { if(prev == '' || prev.type != 'number' || prev.value == '.') { error = true; break; } if(next == '' || next.type != 'number' || next.value == '.') { error = true; break; } } else { if(prev != '' && (prev.type == 'target' || (prev.type == 'operator' && prev.operator == ')'))) { error = true; break; } if(next != '' && (next.type == 'target' || (next.type == 'operator' && next.operator == '('))) { error = true; break; } } break; case 'operator' : switch(current.operator) { case '(' : if(prev != '' && (prev.type != 'operator' || prev.operator == ')')) { error = true; break; } if(next == '' || (next.type == 'number' && next.value == '.') || (next.type == 'operator' && next.operator != '(')) { error = true; break; } break; case ')' : if(prev == '' || (prev.type == 'number' && prev.value == '.') || (prev.type == 'operator' && prev.operator != ')')) { error = true; break; } if(next != '' && (next.type != 'operator' || next.operator == '(')) { error = true; break; } break; default : if(prev == '' || (prev.type == 'operaor' && prev.operator != ')') || (prev.type == 'number' && prev.value == '.')) { error = true; break; } if(next == '' || (next.type == 'operaor' && next.operator != '(') || (next.type == 'number' && next.value == '.')) { error = true; break; } } break; } if(error) { appendErrorLabel(window.formulaLang.error.error); return true; } } return false; } } function appendErrorLabel(message) { removeErrorLabel(); $('.hookForm #expressionDIV .expression').css('border-color', '#953B39').after("" + message + ''); $('.hookForm').parents('.modal-body').scrollTop(0); } function removeErrorLabel() { $('.hookForm #expressionDIV .expression').css('border-color', '').next('#expressionLabel').remove(); }