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

309 lines (263 loc) 8.91 kB
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); });