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.
257 lines
9.6 KiB
257 lines
9.6 KiB
/* 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.
|
|
*/
|
|
'use strict';
|
|
|
|
// Form service
|
|
angular.module('flowableModeler').service('FormBuilderService', ['$http', '$q', '$rootScope', '$translate',
|
|
function ($http, $q, $rootScope, $translate) {
|
|
|
|
// Removes all properties starting with '_', used before json serialization
|
|
function removePrivateFields(fields) {
|
|
fields.forEach(function(field, i){
|
|
for (var attr in field) {
|
|
if (attr.indexOf('_') === 0) {
|
|
delete field[attr];
|
|
}
|
|
}
|
|
if (field.fields) {
|
|
for (var fieldsName in field.fields) {
|
|
removePrivateFields(field.fields[fieldsName]);
|
|
}
|
|
}
|
|
});
|
|
return fields;
|
|
}
|
|
|
|
/**
|
|
* Remove the given step from the given container.
|
|
*/
|
|
this.saveForm = function (data, name, formKey, description, saveCallback, errorCallback) {
|
|
|
|
var fieldIndex = 0;
|
|
data.formRepresentation = $rootScope.currentForm;
|
|
data.formRepresentation.name = name;
|
|
data.formRepresentation.key = formKey;
|
|
|
|
if (description && description.length > 0) {
|
|
data.formRepresentation.description = description;
|
|
}
|
|
for (var i = 0; i < $rootScope.formItems.length; i++) {
|
|
var field = $rootScope.formItems[i];
|
|
this._cleanFormField(field, fieldIndex++);
|
|
}
|
|
|
|
var currentActiveTab = $rootScope.formBuilder.activeTab;
|
|
if (currentActiveTab != 'design') {
|
|
$rootScope.formBuilder.activeTab = 'design';
|
|
}
|
|
|
|
data.formRepresentation.formDefinition = {
|
|
name: name,
|
|
key: formKey,
|
|
fields: removePrivateFields(angular.copy($rootScope.formItems)),
|
|
outcomes: $rootScope.currentOutcomes
|
|
};
|
|
|
|
html2canvas(jQuery('#canvasSection'), {
|
|
onrendered: function (canvas) {
|
|
var scale = canvas.width / 300.0;
|
|
var extra_canvas = document.createElement("canvas");
|
|
extra_canvas.setAttribute('width', 300);
|
|
extra_canvas.setAttribute('height', canvas.height / scale);
|
|
var ctx = extra_canvas.getContext('2d');
|
|
ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, 300, canvas.height / scale);
|
|
data.formImageBase64 = extra_canvas.toDataURL("image/png");
|
|
|
|
$http({method: 'PUT', url: FLOWABLE.APP_URL.getFormModelUrl($rootScope.currentForm.id), data: data}).
|
|
success(function (response, status, headers, config) {
|
|
|
|
if (saveCallback) {
|
|
saveCallback();
|
|
}
|
|
}).
|
|
error(function (response, status, headers, config) {
|
|
if (errorCallback) {
|
|
errorCallback(response);
|
|
}
|
|
});
|
|
|
|
if (currentActiveTab != 'design') {
|
|
$rootScope.formBuilder.activeTab = currentActiveTab;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
this._cleanFormField = function(field, fieldIndex) {
|
|
if (!field.overrideId) {
|
|
var fieldId;
|
|
if (field.name && field.name.length > 0) {
|
|
fieldId = field.name.toLowerCase();
|
|
fieldId = fieldId.replace(new RegExp(' ', 'g'), '');
|
|
fieldId = fieldId.replace(/[&\/\\#,+~%.'":*?!<>{}()$@;]/g, '');
|
|
} else {
|
|
fieldId = 'field' + fieldIndex;
|
|
}
|
|
field.id = fieldId;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Updates the form cache for a specific step
|
|
* @param {String} stepId
|
|
* @param {Object} formDefinition
|
|
*/
|
|
this.updateFormsCache = function (stepId, formDefinition) {
|
|
if (stepId) {
|
|
if (formDefinition && formDefinition.id) {
|
|
_updateFormCache(stepId, formDefinition.id);
|
|
} else {
|
|
_updateFormCache(stepId);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Fetches forms from cache up to the given step (and not after)
|
|
* @param {Array} steps all steps in sequential order
|
|
* @param {String} stepId the current step
|
|
* @return {Array} flattened list of all forms up to given step
|
|
*/
|
|
this.getFormsForStep = function (steps, stepId) {
|
|
var forms = [];
|
|
|
|
if (stepId !== '__startform') {
|
|
// check start for start form
|
|
forms.push(_getFormForStep('__startform'));
|
|
|
|
if (stepId && steps && steps.length > 0) {
|
|
for (var i = 0; i < steps.length; i++) {
|
|
if (steps[i].id != stepId) {
|
|
forms.push(_getFormForStep(steps[i].id));
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// only unique forms
|
|
var uniqueIds = [];
|
|
var uniqueForms = [];
|
|
|
|
forms.forEach(function (item) {
|
|
if (item && item.id) {
|
|
if (uniqueIds.indexOf(item.id) < 0) {
|
|
uniqueIds.push(item.id);
|
|
uniqueForms.push(item);
|
|
}
|
|
}
|
|
});
|
|
|
|
uniqueForms.sort(function(a,b){
|
|
return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
|
|
});
|
|
|
|
return uniqueForms;
|
|
};
|
|
|
|
/**
|
|
* Fetches form outcomes from cache for specific form
|
|
* @param {String} formId
|
|
* @return {Array} flattened list of all form outcomes
|
|
*/
|
|
this.getFormOutcomesForForm = function (formId) {
|
|
var outcomes = [];
|
|
if (formId) {
|
|
outcomes = _getFormOutcomesForForm(formId);
|
|
}
|
|
|
|
outcomes.sort(function(a,b){
|
|
return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
|
|
});
|
|
|
|
return outcomes;
|
|
};
|
|
|
|
/**
|
|
* Fetches form fields from cache for specific form
|
|
* @param {String} formId
|
|
* @return {Array} flattened list of all form form fields
|
|
*/
|
|
this.getFormFieldsForForm = function (formId) {
|
|
var formFields = [];
|
|
if (formId) {
|
|
formFields = _getFormFieldsForForm(formId);
|
|
}
|
|
return formFields;
|
|
};
|
|
|
|
var _updateFormCache = function (stepId, formId) {
|
|
if (stepId && formId) {
|
|
$http({method: 'GET', url: FLOWABLE.APP_URL.getFormModelUrl(formId)}).
|
|
success(function(response) {
|
|
if (response) {
|
|
var outcomes;
|
|
var formFields;
|
|
if (response.formDefinition) {
|
|
if (response.formDefinition.fields) {
|
|
formFields = response.formDefinition.fields;
|
|
}
|
|
|
|
if (response.formDefinition.outcomes) {
|
|
outcomes = response.formDefinition.outcomes;
|
|
}
|
|
}
|
|
var filteredFormFields = _filterFormFields(formFields);
|
|
var formFieldInfo = {id: response.id, name: response.name, description: response.description, outcomes: outcomes, fields: filteredFormFields};
|
|
_addFormFieldsForStepToCache(stepId, formFieldInfo);
|
|
}
|
|
});
|
|
}
|
|
if (stepId && !formId) {
|
|
_deleteFormFieldsForStepFromCache(stepId);
|
|
}
|
|
};
|
|
|
|
var _getFormDefinitions = function (formIds, callback) {
|
|
|
|
if (formIds.length > 0) {
|
|
|
|
var formIdParams = '';
|
|
for (var i = 0; i < formIds.length; i++) {
|
|
if (formIdParams.length > 0) {
|
|
formIdParams += '&';
|
|
}
|
|
formIdParams += 'formId=' + formIds[i];
|
|
}
|
|
if (formIdParams.length > 0) {
|
|
formIdParams += '&';
|
|
}
|
|
formIdParams += 'version=' + Date.now();
|
|
|
|
$http({method: 'GET', url: FLOWABLE.APP_URL.getFormModelValuesUrl(formIdParams)}).
|
|
success(function (data) {
|
|
if (callback) {
|
|
callback(data);
|
|
}
|
|
}).
|
|
|
|
error(function (data) {
|
|
console.log('Something went wrong when fetching form values:' + JSON.stringify(data));
|
|
});
|
|
}
|
|
};
|
|
}
|
|
]);
|