Commit d9596de4 authored by Evren Kutar's avatar Evren Kutar

listnode implementation to new data structure

parent af63f0f7
...@@ -33,8 +33,6 @@ crud.controller('CRUDAddEditCtrl', function ($scope, $rootScope, $location, $htt ...@@ -33,8 +33,6 @@ crud.controller('CRUDAddEditCtrl', function ($scope, $rootScope, $location, $htt
$scope.onSubmit = function (form) { $scope.onSubmit = function (form) {
$scope.$broadcast('schemaFormValidate'); $scope.$broadcast('schemaFormValidate');
debugger;
if (form.$valid) { if (form.$valid) {
Generator.submit($scope) Generator.submit($scope)
.success(function(data){ .success(function(data){
......
...@@ -58,6 +58,7 @@ app.directive('headerBreadcrumb', function ($location) { ...@@ -58,6 +58,7 @@ app.directive('headerBreadcrumb', function ($location) {
link: function($scope){ link: function($scope){
$scope.$watch('$routeUpdate', function(){ $scope.$watch('$routeUpdate', function(){
// todo: create actual links // todo: create actual links
//debugger;
$scope.links = $location.path().split('/'); $scope.links = $location.path().split('/');
}); });
} }
......
<h1>{{ schema.title }}</h1> <h1>{{ schema.title }}</h1>
<form id="formgenerated" name="formgenerated" sf-schema="schema" sf-form="form" sf-model="model"></form> <form id="formgenerated" name="formgenerated" sf-schema="schema" sf-form="form" sf-model="model"></form>
<div ng-repeat="node in nodes"> <div ng-repeat="node in Node">
<h3>{{ node.title }} <h3>{{ node.title }}
<span ng-if="node.lengthModels < 1"> <span ng-if="node.lengthModels < 1">
<a href="javascript:void(0);" add-modal-for-node={{node.title}}> <a href="javascript:void(0);" modal-for-nodes="{{node.title}},Node">
<i class="fa fa-plus-circle fa-fw"></i> <i class="fa fa-plus-circle fa-fw"></i>
</a> </a>
</span> </span>
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
<ng-include src="'shared/templates/nodeTable.html'" ng-if="node.lengthModels > 0"></ng-include> <ng-include src="'shared/templates/nodeTable.html'" ng-if="node.lengthModels > 0"></ng-include>
<hr> <hr>
</div> </div>
<div ng-repeat="node in listnodes"> <div ng-repeat="node in ListNode">
<h3>{{ node.title }} <h3>{{ node.title }}
<span> <span>
<a href="javascript:void(0);" add-modal-for-list-node={{node.title}}> <a href="javascript:void(0);" modal-for-nodes="{{node.title}},ListNode">
<i class="fa fa-plus-circle fa-fw"></i> <i class="fa fa-plus-circle fa-fw"></i>
</a> </a>
</span> </span>
......
<ul class="breadcrumb">
<li ng-repeat="link in links" ng-class="{'active':$last}">
<a href="#" ng-if="!$last">{{link}}</a>
<span ng-if="$last">{{link}}</span>
</li>
</ul>
\ No newline at end of file
...@@ -194,13 +194,12 @@ ...@@ -194,13 +194,12 @@
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i> <i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
</a> </a>
<ul class="dropdown-menu dropdown-user"> <ul class="dropdown-menu dropdown-user">
<li><a href="#"><i class="fa fa-user fa-fw"></i> User Profile</a> <li><a href="#"><i class="fa fa-user fa-fw"></i> Profil</a>
</li> </li>
<li><a href="#"><i class="fa fa-gear fa-fw"></i> Settings</a> <li><a href="#"><i class="fa fa-gear fa-fw"></i> Ayarlar</a>
</li> </li>
<li><a href="http://www.strapui.com/"><i class="fa fa-eye fa-fw"></i> Premium Angular Themes</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a ui-sref="login" href="javascript:void(0);" logout><i class="fa fa-sign-out fa-fw"></i> Logout</a> <li><a ui-sref="login" href="javascript:void(0);" logout><i class="fa fa-sign-out fa-fw"></i> Çıkış</a>
</li> </li>
</ul> </ul>
<!-- /.dropdown-user --> <!-- /.dropdown-user -->
......
...@@ -7,27 +7,40 @@ ...@@ -7,27 +7,40 @@
var form_generator = angular.module('formService', ['general']); var form_generator = angular.module('formService', ['general']);
form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, RESTURL, FormDiff) { form_generator.factory('Generator', function ($http, $q, $log, $location, $modal, $timeout, RESTURL, FormDiff) {
var generator = {}; var generator = {};
generator.makeUrl = function (url) { generator.makeUrl = function (url) {
return RESTURL.url + url; return RESTURL.url + url;
}; };
generator.generate = function (scope, forms) { generator.generate = function (scope, data) {
// if no form in response (in case of list and single item request) return scope // if no form in response (in case of list and single item request) return scope
if (!forms) { if (!data.forms) { return scope; }
return scope;
}
for (var key in forms)
scope[key] = forms[key];
// initialModel will be used in formDiff when submiting the form to submit only // prepare scope form, schema and model from response object
angular.forEach(data.forms, function (value, key) {
scope[key] = data.forms[key];
});
scope.token = data.token;
// initialModel will be used in formDiff when submiting the form to submit only
scope.initialModel = angular.copy(scope.model); scope.initialModel = angular.copy(scope.model);
// if fieldset in form, make it collapsable with template // if fieldset in form, make it collapsable with template
//scope.listnodeform = {}; //scope.listnodeform = {};
//scope.isCollapsed = true;
generator.prepareFormItems(scope);
scope.object_id = scope.form_params['object_id'];
return generator.group(scope);
};
generator.group = function (formObject) {
return formObject;
};
generator.prepareFormItems = function(scope) {
angular.forEach(scope.schema.properties, function (k, v) { angular.forEach(scope.schema.properties, function (k, v) {
// check if type is date and if type date found change it to string // check if type is date and if type date found change it to string
...@@ -43,7 +56,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -43,7 +56,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
} }
if (k.type == 'int') { if (k.type == 'int') {
k.type = 'number' k.type = 'number';
} }
// if type is model use foreignKey.html template to show them // if type is model use foreignKey.html template to show them
...@@ -76,41 +89,42 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -76,41 +89,42 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
scope.form[scope.form.indexOf(v)] = formitem; scope.form[scope.form.indexOf(v)] = formitem;
} }
if (k.type == 'ListNode') { if (k.type == 'ListNode' || k.type == 'Node') {
// if listnode remove from form to generate its own form
//scope.form.splice([scope.form.indexOf(v)], 1); scope[k.type] = scope[k.type] ? scope[k.type] : {};
scope.listnodes = scope.listnodes ? scope.listnodes : {};
console.log(k, '<=====>', scope.model[k.title]); scope[k.type][k.title] = {
//debugger; title: k.title,
scope.listnodes[k.title] = (k); form: [],
scope.listnodes[k.title]['fields'] = scope.model[k.title][0].fields; schema: {properties: {}, required: [], title: k.title, type: "object"},
scope.listnodes[k.title]['models'] = scope.model[k.title][0].models; model: {}
// lengthModels is length of the listnode models. if greater than 0 show records on template };
scope.listnodes[k.title]['lengthModels'] = scope.listnodes[k.title]['models'].length;
angular.forEach(k.schema , function (item) {
scope[k.type][k.title].schema.properties[item.name] = item;
scope[k.type][k.title].model[item.name] = item.value;
// prepare required fields
if (item.required == true) {
scope[k.type][k.title].schema.required.push(item.name);
} }
if (k.type == 'Node') { // idx field must be hidden
//scope.form.splice([scope.form.indexOf(v)], 1); if (item.name == 'idx') {
scope.nodes = scope.nodes ? scope.nodes : {}; scope[k.type][k.title].form.push({type: 'string', key: item.name, htmlClass: 'hidden'});
scope.nodes[k.title] = (k); } else {
scope.nodes[k.title]['fields'] = scope.model[k.title][0].fields; scope[k.type][k.title].form.push(item.name);
scope.nodes[k.title]['models'] = scope.model[k.title][0].models;
// lengthModels is length of the node models. if greater than 0 show records on template
scope.nodes[k.title]['lengthModels'] = scope.nodes[k.title]['models'].length;
// todo: learn what node model will be?
//scope.model[k.title] = [];
} }
}); });
scope.isCollapsed = true; // lengthModels is length of the listnode models. if greater than 0 show records on template
scope[k.type][k.title]['lengthModels'] = scope.model[k.title] ? 1 : 0;
}
scope.object_id = scope.form_params['object_id']; });
return generator.group(scope); return scope;
};
generator.group = function (formObject) {
return formObject;
}; };
generator.dateformatter = function (formObject) { generator.dateformatter = function (formObject) {
//angular.forEach(formObject.objects, function(k, v) { //angular.forEach(formObject.objects, function(k, v) {
...@@ -123,7 +137,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -123,7 +137,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
return $http return $http
.post(generator.makeUrl(scope.url), scope.form_params) .post(generator.makeUrl(scope.url), scope.form_params)
.then(function (res) { .then(function (res) {
return generator.generate(scope, res.data.forms); return generator.generate(scope, res.data);
// todo: cover all other exceptions (4xx, 5xx) // todo: cover all other exceptions (4xx, 5xx)
}); });
}; };
...@@ -164,6 +178,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -164,6 +178,7 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
}; };
generator.submit = function ($scope) { generator.submit = function ($scope) {
// todo: diff for all submits to recognize form change. if no change returns to view with no submit // todo: diff for all submits to recognize form change. if no change returns to view with no submit
data = { data = {
"form": $scope.model, "form": $scope.model,
"cmd": $scope.form_params.cmd, "cmd": $scope.form_params.cmd,
...@@ -173,12 +188,17 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -173,12 +188,17 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
}; };
if ($scope.object_id) { if ($scope.object_id) {
var get_diff = FormDiff.get_diff($scope.model, $scope.initialModel); var get_diff = FormDiff.get_diff($scope.model, $scope.initialModel);
var data = { data.object_id = $scope.object_id;
"object_id": $scope.object_id, data.form = get_diff;
"form": get_diff
};
} }
return $http.post(generator.makeUrl($scope.url), data); debugger;
$http.post(generator.makeUrl($scope.url), data)
.success()
.then(function(res){
if(res.data.client_cmd){
$location.path(data.model);
}
});
}; };
return generator; return generator;
}); });
...@@ -190,123 +210,34 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout, ...@@ -190,123 +210,34 @@ form_generator.factory('Generator', function ($http, $q, $log, $modal, $timeout,
* @returns: returns value for modal * @returns: returns value for modal
*/ */
form_generator.controller('ModalCtrl', function ($scope, $modalInstance, $route, items) { form_generator.controller('ModalCtrl', function ($scope, $modalInstance, Generator, $route, items) {
angular.forEach(["model", "schema", "form"], function (key) { angular.forEach(["model", "schema", "form"], function (key) {
$scope[key] = items[key]; $scope[key] = items[key];
}); });
$scope.onSubmit = function () {
Generator.prepareFormItems($scope);
$scope.onSubmit = function (form) {
$scope.$broadcast('schemaFormValidate');
console.log(form.$valid);
if(form.$valid){
// send form to modalinstance result function // send form to modalinstance result function
debugger;
$modalInstance.close($scope); $modalInstance.close($scope);
}
}; };
$scope.cancel = function () { $scope.cancel = function () {
$modalInstance.dismiss('cancel'); $modalInstance.dismiss('cancel');
}; };
}); });
/**
* add modal directive for listnodes
* @params: $modal, Generator
* @return: openmodal directive
*/
form_generator.directive('addModalForListNode', function ($modal, Generator) {
return {
link: function (scope, element, attributes) {
element.on('click', function () {
var modalInstance = $modal.open({
animation: false,
templateUrl: 'shared/templates/listnodeModalContent.html',
controller: 'ModalCtrl',
size: 'lg',
resolve: {
items: function () {
// get node from parent scope catch with attribute
var node = scope.$parent.$parent.listnodes[attributes['addModalForListNode']];
var items = {form: [], schema: {properties: {}, title: node.title, type: "object"}, model: {}};
angular.forEach(node.fields, function (item) {
debugger;
items.schema.properties[item.name] = item;
items.model[item.name] = item.value;
// idx field must be hidden
if (item.name != 'idx') {
items.form.push({type: item.type, key: item.name});
} else {
items.form.push({type: item.type, key: item.name, htmlClass: 'hidden'});
}
});
return Generator.generate(scope, items);
}
}
});
modalInstance.result.then(function (childmodel, key) {
// subfix will be remove
//var subfix = scope.schema.title.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
// todo: run form validator here
debugger;
scope.$parent.model[scope.schema.title].push(scope.model);
});
});
}
}
});
/**
* edit modal directive for listnodes
* @params: $modal, Generator
* @return: openmodal directive
*/
// todo: edit modal make work properly
form_generator.directive('editModalForListNode', function ($modal, Generator) {
return {
link: function (scope, element, attributes) {
element.on('click', function () {
var modalInstance = $modal.open({
animation: false,
templateUrl: 'shared/templates/listnodeModalContent.html',
controller: 'ModalCtrl',
size: 'lg',
resolve: {
items: function () {
// get node from parent scope catch with attribute
var node = angular.copy(scope.$parent.$parent.listnodes[attributes['addModalForListNode']]);
var items = {form: [], schema: {properties: {}, title: node.title, type: "object"}, model: {}};
angular.forEach(node.fields, function (item) {
items.schema.properties[item.name] = item;
items.model[item.name] = item.value;
// idx field must be hidden
if (item.name != 'idx') {
items.form.push({type: item.type, key: item.name});
} else {
items.form.push({type: item.type, key: item.name, htmlClass: 'hidden'});
}
});
return Generator.generate(scope, items);
}
}
});
modalInstance.result.then(function (childmodel, key) {
// subfix will be remove
//var subfix = scope.schema.title.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
// todo: run form validator here
debugger;
scope.$parent.model[scope.schema.title].push(scope.model);
});
});
}
}
});
/** /**
* add modal directive for nodes * add modal directive for nodes
* @params: $modal, Generator * @params: $modal
* @return: openmodal directive * @return: openmodal directive
*/ */
form_generator.directive('addModalForNode', function ($modal, Generator) { form_generator.directive('modalForNodes', function ($modal) {
return { return {
link: function (scope, element, attributes) { link: function (scope, element, attributes) {
element.on('click', function () { element.on('click', function () {
...@@ -317,84 +248,26 @@ form_generator.directive('addModalForNode', function ($modal, Generator) { ...@@ -317,84 +248,26 @@ form_generator.directive('addModalForNode', function ($modal, Generator) {
size: 'lg', size: 'lg',
resolve: { resolve: {
items: function () { items: function () {
var attribs = attributes['modalForNodes'].split(',');
// get node from parent scope catch with attribute // get node from parent scope catch with attribute
var node = angular.copy(scope.$parent.$parent.nodes[attributes['addModalForNode']]); var node = angular.copy(scope.$parent.$parent[attribs[1]][attribs[0]]);
var items = {form: [], schema: {properties: {}, title: node.title, type: "object"}, model: {}}; return node;
angular.forEach(node.fields, function (item) {
items.schema.properties[item.name] = item;
items.model[item.name] = item.value;
// idx field must be hidden
if (item.name != 'idx') {
items.form.push({type: item.type, key: item.name});
} else {
items.form.push({type: item.type, key: item.name, htmlClass: 'hidden'});
}
});
return Generator.generate(scope, items);
} }
} }
}); });
modalInstance.result.then(function (childmodel, key) { modalInstance.result.then(function (childmodel, key) {
// subfix will be remove // subfix will be removed
//var subfix = scope.schema.title.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase(); //var subfix = scope.schema.title.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
// todo: run form validator here // todo: run form validator here
debugger; scope.$parent.model[childmodel.schema.title] = childmodel.model;
scope.$parent.model[scope.schema.title].push(scope.model); console.log(scope.$parent.model);
}); });
}); });
} }
} }
}); });
/**
* edit modal directive for nodes
* @params: $modal, Generator
* @return: openmodal directive
*/
// todo: edit modal make work properly
form_generator.directive('editModalForNode', function ($modal, Generator) {
return {
link: function (scope, element, attributes) {
element.on('click', function () {
var modalInstance = $modal.open({
animation: false,
templateUrl: 'shared/templates/listnodeModalContent.html',
controller: 'ModalCtrl',
size: 'lg',
resolve: {
items: function () {
// get node from parent scope catch with attribute
var node = angular.copy(scope.$parent.$parent.nodes[attributes['addModalForNode']]);
var items = {form: [], schema: {properties: {}, title: node.title, type: "object"}, model: {}};
angular.forEach(node.fields, function (item) {
items.schema.properties[item.name] = item;
items.model[item.name] = item.value;
// idx field must be hidden
if (item.name != 'idx') {
items.form.push({type: item.type, key: item.name});
} else {
items.form.push({type: item.type, key: item.name, htmlClass: 'hidden'});
}
});
return Generator.generate(scope, items);
}
}
});
modalInstance.result.then(function (childmodel, key) {
// subfix will be remove
//var subfix = scope.schema.title.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
// todo: run form validator here
debugger;
scope.$parent.model[scope.schema.title].push(scope.model);
});
});
}
}
});
/** /**
* add modal directive for linked models * add modal directive for linked models
......
...@@ -31,8 +31,9 @@ app.config(['$httpProvider', function ($httpProvider) { ...@@ -31,8 +31,9 @@ app.config(['$httpProvider', function ($httpProvider) {
$location.path("/dashboard"); $location.path("/dashboard");
} }
} }
if(response.data.screen) { if(response.data.client_cmd) {
$location.path(response.data.screen); //$location.path(response.data.screen);
console.log(response.data.client_cmd);
} }
return response; return response;
}, },
......
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