Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve listeners in internalRequest controller and redesign products service #61

Merged
merged 2 commits into from
May 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
97 changes: 29 additions & 68 deletions app/controllers/internalRequestController.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,66 +4,40 @@ app.controller('InternalRequestController', function ($controller, $scope, ApiRe
$scope: $scope
}));

$scope.internalRequests = InternalRequestRepo.getAll();

$scope.internalRequestToCreate = InternalRequestRepo.getScaffold();
$scope.internalRequestToEdit = {};
$scope.internalRequestToDelete = {};
if ($scope.isManager() || $scope.isAdmin()) {
$scope.internalRequests = InternalRequestRepo.getAll();

$scope.featureRequestToPush = {};
$scope.internalRequestToCreate = InternalRequestRepo.getScaffold();
$scope.internalRequestToEdit = {};
$scope.internalRequestToDelete = {};

$scope.products = [];
$scope.remoteProducts = {};
$scope.remoteProductsLoading = false;
$scope.featureRequestToPush = {};

$scope.resetInternalRequestForms = function () {
InternalRequestRepo.clearValidationResults();
$scope.resetInternalRequestForms = function () {
InternalRequestRepo.clearValidationResults();

for (var key in $scope.internalRequestForms) {
if ($scope.internalRequestForms[key] !== undefined && !$scope.internalRequestForms[key].$pristine && $scope.internalRequestForms[key].$setPristine) {
$scope.internalRequestForms[key].$setPristine();
for (var key in $scope.internalRequestForms) {
if ($scope.internalRequestForms[key] !== undefined && !$scope.internalRequestForms[key].$pristine && $scope.internalRequestForms[key].$setPristine) {
$scope.internalRequestForms[key].$setPristine();
}
}
}

$scope.closeModal();
};
$scope.closeModal();
};

$scope.resetInternalRequestForms();
$scope.resetInternalRequestForms();

if ($scope.isManager() || $scope.isAdmin()) {
$scope.selectRemoteProducts = function () {
if ($scope.remoteProductsLoading === false) {
$scope.remoteProducts = {};

if (angular.isDefined($scope.featureRequestToPush.productId) && $scope.featureRequestToPush.productId !== null) {
var productId = $scope.featureRequestToPush.productId;
var remoteProducts = ProductsService.getRemoteProducts();

if (angular.isDefined(remoteProducts[productId])) {
angular.extend($scope.remoteProducts, remoteProducts[productId]);
} else {
$scope.refreshRemoteProducts(productId);
}
if ($scope.featureRequestToPush.productId) {
if (!$scope.remoteProducts[$scope.featureRequestToPush.productId]) {
$scope.refreshRemoteProducts($scope.featureRequestToPush.productId);
}
}
};

$scope.refreshRemoteProducts = function (productId) {
if ($scope.remoteProductsLoading === false) {
$scope.remoteProductsLoading = true;
$scope.remoteProducts = {};

ProductsService.refreshRemoteProducts(productId).then(null, null, function (res) {
remoteProducts = ProductsService.getRemoteProducts();

if (angular.isDefined(remoteProducts[productId])) {
angular.extend($scope.remoteProducts, remoteProducts[productId]);
}

$scope.remoteProductsLoading = false;
}).catch(function() {
$scope.remoteProductsLoading = false;
});
if (productId && !$scope.remoteProductsLoading[productId]) {
ProductsService.refreshRemoteProducts(productId);
}
};

Expand Down Expand Up @@ -92,7 +66,7 @@ app.controller('InternalRequestController', function ($controller, $scope, ApiRe
scopeId: null
};

if ($scope.remoteProductsLoading !== true) {
if (!$scope.productsLoading) {
ProductsService.refreshProducts();
}

Expand Down Expand Up @@ -162,31 +136,18 @@ app.controller('InternalRequestController', function ($controller, $scope, ApiRe

ProductsService.ready.then(null, null, function () {
$scope.products = ProductsService.getProducts();
$scope.productsLoading = ProductsService.getProductsLoading();
$scope.remoteProducts = ProductsService.getRemoteProducts();
$scope.remoteProductsLoading = ProductsService.getRemoteProductsLoading();
});

WsApi.listen(apiMapping.Product.listen).then(null, null, function (res) {
var productId = angular.isDefined($scope.featureRequestToPush.productId) ? $scope.featureRequestToPush.productId : null;

ProductsService.refreshProducts();

if ($scope.remoteProductsLoading === false && productId !== null) {
var apiRes = angular.fromJson(res.body);

if (apiRes.meta.status === 'SUCCESS') {
$scope.refreshRemoteProducts(productId);
InternalRequestRepo.listen([ApiResponseActions.CREATE, ApiResponseActions.DELETE, ApiResponseActions.UPDATE], function () {
$scope.internalRequests.length = 0;
var internalRequests = InternalRequestRepo.getAll();
for (var i in internalRequests) {
$scope.internalRequests.push(internalRequests[i]);
}
}
});
}

InternalRequestRepo.listen([ApiResponseActions.CREATE, ApiResponseActions.DELETE, ApiResponseActions.UPDATE], function () {
var internalRequests = InternalRequestRepo.getAll();

$scope.internalRequests.length = 0;

for (var i in internalRequests) {
$scope.internalRequests.push(internalRequests[i]);
}
});

});
88 changes: 64 additions & 24 deletions app/services/productsService.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,46 @@ app.service('ProductsService', function ($q, ProductRepo, WsApi) {
var service = this;

var products = [];
var productsLoading = false;
var remoteProducts = {};
var remoteProductsLoading = [];

var defer = $q.defer();

var process = function (response) {
var apiRes = angular.fromJson(response.body);
var process = function (res) {
var apiRes = angular.fromJson(res.body);

if (apiRes.meta.status === 'SUCCESS') {
products.length = 0;

angular.extend(products, apiRes.payload['ArrayList<Product>']);
defer.notify();
productsLoading = false;

var toRemove = {};
for (var productId in remoteProducts) {
toRemove[productId] = productId;
}

for (var key in products) {
toRemove[products[key].id] = undefined;

if (!remoteProductsLoading[products[key].id]) {
service.refreshRemoteProducts(products[key].id);
}
}

for (var id in toRemove) {
remoteProducts[id] = undefined;
}
} else {
console.error(apiRes.meta);
throw "Unable to retrieve products";
}
};

var processRemoteProduct = function (response, productId, deferRefresh) {
var apiRes = angular.fromJson(response.body);
var processRemoteProduct = function (res, productId) {
var apiRes = angular.fromJson(res.body);

if (apiRes.meta.status === 'SUCCESS') {
if (angular.isDefined(remoteProducts[productId])) {
Expand All @@ -32,47 +53,66 @@ app.service('ProductsService', function ($q, ProductRepo, WsApi) {
}

angular.extend(remoteProducts[productId], apiRes.payload.HashMap);
deferRefresh.notify();
remoteProductsLoading[productId] = false;
} else {
throw "Unable to retrieve remote products for product " + productId;
}
};

WsApi.listen(apiMapping.Product.listen).then(null, null, function (response) {
process(response);
WsApi.listen(apiMapping.Product.listen).then(null, null, function (res) {
service.refreshProducts();
});

service.refreshProducts = function () {
WsApi.fetch(apiMapping.Product.all).then(function (response) {
process(response);
if (productsLoading === false) {
productsLoading = true;

for (var productId in remoteProducts) {
service.refreshRemoteProducts(productId);
}
});
WsApi.fetch(apiMapping.Product.all).then(function (res) {
process(res);
});
}
};

service.refreshRemoteProducts = function (productId) {
var deferRefresh = $q.defer();
var options = {
pathValues: {
productId: productId
if (productsLoading === false) {
var productFound = false;
for (var key in products) {
if (products[key].id === productId) {
productFound = true;
break;
}
}

if (productFound) {
var options = {
pathValues: {
productId: productId
}
};

remoteProductsLoading[productId] = true;

WsApi.fetch(apiMapping.RemoteProducts.byProduct, options).then(function (res) {
processRemoteProduct(res, productId);
});
}
};
}
};

WsApi.fetch(apiMapping.RemoteProducts.byProduct, options).then(function (response) {
processRemoteProduct(response, productId, deferRefresh);
});
service.getProducts = function () {
return products;
};

return deferRefresh.promise;
service.getProductsLoading = function () {
return productsLoading;
};

service.getRemoteProducts = function () {
return remoteProducts;
};

service.getProducts = function () {
return products;
service.getRemoteProductsLoading = function () {
return remoteProductsLoading;
};

service.getRemoteProductInfo = function (productId) {
Expand Down
4 changes: 2 additions & 2 deletions app/views/modals/pushInternalRequestModal.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ <h4 class="modal-title">Push Internal Request (Feature Request)</h4>

<div class="form-group">
<label for="productId">Associate Product</label>
<select name="productId" class="form-control" ng-model="featureRequestToPush.productId" ng-options="product.id as product.name for product in products | orderBy:'name'" ng-change="selectRemoteProducts()" ng-disabled="remoteProductsLoading">
<select name="productId" class="form-control" ng-model="featureRequestToPush.productId" ng-options="product.id as product.name for product in products | orderBy:'name'" ng-change="selectRemoteProducts()" ng-disabled="productsLoading">
<option value="" selected>None</option>
</select>
</div>

<div class="form-group" ng-if="featureRequestToPush.productId">
<label for="scopeId">Associate Remote Product</label>
<select name="scopeId" class="form-control" ng-model="featureRequestToPush.scopeId" ng-options="remoteProduct.id as remoteProduct.name for remoteProduct in remoteProducts" ng-disabled="remoteProductsLoading">
<select name="scopeId" class="form-control" ng-model="featureRequestToPush.scopeId" ng-options="remoteProduct.id as remoteProduct.name for remoteProduct in remoteProducts[featureRequestToPush.productId]" ng-disabled="productsLoading || remoteProductsLoading[featureRequestToPush.productId]">
<option value="" selected>None</option>
</select>
</div>
Expand Down
47 changes: 33 additions & 14 deletions tests/mock/service/mockProductsService.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,57 @@
var mockProductsService = function ($q, $timeout) {
var service = mockService($q);

var products = {};
var defer = $q.defer();
var products = [];
var productsLoading = false;
var remoteProducts = {};
var remoteProductsLoading = [];

service.getProducts = function () {
return products;
service.mockProductsLoading = function (loading) {
productsLoading = loading ? true : false;
};

service.getRemoteProductInfo = function (productId) {
for (var i in products) {
if (products[i].id == productId) {
return products[i].remoteProductInfo;
}
}
};

service.getRemoteProducts = function () {
return remoteProducts;
service.remoteProductsLoading = function (productId, loading) {
remoteProductsLoading[productId] = loading ? true : false;
};

service.refreshProducts = function () {
productsLoading = false;
return messagePromise($q.defer());
};

service.refreshRemoteProducts = function (productId) {
remoteProductsLoading[productId] = false;

if (dataFeatureRequest1.id == productId) {
return notifyPromise($timeout, $q.defer(), dataFeatureRequest1);
}

return rejectPromise($q.defer());
};

service.ready = $q.defer().promise;
service.getProductsLoading = function () {
return productsLoading;
};

service.getRemoteProducts = function () {
return remoteProducts;
};

service.getRemoteProductsLoading = function () {
return remoteProductsLoading;
};

service.getRemoteProductInfo = function (productId) {
for (var i in products) {
if (products[i].id == productId) {
return products[i].remoteProductInfo;
}
}
};

service.ready = defer.promise;
defer.notify();

return service;
};
Expand Down
4 changes: 4 additions & 0 deletions tests/mock/service/mockWsApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ angular.module("mock.wsApi", []).service("WsApi", function ($q) {
service.fetch = function (apiReq, options) {
var payload = {};

if (angular.isUndefined(apiReq)) {
return rejectPromise($q.defer());
}

if (fetchResponse) {
switch (fetchResponse.type) {
case "message":
Expand Down