You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
738 lines
34 KiB
738 lines
34 KiB
/* Copyright 2005-2015 Alfresco Software, Ltd.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
var extScope;
|
|
|
|
angular.module('flowableModeler')
|
|
.controller('DecisionTableDetailsCtrl', ['$rootScope', '$scope', '$translate', '$http', '$location', '$routeParams','$modal', '$timeout', '$popover', 'DecisionTableService', 'hotRegisterer',
|
|
function ($rootScope, $scope, $translate, $http, $location, $routeParams, $modal, $timeout, $popover, DecisionTableService, hotRegisterer) {
|
|
|
|
extScope = $scope;
|
|
|
|
$scope.decisionTableMode = 'read';
|
|
|
|
// Initialize model
|
|
$scope.model = {
|
|
// Store the main model id, this points to the current version of a model,
|
|
// even when we're showing history
|
|
latestModelId: $routeParams.modelId,
|
|
columnDefs: [],
|
|
columnVariableIdMap: {},
|
|
readOnly: true,
|
|
availableVariableTypes: ['string', 'number', 'boolean', 'date', 'collection']
|
|
};
|
|
|
|
// Hot Model init
|
|
$scope.model.hotSettings = {
|
|
stretchH: 'all',
|
|
outsideClickDeselects: false,
|
|
manualColumnResize: false,
|
|
readOnly: true,
|
|
disableVisualSelection: true
|
|
};
|
|
|
|
var hotReadOnlyDecisionTableEditorInstance;
|
|
var hitPolicies = ['FIRST', 'ANY', 'UNIQUE', 'PRIORITY', 'RULE ORDER', 'OUTPUT ORDER', 'COLLECT'];
|
|
var operators = ['==', '!=', '<', '>', '>=', '<=', 'ANY OF', 'NONE OF', 'ALL OF', 'NOT ALL OF', 'IS IN', 'IS NOT IN'];
|
|
var columnIdCounter = 0;
|
|
var dateFormat = 'YYYY-MM-DD';
|
|
|
|
var variableUndefined = $translate.instant('DECISION-TABLE-EDITOR.EMPTY-MESSAGES.NO-VARIABLE-SELECTED');
|
|
// helper for looking up variable id by col id
|
|
$scope.getVariableNameByColumnId = function (colId) {
|
|
|
|
if (!colId) {
|
|
return;
|
|
}
|
|
|
|
if ($scope.model.columnVariableIdMap[colId]) {
|
|
return $scope.model.columnVariableIdMap[colId];
|
|
} else {
|
|
return variableUndefined;
|
|
}
|
|
};
|
|
|
|
$scope.loadDecisionTable = function() {
|
|
var url, decisionTableUrl;
|
|
if ($routeParams.modelHistoryId) {
|
|
url = FLOWABLE.APP_URL.getModelHistoryUrl($routeParams.modelId, $routeParams.modelHistoryId);
|
|
decisionTableUrl = FLOWABLE.APP_URL.getDecisionTableModelsHistoryUrl($routeParams.modelHistoryId);
|
|
} else {
|
|
url = FLOWABLE.APP_URL.getModelUrl($routeParams.modelId);
|
|
decisionTableUrl = FLOWABLE.APP_URL.getDecisionTableModelUrl($routeParams.modelId);
|
|
}
|
|
|
|
$http({method: 'GET', url: url}).
|
|
success(function(data, status, headers, config) {
|
|
$scope.model.decisionTable = data;
|
|
$scope.model.decisionTableDownloadUrl = decisionTableUrl + '/export?version=' + Date.now();
|
|
$scope.loadVersions();
|
|
|
|
}).error(function(data, status, headers, config) {
|
|
$scope.returnToList();
|
|
});
|
|
};
|
|
|
|
$scope.useAsNewVersion = function() {
|
|
_internalCreateModal({
|
|
template: 'views/popup/model-use-as-new-version.html',
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.toggleFavorite = function() {
|
|
$scope.model.favoritePending = true;
|
|
|
|
var data = {
|
|
favorite: !$scope.model.decisionTable.favorite
|
|
};
|
|
|
|
$http({method: 'PUT', url: FLOWABLE.APP_URL.getModelUrl($scope.model.latestModelId), data: data}).
|
|
success(function(data, status, headers, config) {
|
|
$scope.model.favoritePending = false;
|
|
if ($scope.model.decisionTable.favorite) {
|
|
$scope.addAlertPromise($translate('DECISION-TABLE.ALERT.UN-FAVORITE-CONFIRM'), 'info');
|
|
} else {
|
|
$scope.addAlertPromise($translate('DECISION-TABLE.ALERT.FAVORITE-CONFIRM'), 'info');
|
|
}
|
|
$scope.model.decisionTable.favorite = !$scope.model.decisionTable.favorite;
|
|
}).error(function(data, status, headers, config) {
|
|
$scope.model.favoritePending = false;
|
|
});
|
|
};
|
|
|
|
|
|
$scope.loadVersions = function() {
|
|
|
|
var params = {
|
|
includeLatestVersion: !$scope.model.decisionTable.latestVersion
|
|
};
|
|
|
|
$http({method: 'GET', url: FLOWABLE.APP_URL.getModelHistoriesUrl($scope.model.latestModelId), params: params}).
|
|
success(function(data, status, headers, config) {
|
|
if ($scope.model.decisionTable.latestVersion) {
|
|
if (!data.data) {
|
|
data.data = [];
|
|
}
|
|
data.data.unshift($scope.model.decisionTable);
|
|
}
|
|
|
|
$scope.model.versions = data;
|
|
});
|
|
};
|
|
|
|
$scope.showVersion = function(version) {
|
|
if (version) {
|
|
if (version.latestVersion) {
|
|
$location.path("/decision-tables/" + $scope.model.latestModelId);
|
|
} else {
|
|
// Show latest version, no history-suffix needed in URL
|
|
$location.path("/decision-tables/" + $scope.model.latestModelId + "/history/" + version.id);
|
|
}
|
|
}
|
|
};
|
|
|
|
$scope.returnToList = function() {
|
|
$location.path("/decision-tables/");
|
|
};
|
|
|
|
$scope.editDecisionTable = function() {
|
|
_internalCreateModal({
|
|
template: 'views/popup/model-edit.html',
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.duplicateDecisionTable = function() {
|
|
|
|
var modalInstance = _internalCreateModal({
|
|
template: 'views/popup/decision-table-duplicate.html?version=' + Date.now()
|
|
}, $modal, $scope);
|
|
|
|
modalInstance.$scope.originalModel = $scope.model;
|
|
|
|
modalInstance.$scope.duplicateDecisionTableCallback = function(result) {
|
|
$rootScope.editorHistory = [];
|
|
$location.url("/decision-table-editor/" + encodeURIComponent(result.id));
|
|
};
|
|
};
|
|
|
|
$scope.deleteDecisionTable = function() {
|
|
_internalCreateModal({
|
|
template: 'views/popup/model-delete.html',
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.shareDecisionTable = function() {
|
|
_internalCreateModal({
|
|
template: 'views/popup/model-share.html',
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.openEditor = function() {
|
|
if ($scope.model.decisionTable) {
|
|
$location.path("/decision-table-editor/" + $scope.model.decisionTable.id);
|
|
}
|
|
};
|
|
|
|
$scope.toggleHistory = function($event) {
|
|
if (!$scope.historyState) {
|
|
var state = {};
|
|
$scope.historyState = state;
|
|
|
|
// Create popover
|
|
state.popover = $popover(angular.element($event.target), {
|
|
template: 'views/popover/history.html',
|
|
placement: 'bottom-right',
|
|
show: true,
|
|
scope: $scope,
|
|
container: 'body'
|
|
});
|
|
|
|
var destroy = function() {
|
|
state.popover.destroy();
|
|
delete $scope.historyState;
|
|
};
|
|
|
|
// When popup is hidden or scope is destroyed, hide popup
|
|
state.popover.$scope.$on('tooltip.hide', destroy);
|
|
$scope.$on('$destroy', destroy);
|
|
}
|
|
};
|
|
|
|
$scope.doAfterGetColHeader = function (col, TH) {
|
|
if ($scope.model.columnDefs[col] && $scope.model.columnDefs[col].expressionType === 'input-operator') {
|
|
TH.className += "input-operator-header";
|
|
} else if ($scope.model.columnDefs[col] && $scope.model.columnDefs[col].expressionType === 'input-expression') {
|
|
TH.className += "input-expression-header";
|
|
if ($scope.model.startOutputExpression - 1 === col) {
|
|
TH.className += " last";
|
|
}
|
|
} else if ($scope.model.columnDefs[col] && $scope.model.columnDefs[col].expressionType === 'output') {
|
|
TH.className += "output-header";
|
|
if ($scope.model.startOutputExpression === col) {
|
|
TH.className += " first";
|
|
}
|
|
}
|
|
};
|
|
|
|
$scope.doAfterModifyColWidth = function (width, col) {
|
|
if ($scope.model.columnDefs[col] && $scope.model.columnDefs[col].width) {
|
|
var settingsWidth = $scope.model.columnDefs[col].width;
|
|
if (settingsWidth > width) {
|
|
return settingsWidth;
|
|
}
|
|
}
|
|
return width;
|
|
};
|
|
|
|
$scope.doAfterRender = function () {
|
|
var element = document.querySelector("thead > tr > th:first-of-type");
|
|
if (element) {
|
|
var firstChild = element.firstChild;
|
|
var newElement = angular.element('<div class="hit-policy-header"><a onclick="triggerHitPolicyEditor()">' + $scope.currentDecisionTable.hitIndicator.substring(0, 1) + '</a></div>');
|
|
element.className = 'hit-policy-container';
|
|
element.replaceChild(newElement[0], firstChild);
|
|
}
|
|
|
|
$timeout(function () {
|
|
hotReadOnlyDecisionTableEditorInstance = hotRegisterer.getInstance('read-only-decision-table-editor');
|
|
if (hotReadOnlyDecisionTableEditorInstance) {
|
|
hotReadOnlyDecisionTableEditorInstance.validateCells();
|
|
}
|
|
});
|
|
};
|
|
|
|
$scope.doAfterValidate = function (isValid, value, row, prop, source) {
|
|
if (isCorrespondingCollectionOperator(row, prop)) {
|
|
return true;
|
|
} else if (isCustomExpression(value) || isDashValue(value)) {
|
|
disableCorrespondingOperatorCell(row, prop);
|
|
return true;
|
|
} else {
|
|
enableCorrespondingOperatorCell(row, prop);
|
|
}
|
|
};
|
|
|
|
var isCustomExpression = function (val) {
|
|
return !!(val != null
|
|
&& (String(val).startsWith('${') || String(val).startsWith('#{')));
|
|
};
|
|
|
|
var isDashValue = function (val) {
|
|
return !!(val != null && "-" === val);
|
|
};
|
|
|
|
var isCorrespondingCollectionOperator = function (row, prop) {
|
|
var operatorCol = getCorrespondingOperatorCell(row, prop);
|
|
var operatorCellMeta = hotReadOnlyDecisionTableEditorInstance.getCellMeta(row, operatorCol);
|
|
|
|
var isCollectionOperator = false;
|
|
if (isOperatorCell(operatorCellMeta)) {
|
|
var operatorValue = hotReadOnlyDecisionTableEditorInstance.getDataAtCell(row, operatorCol);
|
|
if (operatorValue === "ANY OF" || operatorValue === "NONE OF" || operatorValue === "ALL OF" || operatorValue === "NOT ALL OF"
|
|
|| operatorValue === "IS IN" || operatorValue === "IS NOT IN") {
|
|
isCollectionOperator = true;
|
|
}
|
|
}
|
|
return isCollectionOperator;
|
|
};
|
|
|
|
var disableCorrespondingOperatorCell = function (row, prop) {
|
|
var operatorCol = getCorrespondingOperatorCell(row, prop);
|
|
var operatorCellMeta = hotReadOnlyDecisionTableEditorInstance.getCellMeta(row, operatorCol);
|
|
|
|
if (!isOperatorCell(operatorCellMeta)) {
|
|
return;
|
|
}
|
|
|
|
if (operatorCellMeta.className != null && operatorCellMeta.className.indexOf('custom-expression-operator') !== -1) {
|
|
return;
|
|
}
|
|
|
|
var currentEditor = hotReadOnlyDecisionTableEditorInstance.getCellEditor(row, operatorCol);
|
|
|
|
hotReadOnlyDecisionTableEditorInstance.setCellMeta(row, operatorCol, 'className', operatorCellMeta.className + ' custom-expression-operator');
|
|
hotReadOnlyDecisionTableEditorInstance.setCellMeta(row, operatorCol, 'originalEditor', currentEditor);
|
|
hotReadOnlyDecisionTableEditorInstance.setCellMeta(row, operatorCol, 'editor', false);
|
|
hotReadOnlyDecisionTableEditorInstance.setDataAtCell(row, operatorCol, null);
|
|
};
|
|
|
|
var enableCorrespondingOperatorCell = function (row, prop) {
|
|
var operatorCol = getCorrespondingOperatorCell(row, prop);
|
|
var operatorCellMeta = hotReadOnlyDecisionTableEditorInstance.getCellMeta(row, operatorCol);
|
|
|
|
if (!isOperatorCell(operatorCellMeta)) {
|
|
return;
|
|
}
|
|
|
|
if (operatorCellMeta == null || operatorCellMeta.className == null || operatorCellMeta.className.indexOf('custom-expression-operator') == -1) {
|
|
return;
|
|
}
|
|
|
|
operatorCellMeta.className = operatorCellMeta.className.replace('custom-expression-operator', '');
|
|
hotReadOnlyDecisionTableEditorInstance.setCellMeta(row, operatorCol, 'className', operatorCellMeta.className);
|
|
hotReadOnlyDecisionTableEditorInstance.setCellMeta(row, operatorCol, 'editor', operatorCellMeta.originalEditor);
|
|
hotReadOnlyDecisionTableEditorInstance.setDataAtCell(row, operatorCol, '==');
|
|
};
|
|
|
|
var getCorrespondingOperatorCell = function (row, prop) {
|
|
var currentCol = hotReadOnlyDecisionTableEditorInstance.propToCol(prop);
|
|
if (currentCol < 1) {
|
|
return;
|
|
}
|
|
var operatorCol = currentCol - 1;
|
|
return operatorCol;
|
|
};
|
|
|
|
var isOperatorCell = function (cellMeta) {
|
|
return !(cellMeta == null || cellMeta.prop == null || typeof cellMeta.prop !== 'string'|| cellMeta.prop.endsWith("_operator") === false);
|
|
};
|
|
|
|
var createNewInputExpression = function (inputExpression) {
|
|
var newInputExpression;
|
|
if (inputExpression) {
|
|
newInputExpression = {
|
|
id: _generateColumnId(),
|
|
label: inputExpression.label,
|
|
variableId: inputExpression.variableId,
|
|
type: inputExpression.type,
|
|
newVariable: inputExpression.newVariable,
|
|
entries: inputExpression.entries
|
|
};
|
|
} else {
|
|
newInputExpression = {
|
|
id: _generateColumnId(),
|
|
label: null,
|
|
variableId: null,
|
|
type: null,
|
|
newVariable: null,
|
|
entries: null
|
|
};
|
|
}
|
|
return newInputExpression;
|
|
};
|
|
|
|
$scope.openHitPolicyEditor = function () {
|
|
var editTemplate = 'views/popup/decision-table-edit-hit-policy.html';
|
|
|
|
$scope.model.hitPolicy = $scope.currentDecisionTable.hitIndicator;
|
|
|
|
_internalCreateModal({
|
|
template: editTemplate,
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.openInputExpressionEditor = function (expressionPos, newExpression) {
|
|
var editTemplate = 'views/popup/decision-table-edit-input-expression.html';
|
|
|
|
$scope.model.newExpression = !!newExpression;
|
|
|
|
if (!$scope.model.newExpression) {
|
|
$scope.model.selectedExpression = $scope.currentDecisionTable.inputExpressions[expressionPos];
|
|
} else {
|
|
if (expressionPos >= $scope.model.startOutputExpression) {
|
|
$scope.model.selectedColumn = $scope.model.startOutputExpression - 1;
|
|
} else {
|
|
$scope.model.selectedColumn = Math.floor(expressionPos / 2);
|
|
}
|
|
}
|
|
|
|
_internalCreateModal({
|
|
template: editTemplate,
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
$scope.openOutputExpressionEditor = function (expressionPos, newExpression) {
|
|
var editTemplate = 'views/popup/decision-table-edit-output-expression.html';
|
|
|
|
$scope.model.newExpression = !!newExpression;
|
|
$scope.model.hitPolicy = $scope.currentDecisionTable.hitIndicator;
|
|
$scope.model.selectedColumn = expressionPos;
|
|
|
|
|
|
if (!$scope.model.newExpression) {
|
|
$scope.model.selectedExpression = $scope.currentDecisionTable.outputExpressions[expressionPos];
|
|
}
|
|
|
|
_internalCreateModal({
|
|
template: editTemplate,
|
|
scope: $scope
|
|
}, $modal, $scope);
|
|
};
|
|
|
|
var createNewOutputExpression = function (outputExpression) {
|
|
var newOutputExpression;
|
|
if (outputExpression) {
|
|
newOutputExpression = {
|
|
id: _generateColumnId(),
|
|
label: outputExpression.label,
|
|
variableId: outputExpression.variableId,
|
|
type: outputExpression.variableType,
|
|
newVariable: outputExpression.newVariable,
|
|
entries: outputExpression.entries
|
|
};
|
|
} else {
|
|
newOutputExpression = {
|
|
id: _generateColumnId(),
|
|
label: null,
|
|
variableId: null,
|
|
type: null,
|
|
newVariable: null,
|
|
entries: null
|
|
};
|
|
}
|
|
return newOutputExpression;
|
|
};
|
|
|
|
var _loadDecisionTableDefinition = function (modelId, historyId) {
|
|
DecisionTableService.fetchDecisionTableDetails(modelId, historyId).then(function (decisionTable) {
|
|
|
|
$rootScope.currentDecisionTable = decisionTable.decisionTableDefinition;
|
|
$rootScope.currentDecisionTable.id = decisionTable.id;
|
|
$rootScope.currentDecisionTable.key = decisionTable.decisionTableDefinition.key;
|
|
$rootScope.currentDecisionTable.name = decisionTable.name;
|
|
$rootScope.currentDecisionTable.description = decisionTable.description;
|
|
|
|
// decision table model to used in save dialog
|
|
$rootScope.currentDecisionTableModel = {
|
|
id: decisionTable.id,
|
|
name: decisionTable.name,
|
|
key: decisionTable.decisionTableDefinition.key,
|
|
description: decisionTable.description
|
|
};
|
|
|
|
if (!$rootScope.currentDecisionTable.hitIndicator) {
|
|
$rootScope.currentDecisionTable.hitIndicator = hitPolicies[0];
|
|
}
|
|
|
|
evaluateDecisionTableGrid($rootScope.currentDecisionTable);
|
|
|
|
});
|
|
};
|
|
|
|
var evaluateDecisionTableGrid = function (decisionTable) {
|
|
$scope.evaluateDecisionHeaders(decisionTable);
|
|
evaluateDecisionGrid(decisionTable);
|
|
};
|
|
|
|
var setGridValues = function (key, type) {
|
|
if ($scope.model.rulesData) {
|
|
$scope.model.rulesData.forEach(function (rowData) {
|
|
if (type === 'input-operator') {
|
|
if (!(key in rowData) || rowData[key] === '') {
|
|
rowData[key] = '==';
|
|
}
|
|
}
|
|
// else if (type === 'input-expression') {
|
|
// if (!(key in rowData) || rowData[key] === '') {
|
|
// rowData[key] = '-';
|
|
// }
|
|
// }
|
|
});
|
|
}
|
|
};
|
|
|
|
var evaluateDecisionGrid = function (decisionTable) {
|
|
var tmpRuleGrid = [];
|
|
|
|
// rows
|
|
if (decisionTable.rules && decisionTable.rules.length > 0) {
|
|
decisionTable.rules.forEach(function (rule) {
|
|
|
|
// rule data
|
|
var tmpRowValues = {};
|
|
for (var i = 0; i < Object.keys(rule).length; i++) {
|
|
var id = Object.keys(rule)[i];
|
|
|
|
$scope.model.columnDefs.forEach(function (columnDef) {
|
|
// set counter to max value
|
|
var expressionId = 0;
|
|
try {
|
|
expressionId = parseInt(columnDef.expression.id);
|
|
} catch (e) {
|
|
}
|
|
if (expressionId > columnIdCounter) {
|
|
columnIdCounter = expressionId;
|
|
}
|
|
});
|
|
|
|
tmpRowValues[id] = rule[id];
|
|
}
|
|
|
|
tmpRuleGrid.push(tmpRowValues);
|
|
});
|
|
} else {
|
|
// initialize default values
|
|
tmpRuleGrid.push(createDefaultRow());
|
|
}
|
|
// $rootScope.currentDecisionTableRules = tmpRuleGrid;
|
|
$scope.model.rulesData = tmpRuleGrid;
|
|
};
|
|
|
|
var createDefaultRow = function () {
|
|
var defaultRow = {};
|
|
$scope.model.columnDefs.forEach(function (columnDefinition) {
|
|
if (columnDefinition.expressionType === 'input-operator') {
|
|
defaultRow[columnDefinition.data] = '==';
|
|
}
|
|
// else if (columnDefinition.expressionType === 'input-expression') {
|
|
// defaultRow[columnDefinition.data] = '-';
|
|
// }
|
|
else if (columnDefinition.expressionType === 'output') {
|
|
defaultRow[columnDefinition.data] = '';
|
|
}
|
|
});
|
|
|
|
return defaultRow;
|
|
};
|
|
|
|
var composeInputOperatorColumnDefinition = function (inputExpression) {
|
|
var expressionPosition = $scope.currentDecisionTable.inputExpressions.indexOf(inputExpression);
|
|
|
|
var columnDefinition = {
|
|
data: inputExpression.id + '_operator',
|
|
expressionType: 'input-operator',
|
|
expression: inputExpression,
|
|
width: '70',
|
|
className: 'input-operator-cell',
|
|
type: 'dropdown',
|
|
source: operators
|
|
};
|
|
|
|
return columnDefinition;
|
|
};
|
|
|
|
var composeInputExpressionColumnDefinition = function (inputExpression) {
|
|
var expressionPosition = $scope.currentDecisionTable.inputExpressions.indexOf(inputExpression);
|
|
|
|
var type;
|
|
switch (inputExpression.type) {
|
|
case 'date':
|
|
type = 'date';
|
|
break;
|
|
case 'number':
|
|
type = 'numeric';
|
|
break;
|
|
case 'boolean':
|
|
type = 'dropdown';
|
|
break;
|
|
default:
|
|
type = 'text';
|
|
}
|
|
|
|
var columnDefinition = {
|
|
data: inputExpression.id + '_expression',
|
|
type: type,
|
|
title: '<div class="input-header">' +
|
|
'<a onclick="triggerExpressionEditor(\'input\',' + expressionPosition + ',false)"><span class="header-label">' + (inputExpression.label ? inputExpression.label : "New Input") + '</span></a>' +
|
|
'<br><span class="header-variable">' + (inputExpression.variableId ? inputExpression.variableId : "none") + '</span>' +
|
|
'<br/><span class="header-variable-type">' + (inputExpression.type ? inputExpression.type : "") + '</brspan>' +
|
|
'</div>',
|
|
expressionType: 'input-expression',
|
|
expression: inputExpression,
|
|
className: 'htCenter',
|
|
width: '200'
|
|
};
|
|
|
|
if (inputExpression.entries && inputExpression.entries.length > 0) {
|
|
var entriesOptionValues = inputExpression.entries.slice(0, inputExpression.entries.length);
|
|
entriesOptionValues.push('-', '', ' ');
|
|
|
|
columnDefinition.type = 'dropdown';
|
|
columnDefinition.strict = true;
|
|
columnDefinition.source = entriesOptionValues;
|
|
|
|
columnDefinition.title = '<div class="input-header">' +
|
|
'<a onclick="triggerExpressionEditor(\'input\',' + expressionPosition + ',false)"><span class="header-label">' + (inputExpression.label ? inputExpression.label : "New Input") + '</span></a>' +
|
|
'<br><span class="header-variable">' + (inputExpression.variableId ? inputExpression.variableId : "none") + '</span>' +
|
|
'<br/><span class="header-variable-type">' + (inputExpression.type ? inputExpression.type : "") + '</span>' +
|
|
'<br><span class="header-entries">[' + inputExpression.entries.join() + ']</span>' +
|
|
'</div>';
|
|
}
|
|
|
|
if (type === 'date') {
|
|
columnDefinition.dateFormat = dateFormat;
|
|
} else if (type === 'dropdown') {
|
|
columnDefinition.source = ['true', 'false', '-'];
|
|
}
|
|
|
|
return columnDefinition;
|
|
};
|
|
|
|
var composeOutputColumnDefinition = function (outputExpression) {
|
|
var expressionPosition = $scope.currentDecisionTable.outputExpressions.indexOf(outputExpression);
|
|
|
|
var type;
|
|
switch (outputExpression.type) {
|
|
case 'date':
|
|
type = 'date';
|
|
break;
|
|
case 'number':
|
|
type = 'numeric';
|
|
break;
|
|
case 'boolean':
|
|
type = 'dropdown';
|
|
break;
|
|
default:
|
|
type = 'text';
|
|
}
|
|
|
|
var title = '';
|
|
var columnDefinition = {
|
|
data: outputExpression.id,
|
|
type: type,
|
|
expressionType: 'output',
|
|
expression: outputExpression,
|
|
className: 'htCenter',
|
|
width: '270'
|
|
};
|
|
|
|
if (outputExpression.entries && outputExpression.entries.length > 0) {
|
|
var entriesOptionValues = outputExpression.entries.slice(0, outputExpression.entries.length);
|
|
columnDefinition.type = 'dropdown';
|
|
columnDefinition.source = entriesOptionValues;
|
|
columnDefinition.strict = true;
|
|
|
|
title += '<div class="output-header">' +
|
|
'<a onclick="triggerExpressionEditor(\'output\',' + expressionPosition + ',false)"><span class="header-label">' + (outputExpression.label ? outputExpression.label : "New Output") + '</span></a>' +
|
|
'<br><span class="header-variable">' + (outputExpression.variableId ? outputExpression.variableId : "none") + '</span>' +
|
|
'<br/><span class="header-variable-type">' + (outputExpression.type ? outputExpression.type : "") + '</span>' +
|
|
'<br><span class="header-entries">[' + outputExpression.entries.join() + ']</span>' +
|
|
'</div>';
|
|
} else {
|
|
title += '<div class="output-header">' +
|
|
'<a onclick="triggerExpressionEditor(\'output\',' + expressionPosition + ',false)"><span class="header-label">' + (outputExpression.label ? outputExpression.label : "New Output") + '</span></a>' +
|
|
'<br><span class="header-variable">' + (outputExpression.variableId ? outputExpression.variableId : "none") + '</span>' +
|
|
'<br/><span class="header-variable-type">' + (outputExpression.type ? outputExpression.type : "") + '</span>' +
|
|
'</div>'
|
|
}
|
|
|
|
if (type === 'date') {
|
|
columnDefinition.dateFormat = dateFormat;
|
|
} else if (type === 'dropdown') {
|
|
columnDefinition.source = ['true', 'false', '-'];
|
|
}
|
|
|
|
columnDefinition.title = title;
|
|
|
|
return columnDefinition;
|
|
};
|
|
|
|
$scope.evaluateDecisionHeaders = function (decisionTable) {
|
|
var columnDefinitions = [];
|
|
var inputExpressionCounter = 0;
|
|
if (decisionTable.inputExpressions && decisionTable.inputExpressions.length > 0) {
|
|
decisionTable.inputExpressions.forEach(function (inputExpression) {
|
|
var inputOperatorColumnDefinition = composeInputOperatorColumnDefinition(inputExpression);
|
|
columnDefinitions.push(inputOperatorColumnDefinition);
|
|
setGridValues(inputOperatorColumnDefinition.data, inputOperatorColumnDefinition.expressionType);
|
|
|
|
var inputExpressionColumnDefinition = composeInputExpressionColumnDefinition(inputExpression);
|
|
columnDefinitions.push(inputExpressionColumnDefinition);
|
|
setGridValues(inputExpressionColumnDefinition.data, inputExpressionColumnDefinition.expressionType);
|
|
|
|
inputExpressionCounter += 2;
|
|
});
|
|
} else { // create default input expression
|
|
decisionTable.inputExpressions = [];
|
|
var inputExpression = createNewInputExpression();
|
|
decisionTable.inputExpressions.push(inputExpression);
|
|
columnDefinitions.push(composeInputOperatorColumnDefinition(inputExpression));
|
|
columnDefinitions.push(composeInputExpressionColumnDefinition(inputExpression));
|
|
inputExpressionCounter += 2;
|
|
}
|
|
|
|
columnDefinitions[inputExpressionCounter - 1].className += ' last';
|
|
$scope.model.startOutputExpression = inputExpressionCounter;
|
|
|
|
if (decisionTable.outputExpressions && decisionTable.outputExpressions.length > 0) {
|
|
decisionTable.outputExpressions.forEach(function (outputExpression) {
|
|
columnDefinitions.push(composeOutputColumnDefinition(outputExpression));
|
|
});
|
|
} else { // create default output expression
|
|
decisionTable.outputExpressions = [];
|
|
var outputExpression = createNewOutputExpression();
|
|
decisionTable.outputExpressions.push(outputExpression);
|
|
columnDefinitions.push(composeOutputColumnDefinition(outputExpression));
|
|
}
|
|
|
|
columnDefinitions[inputExpressionCounter].className += ' first';
|
|
|
|
// timeout needed for trigger hot update when removing column defs
|
|
$scope.model.columnDefs = columnDefinitions;
|
|
$timeout(function () {
|
|
if (hotReadOnlyDecisionTableEditorInstance) {
|
|
hotReadOnlyDecisionTableEditorInstance.render();
|
|
}
|
|
});
|
|
};
|
|
|
|
// fetch table from service and populate model
|
|
_loadDecisionTableDefinition($routeParams.modelId, $routeParams.modelHistoryId);
|
|
|
|
var _generateColumnId = function () {
|
|
columnIdCounter++;
|
|
return "" + columnIdCounter;
|
|
};
|
|
|
|
// Load model needed for favorites
|
|
$scope.loadDecisionTable();
|
|
|
|
}]);
|
|
|