Skip to content

Commit

Permalink
Improve listeners in internalRequest controller and redesign products…
Browse files Browse the repository at this point in the history
… service

Reduce the listeners and related functionality usage on the controller.
Redesign the service to handle these details better.
Redesign products service to handle products and remote products separate from each other while still maintaining remote products dependency on products.
  • Loading branch information
kaladay committed May 13, 2020
1 parent 482efe4 commit 22448c5
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 148 deletions.
97 changes: 29 additions & 68 deletions app/controllers/internalRequestController.js
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
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
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
@@ -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
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

0 comments on commit 22448c5

Please sign in to comment.