zettapi_client
Version:
Client side CRUD operations in angular to use with zettapi_server rest api to get started quickly in any CMS project
309 lines (263 loc) • 8.91 kB
JavaScript
app.controller('entityCtrl', function ($entity, zapi, ErrorSvc, $page, mySocket, $window, $routeParams, $controller, $location, $scope, $uibModal, blockUI, inform, $route, NgTableParams, $translate) {
//set scope variables
$scope.table = { params: null };
$scope.console = null;
$scope.entities = zapi.entityMap;
$scope.entityName = $routeParams.entity;
$scope.lookup = {};
$scope.items = [];
$scope.item = {};
$scope.newFile = {};
//set scope functions
$scope.add = function (item, beforeAdd, callback) {
$translate('api.entity.sendData').then(function(text){
blockUI.start(text);
});
var next = typeof beforeAdd === 'function' ? beforeAdd : skip;
next(function (err) {
if (err) return inform.add(err, { ttl: 2000, type: 'danger' });
$entity.add($routeParams.entity, item).then(function (response) {
$translate([$scope.entity.title,'api.entity.newRecordSuccess','api.entity.editRecordSuccess']).then(function (translations) {
if (item._id) inform.add(translations[$scope.entity.title] + translations['api.entity.newRecordSuccess'], { ttl: 2000, type: 'info' });
else inform.add(translations[$scope.entity.title] + translations['api.entity.editRecordSuccess'], { ttl: 2000, type: 'info' });
});
if (typeof callback === 'function') callback();
}).catch(function (response) {
inform.add(response.data, { ttl: 2000, type: 'danger' });
if (typeof callback === 'function') callback(response.data);
}).finally(function () {
blockUI.stop();
});
});
};
$scope.remove = function (item) {
$translate('api.entity.checkRemove').then(function(text){
blockUI.start(text);
});
$entity.remove($routeParams.entity, item).then(function (response) {
$translate([$scope.entity.title,'api.entity.deleteRecordSuccess']).then(function (translations) {
inform.add(translations[$scope.entity.title] + translations['api.entity.deleteRecordSuccess'], { ttl: 2000, type: 'info' });
});
}).catch(function (response) {
inform.add(response.error ? response.error : response.data, { ttl: 2000, type: 'danger' });
}).finally(function () {
blockUI.stop();
});
};
$scope.openEdit = function (item) {
if (!$scope.entity.modal) {
var url = $location.path();
url = url.substring(0, url.lastIndexOf('/')) + '/edit';
if (item) {
return $location.path(url + '/' + item._id);
} else {
return $location.path(url);
}
}
setEdit(item);
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'client/entity/entity.modal.html',
controller: 'entityModalCtrl',
size: 'lg',
backdrop: 'static',
scope: $scope
});
modalInstance.result.then(function (newItem) {
//item added
}, function () {
$translate('api.entity.cancelRecord').then(function (text) {
inform.add(text, { ttl: 2000, type: 'info' });
});
$scope.item = {};
});
};
$scope.validate = function () {
if (typeof $scope.getError === 'function') {
var response = $scope.getError($scope.item, $scope.items);
if (response.disabled) {
$scope.console = response.tooltip;
return true;
}
}
$scope.console = null;
return false;
};
$scope.unflattenArray = $entity.unflattenArray;
$scope.flattenArray = $entity.flattenArray;
$scope.applySearch = function (search) {
var criteria = angular.copy(search.text);
if (search.inverted) {
criteria = "!" + criteria;
}
$scope.table.params.filter({ $: criteria });
};
//set private methods
function get(entity, id, callback) {
$translate('api.entity.getData').then(function(text){
blockUI.start(text);
});
getLookups($scope.lookup, function (err, lookups) {
if (err) {
$translate('api.entity.errorData').then(function (text) {
inform.add(text, { ttl: 2000, type: 'danger' });
});
blockUI.stop();
return callback(err);
}
$scope.lookup = lookups;
//if user is creating a new record
if (!$routeParams.id && $routeParams.action === 'edit') {
blockUI.stop();
return callback();
}
$entity.get(entity, id).then(function (response) {
if (id) {
$scope.item = response.data;
} else {
$scope.items = response.data;
$scope.table.params = new NgTableParams({}, { dataset: $scope.items });
}
}).catch(function (response) {
$translate('api.entity.errorData').then(function (text) {
inform.add(text, { ttl: 2000, type: 'danger' });
});
}).finally(function () {
blockUI.stop();
callback();
});
});
}
function getLookups(lookup, callback) {
if (lookup) {
if (lookup.length) return callback(null, lookup);
}
$entity.getLookups($routeParams.entity, function (err, data) {
if (err) return callback(err);
callback(null, data);
});
}
function setEdit(item) {
if (item) {
$scope.item = angular.copy(item);
} else {
$scope.item = typeof $scope.blank === 'function' ? $scope.blank() : {};
}
}
function loadFinished() {
//inject child controller
try {
$controller($routeParams.entity + 'Ctrl', { $scope: $scope });
} catch (err) {
console.log(err);
}
var websocket;
if (typeof zapi.entityMap[$routeParams.entity].websocket === 'undefined') {
websocket = $routeParams.entity;
} else {
websocket = eval(zapi.entityMap[$routeParams.entity].websocket) + "." + $routeParams.entity;
}
mySocket.on(websocket + '.remove', onThisEntityRemove);
mySocket.on(websocket + '.new', onThisEntityAdd);
mySocket.on(websocket + '.edit', onThisEntityEdit);
}
function onThisEntityAdd(data) {
switch ($routeParams.action) {
case 'list':
$scope.items.unshift(data);
$scope.table.params.reload();
break;
}
//todo update lookup
}
function onThisEntityEdit(data) {
switch ($routeParams.action) {
case 'list':
for (var i = 0; i < $scope.items.length; i++) {
if ($scope.items[i]._id === data._id) {
$scope.items[i] = data;
$scope.table.params.reload();
break;
}
}
break;
case 'view':
case 'edit':
if ($scope.item._id === data._id) {
$scope.item = data;
$scope.table.params.reload();
}
break;
}
//todo update lookup
}
function onThisEntityRemove(data) {
switch ($routeParams.action) {
case 'list':
for (var i = 0; i < $scope.items.length; i++) {
if ($scope.items[i]._id === data) {
$scope.items.splice(i, 1);
$scope.table.params.reload();
break;
}
}
break;
case 'view':
case 'edit':
if ($scope.item._id === data._id) {
$location.path('/' + $routeParams.entity + '/list');
}
break;
}
//todo update lookup
}
//initialization
function initialize(callback) {
$translate('api.entity.whereyougo').then(function (text) {
$page.setTitle(text);
});
$scope.entity = zapi.entityMap[$routeParams.entity];
if (!$scope.entity) {
return;
}
switch ($routeParams.action) {
case 'edit':
if (!$routeParams.id) {
$translate([$scope.entity.title, 'api.entity.newRecord']).then(function (translations) {
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.newRecord']);
});
get($routeParams.entity, null, callback);
} else {
$translate([$scope.entity.title, 'api.entity.editRecord']).then(function (translations) {
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.editRecord']);
});
get($routeParams.entity, $routeParams.id, callback);
}
break;
case 'view':
if (!$routeParams.id) {
return;
}
$translate([$scope.entity.title, 'api.entity.viewRecord']).then(function (translations) {
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.viewRecord']);
});
get($routeParams.entity, $routeParams.id, callback);
break;
case 'list':
if ($routeParams.id) {
return;
}
$translate($scope.entity.title).then(function (title) {
$page.setTitle(title);
});
get($routeParams.entity, null, callback);
break;
default:
return;
}
}
function skip(callback) {
callback();
}
initialize(loadFinished);
});