zettapi_client
Version:
Client side CRUD operations in angular to use with zettapi_server rest api to get started quickly in any CMS project
298 lines (255 loc) • 10.7 kB
JavaScript
app.controller('entityCtrl', function($entity, zapi, $page, mySocket, $routeParams, $controller, $location, $scope, $uibModal, blockUI, NgTableParams, $translate, $license) {
//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 = {};
//scope functions
$scope.add = function(item, beforeAdd, callback) {
$translate(['api.entity.sendData', $scope.entity.title, 'api.entity.newRecordSuccess', 'api.entity.editRecordSuccess']).then(function(translations) {
blockUI.start(translations['api.entity.sendData']);
var next = typeof beforeAdd === 'function' ? beforeAdd : skip;
next(function(err) {
if (err) return swal("Antes de guardar", err, "info");
$entity.add($routeParams.entity, item).then(function(response) {
if (item._id) swal("Alterado", translations[$scope.entity.title] + translations['api.entity.newRecordSuccess'], "success");
else swal("Criado", translations[$scope.entity.title] + translations['api.entity.editRecordSuccess'], "success");
if (typeof callback === 'function') callback();
}).catch(function(response) {
swal("Erro ao Guardar", response.data, "error");
if (typeof callback === 'function') callback(response.data);
}).finally(function() {
blockUI.stop();
});
});
});
};
$scope.remove = function(item) {
$translate(['api.entity.checkRemove', $scope.entity.title, 'api.entity.deleteRecordSuccess']).then(function(translations) {
blockUI.start(translations['api.entity.checkRemove']);
$entity.remove($routeParams.entity, item).then(function(response) {
swal("Removido", translations[$scope.entity.title] + translations['api.entity.deleteRecordSuccess'], "success");
}).catch(function(response) {
swal("Erro ao Remover", response.error ? response.error : response.data, "warning");
}).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: '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) {
//todo
console.log(text);
});
$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.flattenArray = $entity.flattenArray;
$scope.applySearch = function(search) {
var criteria = angular.copy(search.text);
if (search.inverted) {
criteria = "!" + criteria;
}
$scope.table.params.filter({ $: criteria });
};
//main
initialize(loadFinished);
//private functions
function get(entity, id, callback) {
$translate(['api.entity.getData', 'api.entity.errorData']).then(function(translations) {
blockUI.start(translations['api.entity.getData']);
getLookups($scope.lookup, function(err, lookups) {
if (err) {
swal("Não foi possível obter os dados", translations['api.entity.errorData'], 'warning');
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) {
swal("Não foi possível obter os dados", translations['api.entity.errorData'], 'warning');
}).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() {
//ignore if notfound
if (!$routeParams.entity) return;
//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) {
console.log('io.on', 'add', data);
switch ($routeParams.action) {
case 'list':
$scope.items.unshift(data);
$scope.table.params.total($scope.items.length);
$scope.table.params.reload();
break;
}
//todo update lookup
}
function onThisEntityEdit(data) {
console.log('io.on', 'edit', 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;
}
break;
}
//todo update lookup
}
function onThisEntityRemove(data) {
console.log('io.on', 'remove', 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.total($scope.items.length);
$scope.table.params.reload();
break;
}
}
break;
case 'view':
case 'edit':
if ($scope.item._id === data._id) {
swal("Outro utilizador apagou esta página", "Iremos redireciona-lo para a lista actualizada de " + $scope.entity.title, "info");
$location.path('/' + $routeParams.entity + '/list');
}
break;
}
//todo update lookup
}
//initialization
function initialize(callback) {
$scope.entity = zapi.entityMap[$routeParams.entity];
var words = ['api.entity.whereyougo', 'api.entity.newRecord', 'api.entity.editRecord', 'api.entity.viewRecord'];
if ($scope.entity) words.push($scope.entity.title);
$translate(words).then(function(translations) {
$page.setTitle(translations['api.entity.whereyougo']);
if (!$scope.entity) return;
if (typeof $scope.entity.license !== 'undefined') {
var isAllowed = $license.isLicensed($scope.entity.license);
if (!isAllowed) return $license.notify($scope.entity.license);
}
switch ($routeParams.action) {
case 'edit':
if (!$routeParams.id) {
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.newRecord']);
get($routeParams.entity, null, callback);
} else {
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.editRecord']);
get($routeParams.entity, $routeParams.id, callback);
}
break;
case 'view':
if (!$routeParams.id) return;
$page.setTitle(translations[$scope.entity.title] + "-" + translations['api.entity.viewRecord']);
get($routeParams.entity, $routeParams.id, callback);
break;
case 'list':
if ($routeParams.id) return;
$page.setTitle(translations[$scope.entity.title]);
get($routeParams.entity, null, callback);
break;
default:
return;
}
});
}
function skip(callback) {
callback();
}
});