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

157 lines (135 loc) 4.45 kB
app.directive('zlContainer', function(zapiPath) { return { restrict: 'E', replace: false, templateUrl: zapiPath + '/directives/container/container.html', scope: { entity: '@', item: '=', lookup: '=', label: '@', var: '@', key: '@', isVisible: '&?', isMovable: '@', noInsert: '@', removable: '@', approvalMaxLevel: '@' }, controller: function($scope, $rootScope, $controller, $timeout) { if ($scope.key) { $scope.newContainerItem = {}; } else { $scope.newContainerItem = ""; } $scope.append = function(newContainerItem) { append(newContainerItem, function(err) { if (err) { return swal("Atenção", err, "warning"); } //clear new container item fields if ($scope.key) { $scope.newContainerItem = {}; } else { $scope.newContainerItem = ""; } }); }; $scope.remove = function(containerItem) { var index = $scope.item[$scope.var].indexOf(containerItem); if (index != -1) { $scope.item[$scope.var].splice(index, 1); } }; $scope.validate = function(newContainerItem) { if (!newContainerItem) { return true; } if ($scope.key) { if (Object.keys(newContainerItem).length === 0 && JSON.stringify(newContainerItem) === JSON.stringify({})) { return true; } } if (typeof $scope.getError === 'function') { var response = $scope.getError(newContainerItem, $scope.item[$scope.var]); if (response.disabled) { $scope.console = response.tooltip; return true; } } $scope.console = null; return false; }; $scope.pushBack = function(index) { var _containerItem = $scope.item[$scope.var].splice(index, 1); $scope.item[$scope.var].splice(index - 1, 0, _containerItem[0]); }; $scope.pushForward = function(index) { var _containerItem = $scope.item[$scope.var].splice(index, 1); $scope.item[$scope.var].splice(index + 1, 0, _containerItem[0]); }; //$timeout is only ready after directive has fully loaded //this way when the controller loads, $scope will be fully populated $timeout(function() { //inject child controller $controller($scope.var + 'Ctrl', {$scope: $scope}); }); function append(newContainerItem, callback) { var i, property; if (!$scope.item[$scope.var]) { $scope.item[$scope.var] = []; } //check if containerItem is not empty if ($scope.key) { var key = { property: null, key: null }; if (newContainerItem[$scope.key]) { key.key = newContainerItem[$scope.key]; } else { for (property in newContainerItem) { if (newContainerItem[property][$scope.key]) { key.property = property; key.key = newContainerItem[property][$scope.key]; break; } } } if (key.key) { //check if containerItem already exists in container for (i = 0; i < $scope.item[$scope.var].length; i++) { var obj = key.property ? $scope.item[$scope.var][i][key.property] : $scope.item[$scope.var][i]; if (obj[$scope.key] === key.key) { return callback('Registo duplicado em ' + $scope.label); } } } } else { for (i = 0; i < $scope.item[$scope.var].length; i++) { if ($scope.item[$scope.var][i] === newContainerItem) { return callback('Registo duplicado em ' + $scope.label); } } } //append item to container $scope.item[$scope.var].unshift(newContainerItem); //approvable containers only if ($scope.approvalMaxLevel) { //assign approval if ($scope.approvalMaxLevel) { newContainerItem.approval = { level: $rootScope.login.role.approvalLevel, maxLevel: $scope.approvalMaxLevel }; } } callback(); } } }; });