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

367 lines (323 loc) 9.18 kB
app.controller('entityCtrl', function ($entity, entityMap, ErrorSvc, $page, mySocket, $window, $routeParams, $controller, $location, $scope, $uibModal, blockUI, inform, $route, NgTableParams) { //set scope variables $scope.table = { params: null }; $scope.console = null; $scope.entities = entityMap; $scope.entityName = $routeParams.entity; $scope.lookup = {}; $scope.items = []; $scope.item = {}; $scope.newFile = {}; //set scope functions $scope.add = function (item) { blockUI.start("A enviar dados..."); $entity.add($routeParams.entity, item) .then(function (response) { if (item._id) { inform.add($scope.entity.title + ' - registo alterado com sucesso!', { ttl: 2000, type: 'info' }); } else { inform.add($scope.entity.title + ' - novo registo criado com sucesso!', { ttl: 2000, type: 'info' }); } //$location.path($scope.entityName + "/list"); }) .catch(function (response) { inform.add(response.data, { ttl: 2000, type: 'danger' }); }) .finally(function () { blockUI.stop(); }); }; $scope.remove = function (item) { blockUI.start("Averiguando eligibilidade de remoção..."); $entity.remove($routeParams.entity, item) .then(function (response) { inform.add($scope.entity.title + ' - registo apagado com sucesso!', { 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) { if (item) { $location.path($routeParams.entity + '/edit/' + item._id); } else { $location.path($routeParams.entity + '/edit'); } return; } 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) { $scope.add(newItem); }, function () { inform.add('Alteração ao registo cancelada', { 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 = function (items) { var data = []; items.forEach(function (item) { data.push(unflatten(item)); }); return data; }; $scope.flattenArray = function (items) { var table = [], keys = [], key, data = []; items.forEach(function (item) { var row = flatten(item); for (key in row) { if (keys.indexOf(key) !== -1) { continue; } keys.push(key); } table.push(row); }); table.forEach(function (row) { var datum = {}; for (var i = 0; i < keys.length; i++) { key = keys[i]; if (typeof row[key] === 'undefined') { row[key] = ""; } datum[key] = row[key]; } data.push(datum); }); return data; }; function flatten(data) { var result = {}; function recurse(cur, prop) { if (Object(cur) !== cur) { result[prop] = cur; } else if (Array.isArray(cur)) { for (var i = 0, l = cur.length; i < l; i++) recurse(cur[i], prop + "[" + i + "]"); if (l === 0) result[prop] = []; } else { var isEmpty = true; for (var p in cur) { isEmpty = false; recurse(cur[p], prop ? prop + "." + p : p); } if (isEmpty && prop) result[prop] = {}; } } recurse(data, ""); return result; } function unflatten(data) { if (Object(data) !== data || Array.isArray(data)) { return data; } var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g, resultholder = {}; for (var p in data) { var cur = resultholder, prop = "", m; while ((m = regex.exec(p))) { cur = cur[prop] || (cur[prop] = (m[2] ? [] : {})); prop = m[2] || m[1]; } cur[prop] = data[p]; } return resultholder[""] || resultholder; } //set private methods function get(entity, id, callback) { blockUI.start("A obter dados..."); getLookups($scope.lookup, function (err, lookups) { if (err) { inform.add("Não foi possível obter dados.", { ttl: 2000, type: 'danger' }); blockUI.stop(); callback(err); return; } $scope.lookup = lookups; //if user is creating a new record if (!$routeParams.id && $routeParams.action === 'edit') { blockUI.stop(); callback(); return; } $entity.get(entity, id) .then(function (response) { if (id) { $scope.item = response.data; } else { $scope.items = response.data; updateTable(); } }) .catch(function (response) { inform.add(response.error ? response.error : response.data, { ttl: 2000, type: 'danger' }); }) .finally(function () { blockUI.stop(); callback(); }); }); } function getLookups(lookup, callback) { if (lookup) { if (lookup.length) { callback(null, lookup); return; } } $entity.getLookups($routeParams.entity, function (err, data) { if (err) { callback(err); return; } callback(null, data); }); } function setEdit(item) { if (item) { $scope.item = angular.copy(item); } else { $scope.item = typeof $scope.blank === 'function' ? $scope.blank() : {}; } } function updateTable() { $scope.table.params = new NgTableParams({ page: 1, count: $scope.items.length, sorting: { nome: "asc" } }, { total: 1, counts: [], dataset: $scope.items }); } function loadFinished() { //inject child controller $controller($routeParams.entity + 'Ctrl', { $scope: $scope }); var websocket; if (typeof entityMap[$routeParams.entity].websocket === 'undefined') { websocket = $routeParams.entity; } else { websocket = eval(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); updateTable(); 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; updateTable(); break; } } break; case 'view': case 'edit': if ($scope.item._id === data._id) { $scope.item = data; } 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); updateTable(); 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) { $page.setTitle('Onde quer ir?'); $scope.entity = entityMap[$routeParams.entity]; if (!$scope.entity) { return; } switch ($routeParams.action) { case 'edit': if (!$routeParams.id) { $page.setTitle($scope.entity.title + ' - Novo Registo'); get($routeParams.entity, null, callback); } else { $page.setTitle($scope.entity.title + ' - Alterar Registo'); get($routeParams.entity, $routeParams.id, callback); } break; case 'view': if (!$routeParams.id) { return; } $page.setTitle($scope.entity.title + ' - Visualizar'); get($routeParams.entity, $routeParams.id, callback); break; case 'list': if ($routeParams.id) { return; } $page.setTitle($scope.entity.title); get($routeParams.entity, null, callback); break; default: return; } } initialize(loadFinished); });