UNPKG

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
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(); } });