Commit f8319f7d authored by Evren Kutar's avatar Evren Kutar

ADD expression to hide / show for actions on left by checking meta has object_actions

rref #5046
REFACTOR refactor if else cases to dynamic dispatch to generate fields
rfix #5152
fixes GH-89
fixes zetaops/ulakbusGH-203
parent b1172c42
......@@ -156,7 +156,7 @@ angular.module('ulakbus.crud', ['schemaForm', 'ulakbus.formService'])
$scope.$on('reload_cmd', function(event, data){
$scope.reload_cmd = data;
$scope.reload({});
$scope.reloadCmd();
});
// search directive updates objects after search results
......
......@@ -12,11 +12,11 @@
<th>İşlem</th>
</tr>
<tr ng-if="node.schema.formType=='ListNode'">
<th colspan="2">
<!--<label>-->
<!--<input type="checkbox" style="zoom:1.5; margin:5px 0 0 8px;">-->
<!--Hepsini Seç-->
<!--</label>-->
<th colspan="2" ng-if="meta.allow_selection===true">
<label>
<input type="checkbox" style="zoom:1.5; margin:5px 0 0 8px;">
Hepsini Seç
</label>
</th>
<th ng-repeat="(key,value) in node.items[0] track by $index"
ng-if="key!=='idx' && node.schema.properties[key]">
......@@ -46,9 +46,9 @@
<tr ng-repeat="listnodemodel in node.items track by $index"
ng-init="outerIndex=$index"
ng-if="node.schema.formType=='ListNode'">
<td ng-if="meta.allow_selection=true" width="60">
<td ng-if="meta.allow_selection===true" width="60">
<label>
<input type="checkbox" style="zoom:1.5; margin:5px 0 0 8px;">
<input type="checkbox" style="zoom:1.5; margin:5px 0 0 8px;">
</label>
</td>
<th scope="row" style="text-align:center">{{$index+1}}</th>
......@@ -62,10 +62,16 @@
ng-change="nodeModelChange(this)">
</td>
<td ng-if="meta.allow_actions!==false">
<button modal-for-nodes="{{node.schema.model_name}},{{node.schema.formType}},edit,{{$index}}">Düzenle
</button>
<br>
<button ng-click="remove(node, 'ListNode', $index)">Sil</button>
<div ng-hide="meta.object_actions.length > 0">
<button modal-for-nodes="{{node.schema.model_name}},{{node.schema.formType}},edit,{{$index}}">
Düzenle
</button>
<br>
<button ng-click="remove(node, 'ListNode', $index)">Sil</button>
</div>
<div ng-show="meta.object_actions.length > 0">
<!-- define object actions here -->
</div>
</td>
</tr>
......
......@@ -19,7 +19,7 @@ angular.module('ulakbus.formService', ['ui.bootstrap'])
* Moment.js used for date type conversions.
* there must be no global object, so we change it into a service here.
*/
.service('Moment', function(){
.service('Moment', function () {
return window.moment;
})
......@@ -217,448 +217,465 @@ angular.module('ulakbus.formService', ['ui.bootstrap'])
}
});
angular.forEach(scope.schema.properties, function (v, k) {
// generically change _id fields model value
if ('form_params' in scope) {
if (k == scope.form_params.param) {
scope.model[k] = scope.form_params.id;
scope.form.splice(scope.form.indexOf(k), 1);
return;
}
}
if (v.type === 'file') {
scope.form[scope.form.indexOf(k)] = {
type: "template",
title: v.title,
templateUrl: "shared/templates/filefield.html",
name: k,
key: k,
fileInsert: function () {
$scope.$broadcast('schemaForm.error.' + k, 'tv4-302', true);
},
imageSrc: scope.model[k] ? $rootScope.settings.static_url + scope.model[k] : '',
avatar: k === 'avatar'
};
v.type = 'string';
}
if (v.type === 'select') {
scope.form[scope.form.indexOf(k)] = {
type: "template",
title: v.title,
templateUrl: "shared/templates/select.html",
name: k,
key: k,
titleMap: v.titleMap
};
}
if (v.type === 'submit' || v.type === 'button') {
var buttonPositions = scope.modalElements ? scope.modalElements.buttonPositions : {
bottom: 'move-to-bottom',
top: 'move-to-top',
none: ''
};
var workOnForm = scope.modalElements ? scope.modalElements.workOnForm : 'formgenerated';
var workOnDiv = scope.modalElements ? scope.modalElements.workOnDiv : '';
var buttonClass = (buttonPositions[v.position] || buttonPositions.bottom);
var redirectTo = scope.modalElements ? false : true;
scope.form[scope.form.indexOf(k)] = {
type: v.type,
title: v.title,
style: "btn-danger hide " + buttonClass,
onClick: function () {
delete scope.form_params.cmd;
delete scope.form_params.flow;
if (v.cmd) {
scope.form_params["cmd"] = v.cmd;
}
if (v.flow) {
scope.form_params["flow"] = v.flow;
}
if (v.wf) {
delete scope.form_params["cmd"];
scope.form_params["wf"] = v.wf;
}
scope.model[k] = 1;
// todo: test it
if (scope.modalElements) {
scope.submitModalForm();
var _buttons = function (scope, v, k) {
var buttonPositions = scope.modalElements ? scope.modalElements.buttonPositions : {
bottom: 'move-to-bottom',
top: 'move-to-top',
none: ''
};
var workOnForm = scope.modalElements ? scope.modalElements.workOnForm : 'formgenerated';
var workOnDiv = scope.modalElements ? scope.modalElements.workOnDiv : '';
var buttonClass = (buttonPositions[v.position] || buttonPositions.bottom);
var redirectTo = scope.modalElements ? false : true;
scope.form[scope.form.indexOf(k)] = {
type: v.type,
title: v.title,
style: "btn-danger hide " + buttonClass,
onClick: function () {
delete scope.form_params.cmd;
delete scope.form_params.flow;
if (v.cmd) {
scope.form_params["cmd"] = v.cmd;
}
if (v.flow) {
scope.form_params["flow"] = v.flow;
}
if (v.wf) {
delete scope.form_params["cmd"];
scope.form_params["wf"] = v.wf;
}
scope.model[k] = 1;
// todo: test it
if (scope.modalElements) {
scope.submitModalForm();
} else {
if (v.validation === false) {
generator.submit(scope, redirectTo);
} else {
if (v.validation === false) {
scope.$broadcast('schemaFormValidate');
if (scope[workOnForm].$valid) {
generator.submit(scope, redirectTo);
scope.$broadcast('disposeModal');
} else {
scope.$broadcast('schemaFormValidate');
if (scope[workOnForm].$valid) {
generator.submit(scope, redirectTo);
scope.$broadcast('disposeModal');
} else {
// focus to first input with validation error
$timeout(function () {
var firsterror = angular.element(document.querySelectorAll('input.ng-invalid'))[0]
firsterror.focus();
});
}
// focus to first input with validation error
$timeout(function () {
var firsterror = angular.element(document.querySelectorAll('input.ng-invalid'))[0];
firsterror.focus();
});
}
}
}
};
// replace buttons according to their position values
$timeout(function () {
var selectorBottom = '.buttons-on-bottom' + workOnDiv;
//var selectorTop = '.buttons-on-top'+workOnDiv;
var buttonsToBottom = angular.element(document.querySelector('.' + buttonClass));
angular.element(document.querySelector(selectorBottom)).append(buttonsToBottom);
//var buttonsToTop = angular.element(document.querySelector('.' + buttonClass));
//angular.element(document.querySelector(selectorTop)).append(buttonsToTop);
buttonsToBottom.removeClass('hide');
//buttonsToTop.removeClass('hide');
}, 500);
}
// check if type is date and if type date found change it to string
if (v.type === 'date') {
$log.debug('date:', scope.model[k]);
scope.model[k] = generator.dateformatter(scope.model[k]);
scope.form[scope.form.indexOf(k)] = {
key: k, name: k, title: v.title,
type: 'template',
templateUrl: 'shared/templates/datefield.html',
validationMessage: {
'dateNotValid': "Girdiğiniz tarih geçerli değildir. <i>orn: '01.01.2015'<i/>",
302: 'Bu alan zorunludur.'
},
$asyncValidators: {
'dateNotValid': function (value) {
var deferred = $q.defer();
$timeout(function () {
scope.model[k] = angular.copy(generator.dateformatter(value));
if (scope.schema.required.indexOf(k) > -1) {
deferred.resolve();
}
if (value.constructor === Date) {
deferred.resolve();
}
else {
var dateValue = d = value.split('.');
if (isNaN(Date.parse(value)) || dateValue.length !== 3) {
deferred.reject();
} else {
deferred.resolve();
}
}
});
return deferred.promise;
}
},
status: {opened: false},
open: function ($event) {
this.status.opened = true;
},
format: 'dd.MM.yyyy',
onSelect: function () {
scope.model[k] = angular.copy(generator.dateformatter(scope.model[k]));
}
};
}
if (v.type === 'int' || v.type === 'float') {
v.type = 'number';
scope.model[k] = parseInt(scope.model[k]);
}
if (v.type === 'text_general') {
v.type = 'string';
v["x-schema-form"] = {
"type": "textarea"
//"placeholder": ""
}
}
// if type is model use foreignKey.html template to show them
if (v.type === 'model') {
var formitem = scope.form[scope.form.indexOf(k)];
var modelScope = {"url": v.wf, "wf": v.wf, "form_params": {model: v.model_name, cmd: v.list_cmd}};
};
// replace buttons according to their position values
$timeout(function () {
var selectorBottom = '.buttons-on-bottom' + workOnDiv;
//var selectorTop = '.buttons-on-top'+workOnDiv;
var buttonsToBottom = angular.element(document.querySelector('.' + buttonClass));
angular.element(document.querySelector(selectorBottom)).append(buttonsToBottom);
//var buttonsToTop = angular.element(document.querySelector('.' + buttonClass));
//angular.element(document.querySelector(selectorTop)).append(buttonsToTop);
buttonsToBottom.removeClass('hide');
//buttonsToTop.removeClass('hide');
}, 500);
};
var _numbers = function (scope, v, k) {
v.type = 'number';
scope.model[k] = parseInt(scope.model[k]);
};
var _node_default = function (scope, v, k) {
//scope.$on('refreshTitleMap', function (event, data) {
// todo: write a function to refresh titleMap after new item add to linkedModel
//});
scope[v.type] = scope[v.type] || {};
scope.generateTitleMap = function (modelScope) {
return generator.get_list(modelScope).then(function (res) {
formitem.titleMap = [];
angular.forEach(res.data.objects, function (item) {
if (item !== -1) {
formitem.titleMap.push({
"value": item.key,
"name": item.value
});
} else {
formitem.focusToInput = true;
}
});
// no pass by reference
scope[v.type][k] = angular.copy({
title: v.title,
form: [],
schema: {
properties: {},
required: [],
title: v.title,
type: "object",
formType: v.type,
model_name: k,
inline_edit: scope.inline_edit
},
url: scope.url,
wf: scope.wf,
nodeModelChange: function (item) {
//debugger;
}
return formitem.titleMap;
});
});
};
// get selected item from titleMap using model value
if (scope.model[k]) {
generator.get_list({
url: 'crud',
form_params: {model: v.model_name, object_id: scope.model[k], cmd: 'object_name'}
})
.then(function (data) {
try {
scope.$watch(document.querySelector('input[name=' + v.model_name + ']'),
function () {
document.querySelector('input[name=' + k + ']').value = data.data.object_name;
}
);
}
catch (e) {
document.querySelector('input[name=' + k + ']').value = data.data.object_name;
$log.debug('exception', e);
}
angular.forEach(v.schema, function (item) {
scope[v.type][k].schema.properties[item.name] = angular.copy(item);
});
// prepare required fields
if (item.required === true && item.name !== 'idx') {
scope[v.type][k].schema.required.push(angular.copy(item.name));
}
formitem = {
type: "template",
templateUrl: "shared/templates/foreignKey.html",
// formName will be used in modal return to save item on form
formName: k,
title: v.title,
wf: v.wf,
add_cmd: v.add_cmd,
name: k,
key: k,
model_name: v.model_name,
selected_item: {},
titleMap: [],
onSelect: function (item, inputname) {
scope.model[k] = item.value;
$timeout(function () {
document.querySelector('input[name=' + inputname + ']').value = item.name;
});
},
onDropdownSelect: function (item, inputname) {
scope.model[k] = item.value;
$timeout(function () {
document.querySelector('input[name=' + inputname + ']').value = item.name;
});
},
getTitleMap: function (viewValue) {
modelScope.form_params.query = viewValue;
return scope.generateTitleMap(modelScope);
},
getDropdownTitleMap: function () {
delete modelScope.form_params.query;
formitem.gettingTitleMap = true;
scope.generateTitleMap(modelScope)
.then(function (data) {
formitem.titleMap = data;
formitem.gettingTitleMap = false;
});
// idx field must be hidden
if (item.name !== 'idx') {
scope[v.type][k].form.push(item.name);
}
try {
if (item.type === 'date') {
scope.model[k][item.name] = generator.dateformatter(scope.model[k][item.name]);
}
};
} catch (e) {
$log.debug('Error: ', e.message);
}
scope.form[scope.form.indexOf(k)] = formitem;
}
if ((v.type === 'ListNode' || v.type === 'Node') && v.widget === 'filter_interface') {
var formitem = scope.form[scope.form.indexOf(k)];
var modelScope = {
"url": v.wf || scope.wf, "wf": v.wf || scope.wf,
"form_params": {model: v.model_name || v.schema[0].model_name, cmd: v.list_cmd || 'select_list', query: ''}
};
scope.generateTitleMap = function (modelScope) {
generator.get_list(modelScope).then(function (res) {
formitem.titleMap = [];
angular.forEach(res.data.objects, function (item) {
if (item !== "-1") {
formitem.titleMap.push({
"value": item.key,
"name": item.value
});
}
});
formitem.filteredItems = generator.get_diff_array(angular.copy(formitem.titleMap), angular.copy(formitem.selectedFilteredItems), 1);
})
};
var modelItems = [];
var modelKeys = [];
angular.forEach(scope.model[k], function (value, mkey) {
modelItems.push({
"value": value[v.schema[0].name].key,
"name": value[v.schema[0].name].unicode
});
var modelKey = {};
modelKey[v.schema[0].name] = value[v.schema[0].name].key;
modelKeys.push(modelKey);
});
scope.model[k] = angular.copy(modelKeys);
});
formitem = {
type: "template",
templateUrl: "shared/templates/multiselect.html",
title: v.title,
// formName will be used in modal return to save item on form
formName: k,
wf: v.wf,
add_cmd: v.add_cmd,
name: v.model_name,
model_name: v.model_name,
filterValue: '',
selected_item: {},
filteredItems: [],
selectedFilteredItems: modelItems,
titleMap: scope.generateTitleMap(modelScope),
appendFiltered: function (filterValue) {
if (filterValue.length > 2) {
formitem.filteredItems = [];
angular.forEach(formitem.titleMap, function (value, key) {
if (value.name.indexOf(filterValue) > -1) {
formitem.filteredItems.push(formitem.titleMap[key]);
$timeout(function () {
if (v.type === 'ListNode') {
scope[v.type][k].items = angular.copy(scope.model[k] || []);
angular.forEach(scope[v.type][k].items, function (value, key) {
if (value.constructor === Object) {
angular.forEach(value, function (x, y) {
try {
if (scope[v.type][k].schema.properties[y].type === 'date') {
scope[v.type][k].items[key][y] = generator.dateformatter(x);
scope[v.type][k].model[key][y] = generator.dateformatter(x);
}
if (scope[v.type][k].schema.properties[y].type === 'select') {
scope[v.type][k].items[key][y] = generator.item_from_array(x.toString(), scope[v.type][k].schema.properties[y].titleMap)
}
} catch (e) {
$log.debug('Field is not date');
}
});
}
if (filterValue <= 2) { formitem.filteredItems = formitem.titleMap}
formitem.filteredItems = generator.get_diff_array(formitem.filteredItems, formitem.selectedFilteredItems);
},
select: function (selectedItemsModel) {
if (!selectedItemsModel) {
return;
}
formitem.selectedFilteredItems = formitem.selectedFilteredItems.concat(selectedItemsModel);
formitem.appendFiltered(formitem.filterValue);
scope.model[k] = (scope.model[k] || []).concat(formitem.dataToModel(selectedItemsModel));
},
deselect: function (selectedFilteredItemsModel) {
if (!selectedFilteredItemsModel) {
return;
}
formitem.selectedFilteredItems = generator.get_diff_array(angular.copy(formitem.selectedFilteredItems), angular.copy(selectedFilteredItemsModel));
formitem.appendFiltered(formitem.filterValue);
formitem.filteredItems = formitem.filteredItems.concat(selectedFilteredItemsModel);
scope.model[k] = generator.get_diff_array(scope.model[k] || [], formitem.dataToModel(selectedFilteredItemsModel));
},
dataToModel: function (data) {
var dataValues = [];
angular.forEach(data, function (value, key) {
var dataKey = {};
dataKey[v.schema[0].name] = value.value;
dataValues.push(dataKey);
});
return dataValues;
}
};
scope.form[scope.form.indexOf(k)] = formitem;
});
}
});
if (scope.model[k]) {
angular.forEach(scope.model[k], function (value, key) {
angular.forEach(value, function (y, x) {
if (y.constructor === Object) {
scope.model[k][key][x] = y.key;
}
});
});
}
if ((v.type === 'ListNode' || v.type === 'Node') && v.widget !== 'filter_interface') {
scope.model[k] = scope.model[k] || [];
scope[v.type] = scope[v.type] || {};
scope[v.type][k].model = scope.model[k];
// no pass by reference
scope[v.type][k] = angular.copy({
title: v.title,
form: [],
schema: {
properties: {},
required: [],
title: v.title,
type: "object",
formType: v.type,
model_name: k,
inline_edit: scope.inline_edit
},
url: scope.url,
wf: scope.wf,
nodeModelChange: function (item) {
//debugger;
}
// lengthModels is length of the listnode models. if greater than 0 show records on template
scope[v.type][k]['lengthModels'] = scope.model[k] ? 1 : 0;
};
var _node_filter_interface = function (scope, v, k) {
var formitem = scope.form[scope.form.indexOf(k)];
var modelScope = {
"url": v.wf || scope.wf, "wf": v.wf || scope.wf,
"form_params": {
model: v.model_name || v.schema[0].model_name,
cmd: v.list_cmd || 'select_list',
query: ''
}
};
scope.generateTitleMap = function (modelScope) {
generator.get_list(modelScope).then(function (res) {
formitem.titleMap = [];
angular.forEach(res.data.objects, function (item) {
if (item !== "-1") {
formitem.titleMap.push({
"value": item.key,
"name": item.value
});
}
});
formitem.filteredItems = generator.get_diff_array(angular.copy(formitem.titleMap), angular.copy(formitem.selectedFilteredItems), 1);
})
};
var modelItems = [];
var modelKeys = [];
angular.forEach(scope.model[k], function (value, mkey) {
modelItems.push({
"value": value[v.schema[0].name].key,
"name": value[v.schema[0].name].unicode
});
angular.forEach(v.schema, function (item) {
scope[v.type][k].schema.properties[item.name] = angular.copy(item);
// prepare required fields
if (item.required === true && item.name !== 'idx') {
scope[v.type][k].schema.required.push(angular.copy(item.name));
var modelKey = {};
modelKey[v.schema[0].name] = value[v.schema[0].name].key;
modelKeys.push(modelKey);
});
scope.model[k] = angular.copy(modelKeys);
formitem = {
type: "template",
templateUrl: "shared/templates/multiselect.html",
title: v.title,
// formName will be used in modal return to save item on form
formName: k,
wf: v.wf,
add_cmd: v.add_cmd,
name: v.model_name,
model_name: v.model_name,
filterValue: '',
selected_item: {},
filteredItems: [],
selectedFilteredItems: modelItems,
titleMap: scope.generateTitleMap(modelScope),
appendFiltered: function (filterValue) {
if (filterValue.length > 2) {
formitem.filteredItems = [];
angular.forEach(formitem.titleMap, function (value, key) {
if (value.name.indexOf(filterValue) > -1) {
formitem.filteredItems.push(formitem.titleMap[key]);
}
});
}
// idx field must be hidden
if (item.name !== 'idx') {
scope[v.type][k].form.push(item.name);
if (filterValue <= 2) {
formitem.filteredItems = formitem.titleMap
}
try {
if (item.type === 'date') {
scope.model[k][item.name] = generator.dateformatter(scope.model[k][item.name]);
}
} catch (e) {
$log.debug('Error: ', e.message);
formitem.filteredItems = generator.get_diff_array(formitem.filteredItems, formitem.selectedFilteredItems);
},
select: function (selectedItemsModel) {
if (!selectedItemsModel) {
return;
}
formitem.selectedFilteredItems = formitem.selectedFilteredItems.concat(selectedItemsModel);
formitem.appendFiltered(formitem.filterValue);
scope.model[k] = (scope.model[k] || []).concat(formitem.dataToModel(selectedItemsModel));
},
deselect: function (selectedFilteredItemsModel) {
if (!selectedFilteredItemsModel) {
return;
}
formitem.selectedFilteredItems = generator.get_diff_array(angular.copy(formitem.selectedFilteredItems), angular.copy(selectedFilteredItemsModel));
formitem.appendFiltered(formitem.filterValue);
formitem.filteredItems = formitem.filteredItems.concat(selectedFilteredItemsModel);
scope.model[k] = generator.get_diff_array(scope.model[k] || [], formitem.dataToModel(selectedFilteredItemsModel));
},
dataToModel: function (data) {
var dataValues = [];
angular.forEach(data, function (value, key) {
var dataKey = {};
dataKey[v.schema[0].name] = value.value;
dataValues.push(dataKey);
});
return dataValues;
}
};
scope.form[scope.form.indexOf(k)] = formitem;
});
$timeout(function () {
if (v.type === 'ListNode') {
scope[v.type][k].items = angular.copy(scope.model[k] || []);
angular.forEach(scope[v.type][k].items, function (value, key) {
if (value.constructor === Object) {
angular.forEach(value, function (x, y) {
try {
if (scope[v.type][k].schema.properties[y].type === 'date') {
scope[v.type][k].items[key][y] = generator.dateformatter(x);
scope[v.type][k].model[key][y] = generator.dateformatter(x);
}
if (scope[v.type][k].schema.properties[y].type === 'select') {
scope[v.type][k].items[key][y] = generator.item_from_array(x.toString(), scope[v.type][k].schema.properties[y].titleMap)
};
// generate_fields covers all field types as functions
var generate_fields = {
button: {default: _buttons},
submit: {default: _buttons},
file: {default: function (scope, v, k) {
scope.form[scope.form.indexOf(k)] = {
type: "template",
title: v.title,
templateUrl: "shared/templates/filefield.html",
name: k,
key: k,
fileInsert: function () {
$scope.$broadcast('schemaForm.error.' + k, 'tv4-302', true);
},
imageSrc: scope.model[k] ? $rootScope.settings.static_url + scope.model[k] : '',
avatar: k === 'avatar'
};
v.type = 'string';
}},
select: {default: function (scope, v, k) {
scope.form[scope.form.indexOf(k)] = {
type: "template",
title: v.title,
templateUrl: "shared/templates/select.html",
name: k,
key: k,
titleMap: v.titleMap
};
}},
date: {default: function (scope, v, k) {
$log.debug('date:', scope.model[k]);
scope.model[k] = generator.dateformatter(scope.model[k]);
scope.form[scope.form.indexOf(k)] = {
key: k, name: k, title: v.title,
type: 'template',
templateUrl: 'shared/templates/datefield.html',
validationMessage: {
'dateNotValid': "Girdiğiniz tarih geçerli değildir. <i>orn: '01.01.2015'<i/>",
302: 'Bu alan zorunludur.'
},
$asyncValidators: {
'dateNotValid': function (value) {
var deferred = $q.defer();
$timeout(function () {
scope.model[k] = angular.copy(generator.dateformatter(value));
if (scope.schema.required.indexOf(k) > -1) {
deferred.resolve();
}
if (value.constructor === Date) {
deferred.resolve();
}
else {
var dateValue = d = value.split('.');
if (isNaN(Date.parse(value)) || dateValue.length !== 3) {
deferred.reject();
} else {
deferred.resolve();
}
} catch (e) {
$log.debug('Field is not date');
}
});
return deferred.promise;
}
},
status: {opened: false},
open: function ($event) {
this.status.opened = true;
},
format: 'dd.MM.yyyy',
onSelect: function () {
scope.model[k] = angular.copy(generator.dateformatter(scope.model[k]));
}
};
}},
int: {default: _numbers},
boolean: {default: function () {}},
string: {default: function () {}},
float: {default: _numbers},
model: {default: function (scope, v, k) {
var formitem = scope.form[scope.form.indexOf(k)];
var modelScope = {
"url": v.wf,
"wf": v.wf,
"form_params": {model: v.model_name, cmd: v.list_cmd}
};
//scope.$on('refreshTitleMap', function (event, data) {
// todo: write a function to refresh titleMap after new item add to linkedModel
//});
scope.generateTitleMap = function (modelScope) {
return generator.get_list(modelScope).then(function (res) {
formitem.titleMap = [];
angular.forEach(res.data.objects, function (item) {
if (item !== -1) {
formitem.titleMap.push({
"value": item.key,
"name": item.value
});
} else {
formitem.focusToInput = true;
}
});
return formitem.titleMap;
});
};
// get selected item from titleMap using model value
if (scope.model[k]) {
generator.get_list({
url: 'crud',
form_params: {model: v.model_name, object_id: scope.model[k], cmd: 'object_name'}
})
.then(function (data) {
try {
scope.$watch(document.querySelector('input[name=' + v.model_name + ']'),
function () {
document.querySelector('input[name=' + k + ']').value = data.data.object_name;
}
);
}
catch (e) {
document.querySelector('input[name=' + k + ']').value = data.data.object_name;
$log.debug('exception', e);
}
});
}
});
if (scope.model[k]) {
angular.forEach(scope.model[k], function (value, key) {
angular.forEach(value, function (y, x) {
if (y.constructor === Object) {
scope.model[k][key][x] = y.key;
}
});
});
}
formitem = {
type: "template",
templateUrl: "shared/templates/foreignKey.html",
// formName will be used in modal return to save item on form
formName: k,
title: v.title,
wf: v.wf,
add_cmd: v.add_cmd,
name: k,
key: k,
model_name: v.model_name,
selected_item: {},
titleMap: [],
onSelect: function (item, inputname) {
scope.model[k] = item.value;
$timeout(function () {
document.querySelector('input[name=' + inputname + ']').value = item.name;
});
},
onDropdownSelect: function (item, inputname) {
scope.model[k] = item.value;
$timeout(function () {
document.querySelector('input[name=' + inputname + ']').value = item.name;
});
},
getTitleMap: function (viewValue) {
modelScope.form_params.query = viewValue;
return scope.generateTitleMap(modelScope);
},
getDropdownTitleMap: function () {
delete modelScope.form_params.query;
formitem.gettingTitleMap = true;
scope.generateTitleMap(modelScope)
.then(function (data) {
formitem.titleMap = data;
formitem.gettingTitleMap = false;
});
}
};
scope.model[k] = scope.model[k] || [];
scope.form[scope.form.indexOf(k)] = formitem;
}},
Node: {
default: _node_default,
filter_interface: _node_filter_interface
},
ListNode: {
default: _node_default,
filter_interface: _node_filter_interface
}
};
scope[v.type][k].model = scope.model[k];
angular.forEach(scope.schema.properties, function (v, k) {
// lengthModels is length of the listnode models. if greater than 0 show records on template
scope[v.type][k]['lengthModels'] = scope.model[k] ? 1 : 0;
// generically change _id fields model value
if ('form_params' in scope) {
if (k == scope.form_params.param) {
scope.model[k] = scope.form_params.id;
scope.form.splice(scope.form.indexOf(k), 1);
return;
}
}
try {
generate_fields[v.type][v.widget || 'default'](scope, v, k);
}
catch (e) {
console.log(v.type)
}
});
......@@ -1038,7 +1055,9 @@ angular.module('ulakbus.formService', ['ui.bootstrap'])
if (value && value.constructor === Date) {
model[key] = generator.dateformatter(value);
}
if (value && value.constructor === Object) {convertDate(value);}
if (value && value.constructor === Object) {
convertDate(value);
}
});
};
......@@ -1196,7 +1215,7 @@ angular.module('ulakbus.formService', ['ui.bootstrap'])
Generator.generate(newscope, {forms: scope.node});
// modal will add only one item to listNode, so just need one model (not array)
newscope.model = newscope.model[node.edit] || {};
newscope.model = newscope.model[node.edit] || {};
return newscope;
}
}
......
......@@ -61,9 +61,9 @@ module.exports = function (config) {
plugins: [
'karma-phantomjs-launcher',
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-safari-launcher',
//'karma-chrome-launcher',
//'karma-firefox-launcher',
//'karma-safari-launcher',
'karma-jasmine',
'karma-junit-reporter',
'karma-coverage'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment