Added Error handling and messages.
diff --git a/employee/employee.web-js/src/main/webapp/css/local.css b/employee/employee.web-js/src/main/webapp/css/local.css
index b2a2d01..5c28315 100644
--- a/employee/employee.web-js/src/main/webapp/css/local.css
+++ b/employee/employee.web-js/src/main/webapp/css/local.css
@@ -32,5 +32,6 @@
}
.button-group {
float: right;
+ font-weight: normal;
}
diff --git a/employee/employee.web-js/src/main/webapp/employee/delete.html b/employee/employee.web-js/src/main/webapp/employee/delete.html
index 1f12e1f..501631e 100644
--- a/employee/employee.web-js/src/main/webapp/employee/delete.html
+++ b/employee/employee.web-js/src/main/webapp/employee/delete.html
@@ -15,57 +15,63 @@
<div class="row-fluid">
<div class="span6 offset1">
- <div class="row-fluid">
+ <div class="row-fluid" ng-show="error">
+ <h3 class="form-h3">Delete Employee?</h3>
+ <div class="alert alert-error">{{error}}</div>
+ <a href='#/home' class='btn'>Ok</a>
+ </div>
+ <div ng-hide="error">
+ <div class="row-fluid">
<h3 class="form-h3">
Delete Employee?
<div class="button-group">
- <button ng-click='confirm()' class='button-small'>Ok</button>
- <button ng-click='cancel()' class='button-small'>Cancel</button>
+ <button class='btn' ng-click='confirm()'>Ok</button>
+ <a href='#/home' class='btn'>Cancel</a>
</div>
</h3>
- </div>
- <div class="row-fluid">
- <form class="form-horizontal span12">
- <div class="control-group">
- <label class="control-label">Id</label>
- <div class="controls">
- <input type="text" ng-model='employee.id' disabled />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">First Name</label>
- <div class="controls">
- <input type="text" ng-model='employee.firstName' disabled />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Last Name</label>
- <div class="controls">
- <input type="text" ng-model='employee.lastName' disabled />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Gender</label>
- <div class="controls">
- <select ng-model="employee.gender" disabled>
- <option value="Female">Female</option>
- <option value="Male">Male</option>
- </select>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Salary</label>
- <div class="controls">
- <div class="input-prepend">
- <span class="add-on">$</span> <input type="text"
- ng-model='employee.salary' disabled />
+ </div>
+ <div class="row-fluid">
+ <form class="form-horizontal span12">
+ <div class="control-group">
+ <label class="control-label">Id</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.id' disabled />
</div>
</div>
- </div>
- </form>
+ <div class="control-group">
+ <label class="control-label">First Name</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.firstName' disabled />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Last Name</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.lastName' disabled />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Gender</label>
+ <div class="controls">
+ <select ng-model="employee.gender" disabled>
+ <option value="Female">Female</option>
+ <option value="Male">Male</option>
+ </select>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Salary</label>
+ <div class="controls">
+ <div class="input-prepend">
+ <span class="add-on">$</span> <input type="text"
+ ng-model='employee.salary' disabled />
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
</div>
</div>
- <!--/span-->
<div class="span4 offset1">
<div class="aside">
<img src='resources/images/eclipselink-logo.png' alt='EclipseLink'
diff --git a/employee/employee.web-js/src/main/webapp/employee/edit.html b/employee/employee.web-js/src/main/webapp/employee/edit.html
index a52254c..c0e79dd 100644
--- a/employee/employee.web-js/src/main/webapp/employee/edit.html
+++ b/employee/employee.web-js/src/main/webapp/employee/edit.html
@@ -15,125 +15,133 @@
<div class="row-fluid">
<div class="span6 offset1">
- <div class="row-fluid">
+ <div class="row-fluid" ng-show="error">
+ <h3 class="form-h3">Employee</h3>
+ <div class="alert alert-error">{{error}}</div>
+ <a href='#/home' class='btn'>Ok</a>
+ </div>
+ <div ng-hide="error">
+ <div class="row-fluid">
<h3 class="form-h3">
Employee
<div class="button-group">
- <button ng-click='save()'>Save</button>
- <button ng-show='removeEnabled' ng-click='remove()'>Delete</button>
- <button ng-click='cancel()'>Cancel</button>
+ <button class='btn' ng-click='save()'>Save</button>
+ <button class='btn' ng-show='removeEnabled' ng-click='remove()'>Delete</button>
+ <a href='#/home' class='btn'>Cancel</a>
</div>
</h3>
- </div>
+ </div>
- <div class="row-fluid">
- <form class="form-horizontal">
- <div class="control-group">
- <label class="control-label">Id</label>
- <div class="controls">
- <input type="text" ng-model='employee.id' disabled />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">First Name</label>
- <div class="controls">
- <input type="text" ng-model='employee.firstName' />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Last Name</label>
- <div class="controls">
- <input type="text" ng-model='employee.lastName' />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Gender</label>
- <div class="controls">
- <select ng-model="employee.gender">
- <option value="Female">Female</option>
- <option value="Male">Male</option>
- </select>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Salary</label>
- <div class="controls">
- <div class="input-prepend">
- <span class="add-on">$</span> <input type="text"
- ng-model='employee.salary' />
+ <div class="row-fluid">
+ <form class="form-horizontal">
+ <div class="control-group">
+ <label class="control-label">Id</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.id' disabled />
</div>
</div>
- </div>
- </form>
- </div>
- <div class="row-fluid">
+ <div class="control-group">
+ <label class="control-label">First Name</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.firstName' />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Last Name</label>
+ <div class="controls">
+ <input type="text" ng-model='employee.lastName' />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Gender</label>
+ <div class="controls">
+ <select ng-model="employee.gender">
+ <option value="Female">Female</option>
+ <option value="Male">Male</option>
+ </select>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Salary</label>
+ <div class="controls">
+ <div class="input-prepend">
+ <span class="add-on">$</span> <input type="text"
+ ng-model='employee.salary' />
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <div class="row-fluid">
<h4 class="form-h4">
Address
- <button class="button-group" ng-hide='address'
+ <button class="button-group btn btn-small" ng-hide='address'
ng-click='addAddress()'>Add</button>
</h4>
- </div>
- <div class="row-fluid" ng-show="address">
- <form class="form-horizontal">
- <div class="control-group">
- <label class="control-label">Street</label>
- <div class="controls">
- <input type="text" ng-model='address.street' />
+ </div>
+ <div class="row-fluid" ng-show="address">
+ <form class="form-horizontal">
+ <div class="control-group">
+ <label class="control-label">Street</label>
+ <div class="controls">
+ <input type="text" ng-model='address.street' />
+ </div>
</div>
- </div>
- <div class="control-group">
- <label class="control-label">City</label>
- <div class="controls">
- <input type="text" ng-model='address.city' />
+ <div class="control-group">
+ <label class="control-label">City</label>
+ <div class="controls">
+ <input type="text" ng-model='address.city' />
+ </div>
</div>
- </div>
- <div class="control-group">
- <label class="control-label">Country</label>
- <div class="controls">
- <input type="text" ng-model='address.country' />
+ <div class="control-group">
+ <label class="control-label">Country</label>
+ <div class="controls">
+ <input type="text" ng-model='address.country' />
+ </div>
</div>
- </div>
- <div class="control-group">
- <div class="controls">
- <button 'ng-show='address' ng-click='removeAddress()'>Remove</button>
+ <div class="control-group">
+ <div class="controls">
+ <button class='btn btn-small' ng-show='address'
+ ng-click='removeAddress()'>Remove</button>
+ </div>
</div>
- </div>
- </form>
- </div>
- <div class="row-fluid">
+ </form>
+ </div>
+ <div class="row-fluid">
<h4 class="form-h4">
Phone Numbers
- <button class="button-group" ng-click='addPhone()'>Add</button>
+ <button class="button-group btn btn-small" ng-click='addPhone()'>Add</button>
</h4>
- </div>
- <div class="row-fluid" ng-show='phoneNumbers.length'>
- <form class="form-horizontal">
- <div ng-repeat='phoneNumber in phoneNumbers'>
- <div class="control-group">
- <label class="control-label">Type</label>
- <div class="controls">
- <input type="text" ng-model='phoneNumber.type' />
+ </div>
+ <div class="row-fluid" ng-show='phoneNumbers.length'>
+ <form class="form-horizontal">
+ <div ng-repeat='phoneNumber in phoneNumbers'>
+ <div class="control-group">
+ <label class="control-label">Type</label>
+ <div class="controls">
+ <input type="text" ng-model='phoneNumber.type' />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Area Code</label>
+ <div class="controls">
+ <input type="text" ng-model='phoneNumber.areaCode' />
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Number</label>
+ <div class="controls">
+ <input type="text" ng-model='phoneNumber.number' />
+ </div>
+ </div>
+ <div class="control-group">
+ <div class="controls">
+ <button class='btn btn-small' ng-click='removePhone($index)'>Remove</button>
+ </div>
</div>
</div>
- <div class="control-group">
- <label class="control-label">Area Code</label>
- <div class="controls">
- <input type="text" ng-model='phoneNumber.areaCode' />
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Number</label>
- <div class="controls">
- <input type="text" ng-model='phoneNumber.number' />
- </div>
- </div>
- <div class="control-group">
- <div class="controls">
- <button ng-click='removePhone($index)'>Remove</button>
- </div>
- </div>
- </div>
- </form>
+ </form>
+ </div>
</div>
</div>
<div class="span4">
@@ -147,10 +155,10 @@
<p>A PUT uses the URI of the resource and a payload containing
the changed resource in either XML or JSON.</p>
<p>A POST uses the URI of the resource type without the resource
- id. If the payload object doesn't contain an id one will be created by EclipseLink
- using the generation mechanism specified in the JPA mappings.
- If the payload object does have an id a POST will not use id generation.
- </p>
+ id. If the payload object doesn't contain an id one will be created
+ by EclipseLink using the generation mechanism specified in the JPA
+ mappings. If the payload object does have an id a POST will not use
+ id generation.</p>
</div>
</div>
</div>
diff --git a/employee/employee.web-js/src/main/webapp/employee/search.html b/employee/employee.web-js/src/main/webapp/employee/search.html
index 57272f3..a4e9ac3 100644
--- a/employee/employee.web-js/src/main/webapp/employee/search.html
+++ b/employee/employee.web-js/src/main/webapp/employee/search.html
@@ -21,76 +21,84 @@
</div>
</div>
- <div class="row-fluid">
- <div class="span5 row">
- <label>First Name</label> <input class="span12" type='text' ng-model='firstName' />
- </div>
- <div class="span5 row">
- <label>Last Name</label> <input class="span12" type='text' ng-model='lastName' />
- </div>
+ <div class="row-fluid" ng-show="error">
+ <div class="alert alert-error">{{error}}</div>
+ <a href='#/home' class='btn'>Ok</a>
</div>
-
- <div class="row-fluid">
- <div class="span12 row">
- <label class='checkbox'>Page Results <input type='checkbox'
- ng-model='pageResults'></label>
-
+ <div ng-hide="error">
+ <div class="row-fluid">
+ <div class="span5 row">
+ <label>First Name</label> <input class="span12" type='text'
+ ng-model='firstName' />
+ </div>
+ <div class="span5 row">
+ <label>Last Name</label> <input class="span12" type='text'
+ ng-model='lastName' />
+ </div>
</div>
- </div>
- <div class="row-fluid">
- <div class="span12 row ">
- <button ng-click='search()' class='menu-button'>Search</button>
- </div>
- </div>
- <div class="row-fluid" ng-show='employees.length'>
- <div class="span10">
- <h4>Search Results</h4>
- <table class='table'>
- <thead>
- <tr ng-hide='pageResults' class="form-search">
- <td colspan='4'><label>Filter <input type="text"
- class="input-medium search-query" ng-model='query' /></label></td>
- </tr>
- <tr>
- <td>ID</td>
- <td>Last Name</td>
- <td>First Name</td>
- <td colspan='2'></td>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat='employee in employees | filter:query'>
- <td>{{employee.id}}</td>
- <td>{{employee.lastName}}</td>
- <td>{{employee.firstName}}</td>
- <td class='employee-action'><button class='button-small'
- ng-click='edit(employee.id)'>Edit</button>
- <button class='button-small' ng-click='remove(employee.id)'>Delete</button></td>
- </tr>
- </tbody>
- <tfoot ng-show='pageResults'>
- <tr>
- <td colspan='5'>
- <table width='100%'>
- <tr>
- <td>
- <button ng-show='prevAvailable' class='button-small'
- type='button' ng-click='pagePrevious()'>Previous</button>
- </td>
- <td align='center' width='100%' colspan='3'><span
- id='employees-pages'>Page {{pageNum}} of
- {{totalPages}}</span></td>
- <td>
- <button ng-show='nextAvailable' class='button-small'
- type='button' ng-click='pageNext()'>Next</button>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </tfoot>
- </table>
+ <div class="row-fluid">
+ <div class="span12 row">
+ <label class='checkbox'>Page Results <input type='checkbox'
+ ng-model='pageResults'></label>
+
+ </div>
+ </div>
+ <div class="row-fluid">
+ <div class="span12 row ">
+ <button class='btn' ng-click='search()' class='menu-button'>Search</button>
+ </div>
+ </div>
+
+ <div class="row-fluid" ng-show='employees.length'>
+ <div class="span10">
+ <h4>Search Results</h4>
+ <table class='table'>
+ <thead>
+ <tr ng-hide='pageResults' class="form-search">
+ <td colspan='4'><label>Filter <input type="text"
+ class="input-medium search-query" ng-model='query' /></label></td>
+ </tr>
+ <tr>
+ <td>ID</td>
+ <td>Last Name</td>
+ <td>First Name</td>
+ <td colspan='2'></td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat='employee in employees | filter:query'>
+ <td>{{employee.id}}</td>
+ <td>{{employee.lastName}}</td>
+ <td>{{employee.firstName}}</td>
+ <td class='employee-action'><button class='btn'
+ ng-click='edit(employee.id)'>Edit</button>
+ <button class='btn' ng-click='remove(employee.id)'>Delete</button></td>
+ </tr>
+ </tbody>
+ <tfoot ng-show='pageResults'>
+ <tr>
+ <td colspan='5'>
+ <table width='100%'>
+ <tr>
+ <td>
+ <button ng-show='prevAvailable' class='btn' type='button'
+ ng-click='pagePrevious()'>Previous</button>
+ </td>
+ <td align='center' width='100%' colspan='3'><span
+ id='employees-pages'>Page {{pageNum}} of
+ {{totalPages}}</span></td>
+ <td>
+ <button ng-show='nextAvailable' class='btn' type='button'
+ ng-click='pageNext()'>Next</button>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
</div>
</div>
</div>
@@ -100,10 +108,16 @@
title='EclipseLink Employee Example' />
<div class='commentary'>
<h3>Querying Resources</h3>
- <p>This page executes a predefined JPA named query that finds all Employees with a specified first and last name
- using a JPQL LIKE operator to support inexact matches. </p>
- <p>Paging is implemented using the EclipseLink <code>eclipselink.jdbc.first-result</code> and <code>eclipselink.jdbc.max-rows</code> query hints which can be attached to a named
- query invocation.</p>
+ <p>This page executes a predefined JPA named query that finds
+ all Employees with a specified first and last name using a JPQL
+ LIKE operator to support inexact matches.</p>
+ <p>
+ Paging is implemented using the EclipseLink
+ <code>eclipselink.jdbc.first-result</code>
+ and
+ <code>eclipselink.jdbc.max-rows</code>
+ query hints which can be attached to a named query invocation.
+ </p>
</div>
</div>
</div>
diff --git a/employee/employee.web-js/src/main/webapp/js/controllers.js b/employee/employee.web-js/src/main/webapp/js/controllers.js
index 05fe2a6..3739034 100755
--- a/employee/employee.web-js/src/main/webapp/js/controllers.js
+++ b/employee/employee.web-js/src/main/webapp/js/controllers.js
@@ -28,20 +28,35 @@
$scope.search = function() {
if ($scope.pageResults) {
resetPaging();
- Employees.count($scope.firstName, $scope.lastName).then(
- function(response) {
- $scope.count = response.data.COUNT;
- $scope.totalPages = Math.floor($scope.count
- / $scope.pageSize)
- + ($scope.count % $scope.pageSize > 0 ? 1 : 0);
- fetchPage();
- });
+ Employees
+ .count($scope.firstName, $scope.lastName)
+ .then(
+ function(response) {
+ $scope.count = response.data.COUNT;
+ $scope.totalPages = Math.floor($scope.count
+ / $scope.pageSize)
+ + ($scope.count % $scope.pageSize > 0 ? 1
+ : 0);
+ fetchPage();
+ },
+ function(response) {
+ $scope.error = 'Error retrieving number of resources. Server response code '
+ + response.status;
+ });
} else {
- $scope.employees = Employees.getAll({
- firstName : $scope.firstName,
- lastName : $scope.lastName
- });
+ $scope.employees = Employees
+ .getAll(
+ {
+ firstName : $scope.firstName,
+ lastName : $scope.lastName
+ },
+ function() {
+ },
+ function(response) {
+ $scope.error = 'Error retrieving resources. Server response code '
+ + response.status;
+ });
}
};
@@ -109,18 +124,24 @@
function EmployeeDeleteCtrl($scope, $routeParams, $location, Employee) {
$scope.employee = Employee.get({
id : $routeParams.id
+ }, function() {
+ // success
+ }, function(response) {
+ $scope.error = 'Resource not found. Server response code ' + response.status;
});
$scope.confirm = function() {
Employee.remove({}, {
id : $scope.employee.id
+ }, function() {
+ $location.path("/home");
+ }, function(response) {
+ $scope.error = 'Error deleting resource. Server response code '
+ + response.status;
});
- $location.path("/home");
+
};
- $scope.cancel = function() {
- $location.path("/home");
- };
}
function EmployeeCommon($scope, $location) {
@@ -131,18 +152,19 @@
// work
$scope.employee.address = $scope.address;
$scope.employee.phoneNumbers = $scope.phoneNumbers;
- $scope.employee.$save();
- $location.path("/home");
+ $scope.employee.$save(function() {
+ $location.path("/home");
+ }, function(response) {
+ $scope.error = 'Error saving resource. Server response code '
+ + response.status;
+ });
+
};
$scope.remove = function() {
$location.path("/employee/delete/" + $scope.employee.id);
};
- $scope.cancel = function() {
- $location.path("/home");
- };
-
$scope.addAddress = function() {
$scope.address = {};
};
@@ -195,6 +217,9 @@
EmployeeAddress.get($scope.employee, function(address) {
$scope.address = address;
});
+ }, function(response) {
+ $scope.error = 'Error retrieving resource. Server response code '
+ + response.status;
});
return that;