Skip to content

Commit

Permalink
Added configuration option to be able to load available dates from an…
Browse files Browse the repository at this point in the history
… API.

Added tests
  • Loading branch information
hmartos committed Nov 12, 2017
1 parent e6e9f25 commit 1a212d5
Show file tree
Hide file tree
Showing 8 changed files with 325 additions and 63 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ There is also a watch task to watch for any change on sources files and automati

angular-reservation has in`tegration tests that allows developer to check if new features breaks functionality.
You can run tests on a single run or watch for source code to change and execute tests each time source code changes.
``

##### Single run test
Execute `npm run test-single-run`

Expand Down
138 changes: 124 additions & 14 deletions dist/angular-reservation.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
function reservationConfigProvider() {

var config = {
getAvailableDatesFromAPI: false, //Enable/disable load of available dates from API
getAvailableDatesAPIUrl: "http://localhost:8080/availableDates", //API url endpoint to load list of available dates
getAvailableHoursAPIUrl: "http://localhost:8080/availableHours", //API url endpoint to load list of available hours
reserveAPIUrl: "http://localhost:8080/reserve", //API url endpoint to do a reserve
dateFormat: "yyyy-MM-dd",
Expand Down Expand Up @@ -57,59 +59,124 @@
vm.secondTabLocked = true;
vm.thirdTabLocked = true;

var today = new Date();
today.setHours(0,0,0,0); //Date at start of today
vm.selectedDate = today;
vm.selectedDate = new Date();

vm.selectedHour = "";

vm.userData = {};

vm.loader = false;

vm.getAvailableDatesFromAPI = reservationConfig.getAvailableDatesFromAPI;
vm.dateFormat = reservationConfig.dateFormat;

vm.datepickerTemplate = reservationConfig.datepickerTemplate;
vm.availableHoursTemplate = reservationConfig.availableHoursTemplate;
vm.noAvailableHoursTemplate = reservationConfig.noAvailableHoursTemplate;
vm.clientFormTemplate = reservationConfig.clientFormTemplate;

vm.datepickerOptions = $scope.datepickerOptions;
vm.datepickerOptions = $scope.datepickerOptions || {};

$translate.use(reservationConfig.language);

if (vm.getAvailableDatesFromAPI) {
vm.availableDates = [];
getAvailableDates();
//Disable not available dates in datepicker and clean minDate option
vm.datepickerOptions.dateDisabled = disableDates;
vm.datepickerOptions.minDate = undefined;
}


//METHODS
// TODO This function should have all needed parameters in order to test it better
vm.onSelectDate = function(date) {
vm.onSelectDate = function (date) {
vm.selectedDate = date;
vm.secondTabLocked = false;
vm.selectedTab = 1;
onBeforeGetAvailableHours(date);
vm.loader = true;
}

vm.selectHour = function(hour) {
vm.selectHour = function (hour) {
vm.thirdTabLocked = false;
vm.selectedHour = hour;
vm.selectedTab = 2;
}

vm.reserve = function(date, hour, userData) {
vm.reserve = function (date, hour, userData) {
onBeforeReserve(date, hour, userData);
}


//PRIVATE METHODS

/**
* Get available dates
*/
function getAvailableDates() {
vm.loader = true;

reservationAPIFactory.getAvailableDates().then(function () {
vm.loader = false;

var status = vm.availableDatesStatus = reservationAPIFactory.status;
var message = vm.availableDatesMessage = reservationAPIFactory.message;

//Completed get available hours callback
reservationService.onCompletedGetAvailableDates(status, message);

//Success
if (status == 'SUCCESS') {
vm.availableDates = reservationAPIFactory.availableDates;
//Successful get available hours callback
reservationService.onSuccessfulGetAvailableDates(status, message, vm.availableDates);

//Preselect first available date
if (vm.availableDates.length > 0) {
vm.selectedDate = new Date(vm.availableDates[0]);
}

//Error
} else {
//Error get available hours callback
reservationService.onErrorGetAvailableDates(status, message);
}
});
}

/**
* Check if a date is available <=> it is in availableDates array
* @param date
* @returns {boolean}
*/
function isDateAvailable(date) {
if (vm.availableDates.indexOf(date.toISOString().substr(0, 10)) !== -1) {
return true;
}

return false;
}

/**
* Function to disable all dates not in available dates list
* @param dateAndMode
* @returns {boolean}
*/
function disableDates(dateAndMode) {
var date = dateAndMode.date,
mode = dateAndMode.mode;

return (mode === 'day' && !isDateAvailable(date));
}

/**
* Function executed before get available hours function.
*/
function onBeforeGetAvailableHours(date) {
reservationService.onBeforeGetAvailableHours(date).then(function () {
getAvailableHours(date);

}, function() {
}, function () {
console.log("onBeforeGetAvailableHours: Rejected promise");
});
}
Expand All @@ -136,7 +203,7 @@
//Successful get available hours callback
reservationService.onSuccessfulGetAvailableHours(status, message, date, vm.availableHours);

//Error
//Error
} else {
//Error get available hours callback
reservationService.onErrorGetAvailableHours(status, message, date);
Expand All @@ -151,15 +218,14 @@
reservationService.onBeforeReserve(date, hour, userData).then(function () {
reserve(date, hour, userData);

}, function() {
}, function () {
console.log("onBeforeReserve: Rejected promise");
});
}

/**
* Do reserve POST with selectedDate, selectedHour and userData as parameters of the call
*/
// TODO This function should have all needed parameters in order to test it better
function reserve(date, hour, userData) {
vm.loader = true;

Expand All @@ -180,7 +246,7 @@
//Successful reserve calback
reservationService.onSuccessfulReserve(status, message, date, hour, userData);

//Error
//Error
} else {
//Error reserve callback
reservationService.onErrorReserve(status, message, date, hour, userData);
Expand Down Expand Up @@ -222,11 +288,33 @@
reservationAPI.status = "";
reservationAPI.message = "";

reservationAPI.availableHours = "";
reservationAPI.availableHours = [];
reservationAPI.availableDates = [];


//METHODS

//Call to get list of available dates
reservationAPI.getAvailableDates = function() {
return $http({
method: 'GET',
url: reservationConfig.getAvailableDatesAPIUrl,
responseType: 'json'

}).then(function(response) {
//Success handler
console.log(response.data);
validateAvailableDatesResponseData(response.data);

reservationAPI.status = response.data.status;
reservationAPI.message = response.data.message;
reservationAPI.availableDates = response.data.availableDates;

}, function(response) {
reservationAPI.errorManagement(response.status);
});
}

//Call to get list of available hours
reservationAPI.getAvailableHours = function(params) {
return $http({
Expand Down Expand Up @@ -290,6 +378,13 @@
reservationAPI.availableHours = "";
}

//Validate if available dates response has expected keys
function validateAvailableDatesResponseData(data) {
if(!data.hasOwnProperty('status')) console.error("Get available hours response should have a 'status' key");
if(!data.hasOwnProperty('message')) console.error("Get available hours response should have a 'message' key");
if(!data.hasOwnProperty('availableDates')) console.error("Get available hours response should have a 'availableDates' key");
}

//Validate if available hours response has expected keys
function validateAvailableHoursResponseData(data) {
if(!data.hasOwnProperty('status')) console.error("Get available hours response should have a 'status' key");
Expand All @@ -315,6 +410,21 @@
(function() {
function reservationService($q, $filter, $uibModal, reservationConfig) {

//Completed get available dates callback
this.onCompletedGetAvailableDates = function(status, message) {
console.log("Executing completed get available dates callback");
}

//Success get available dates callback
this.onSuccessfulGetAvailableDates = function(status, message, availableDates) {
console.log("Executing successful get available dates callback");
}

//Error get available dates callback
this.onErrorGetAvailableDates = function(status, message) {
console.log("Executing error get available dates callback");
}

//Before get available hours callback
this.onBeforeGetAvailableHours = function(selectedDate) {
console.log("Executing before get available hours callback");
Expand Down
2 changes: 1 addition & 1 deletion dist/angular-reservation.min.js

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/js/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
function reservationConfigProvider() {

var config = {
getAvailableDatesFromAPI: false, //Enable/disable load of available dates from API
getAvailableDatesAPIUrl: "http://localhost:8080/availableDates", //API url endpoint to load list of available dates
getAvailableHoursAPIUrl: "http://localhost:8080/availableHours", //API url endpoint to load list of available hours
reserveAPIUrl: "http://localhost:8080/reserve", //API url endpoint to do a reserve
dateFormat: "yyyy-MM-dd",
Expand Down
Loading

0 comments on commit 1a212d5

Please sign in to comment.