(function() { 'use strict'; var app = angular.module('app', [ 'ngRoute', 'ngAnimate', 'ngResource', 'toaster' ]); app.directive( 'catalogField', function() { return { restrict : 'A', // only activate on element // attribute require : '?ngModel', // get a hold of // NgModelController link : function(scope, element, attrs, ngModel) { if (!ngModel) return; // do nothing if no ng-model // TODO: Replace the hard-coded form ID by the // appropiate dynamic field scope.catalogForm[attrs.name] = scope.catalogForm['{{field.name}}']; scope.catalogForm[attrs.name].$name = attrs.name; } }; }); app.factory('Catalogs', function($http, $resource, toaster) { var CatalogsService = { resources : { application : $resource('/application/:appId', { appId : '@id' }, { update : { method : "PUT" } }), user : $resource('/user/:userId', { userId : '@id' }, { update : { method : "PUT" } }), licensetype : $resource('/licensetype/:licenseTypeId', { licenseTypeId : '@id' }, { update : { method : "PUT" } }) }, list : function(initFn) { $http.get('/js/catalogs.json').success(function(data) { console.log(data); CatalogsService.data = data; initFn(); }) return CatalogsService; }, getName : function(index) { return CatalogsService.data ? CatalogsService.data[index].name : ''; }, getResource : function(index) { return CatalogsService.data ? CatalogsService.data[index].resource : ''; }, getMetadata : function(index) { return CatalogsService.data ? CatalogsService.data[index] : {}; }, save: function(catalog, data) { var resource = CatalogsService.resources[catalog.toLowerCase()]; function success(data) { console.log('success') console.log(data) toaster.pop('success', "Data saved sucessfully in " + catalog); } function fail(data, status) { var errorMsg = {500: 'Server error', 404: 'Item to modify was not found'}[data.status] toaster.pop('error', "Error saving data in " + catalog, errorMsg); console.log('error') console.error(data) console.error(status) } if (data.id && data.id !== '') return resource.update(data, success, fail) else return resource.save(data, success, fail) }, remove: function(catalog, data) { var resource = CatalogsService.resources[catalog.toLowerCase()]; function success(data) { console.log('success') console.log(data) } function fail(data, status) { console.log('error') console.error(data) console.error(status) } return resource.remove({}, data, success, fail) }, query: function(catalog) { console.log('HI catalog ???? ' + catalog); var resource = CatalogsService.resources[catalog]; function success(data) { console.log('success') console.log(data) } function fail(data, status) { console.log('error') console.error(data) console.error(status) } return resource.query({}, success, fail); } } return CatalogsService; }); app.controller('CatalogsCtrl', [ '$scope', '$http', 'Catalogs', function($scope, $http, Catalogs) { $scope.showForm = true; $scope.isNew = false; $scope.formu = {}; $scope.catalogIndex = 0; $scope.catalogs = Catalogs.list(function() { $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex); $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex)); }); $scope.catalogMetadata = {}; $scope.selectCatalog = function(index, $event) { $scope.catalogIndex = index; $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex); $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex)); console.log($event); } $scope.edit = function(data) { $scope.showForm = true; $scope.isNew = false; $scope.formu = {} for (var k in data) { if (k.indexOf('$') !== 0) $scope.formu[k] = data[k] } console.log('$scope.edit') console.log($scope.formu) } $scope.delete = function(data) { BootstrapDialog.confirm('The record will be deleted, are you sure?', function(result){ if(result) { var catalogName = Catalogs.getResource($scope.catalogIndex); var promise = Catalogs.remove(catalogName, data).$promise; promise.then(function(data) { $scope.list = Catalogs.query(catalogName); }); } }); $scope.showForm = false; $scope.isNew = false; // TODO: Load in formu values for Form // $scope.formu = {}; } } ]); app.controller('CatalogFormCtrl', [ '$scope', '$http', 'toaster', 'Catalogs', function($scope, $http, toaster, Catalogs) { $scope.scope = $scope; console.log('Form: currentCatalog:' + $scope.cataLogIndex); $scope.inputType = function(field) { if (field.readOnly && field.type === 'date') return 'readonly_date'; if (field.readOnly) return 'readonly'; if (field.type === 'select') return 'select'; if (!field.multiline) return 'normal'; if (field.multiline) return 'textarea'; } $scope.editNew = function() { $('#name').focus(); $scope.$parent.showForm = true; $scope.$parent.isNew = true; $scope.$parent.formu = {}; } $scope.cancel = function() { $scope.$parent.showForm = false; } $scope.saveCatalog = function() { if ($scope.catalogForm.$invalid) { alert(JSON.stringify($scope.catalogForm)) } else { var catalogName = Catalogs.getResource($scope.catalogIndex); var promise = Catalogs.save(catalogName, $scope.formu).$promise; promise.then(function(data, otro) { if ($scope.isNew) { $scope.$parent.formu = {} $('#name').focus(); } else { $scope.cancel(); } $scope.$parent.list = Catalogs.query(catalogName); }, function(error, otro) { console.log('then error'); console.log(error); console.log(otro); }); } } } ]); app.controller('CatalogListCtrl', [ '$scope', '$http', '$filter', 'Catalogs', function($scope, $http, $filter, Catalogs) { console.log('List: currentCatalog: ' + $scope.currentCatalog); var _indexOfField = function(name) { if (!$scope.catalogMetadata) return -1; for (var i = $scope.catalogMetadata.fields.length - 1; i >= 0 && $scope.catalogMetadata.fields[i].name !== name; i--); return i; } $scope.print = function(name, value) { var index = _indexOfField(name); if (index === -1) return value; var type = $scope.catalogMetadata.fields[index].type; return type === 'date' ? $filter('date')(value, 'yyyy-MM-dd') : value; } $scope.display = function(name) { var index = _indexOfField(name); return index === -1 ? '' : $scope.catalogMetadata.fields[index].display; } } ]); })();