98 lines
5.2 KiB
JavaScript
98 lines
5.2 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Created by viktor.shevchenko on 7/10/2014.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
angular.module('myitsmApp')
|
|
.factory('metadataModel', ['metadataService', '$q', function (metadataService, $q) {
|
|
var metadataModel = {
|
|
cache: {},
|
|
allStatuses: [],
|
|
allStatusReasons: []
|
|
};
|
|
metadataModel.getMetadataByType = function (type) {
|
|
if (metadataModel.cache[type]) {
|
|
var isAngularPromise = _.has(metadataModel.cache[type], '$$state.status');
|
|
return $q.when(isAngularPromise ? metadataModel.cache[type] : angular.copy(metadataModel.cache[type]));
|
|
}
|
|
metadataModel.cache[type] = metadataService.getMetadataByType(type).then(function (response) {
|
|
metadataModel.cache[type] = response[0];
|
|
if (response[0] && response[0].statuses) {
|
|
addStatusReason(response[0].statuses, type);
|
|
metadataModel.allStatuses = _.uniqBy((metadataModel.allStatuses.concat(response[0].statuses)), 'name');
|
|
}
|
|
return angular.copy(metadataModel.cache[type]);
|
|
});
|
|
return metadataModel.cache[type];
|
|
};
|
|
function addStatusReason(allStatuses, type) {
|
|
_.forEach(allStatuses, function (status) {
|
|
if (status.statusReasons && status.statusReasons.length) {
|
|
metadataModel.allStatusReasons.push(status.statusReasons);
|
|
}
|
|
});
|
|
if (metadataModel.cache[type] && metadataModel.cache[type].consoleColumns
|
|
&& metadataModel.cache[type].consoleColumns.statusReason && metadataModel.cache[type].consoleColumns.statusReason.length) {
|
|
metadataModel.allStatusReasons.push(metadataModel.cache[type].consoleColumns.statusReason);
|
|
}
|
|
metadataModel.allStatusReasons = _.uniqBy(_.flattenDeep(metadataModel.allStatusReasons), 'name');
|
|
}
|
|
metadataModel.getMetadataByTypes = function (types) {
|
|
var requestMetadataForTicketTypes = [], metadataPromises = [], collectedMetaData = [];
|
|
_.forEach(types, function (type) {
|
|
if (!metadataModel.cache[type]) {
|
|
requestMetadataForTicketTypes.push(type);
|
|
}
|
|
else if (_.has(metadataModel.cache[type], '$$state.status')) {
|
|
metadataPromises.push(metadataModel.cache[type]);
|
|
}
|
|
else {
|
|
collectedMetaData.push(angular.copy(metadataModel.cache[type]));
|
|
}
|
|
});
|
|
if (!requestMetadataForTicketTypes.length && !metadataPromises.length) {
|
|
return $q.when(collectedMetaData);
|
|
}
|
|
if (requestMetadataForTicketTypes.length) {
|
|
var requestMetadataPromise = metadataService.getMetadataByType(requestMetadataForTicketTypes);
|
|
metadataPromises.push(requestMetadataPromise);
|
|
_.forEach(requestMetadataForTicketTypes, function (requestTicketType) {
|
|
metadataModel.cache[requestTicketType] = requestMetadataPromise;
|
|
});
|
|
}
|
|
return $q.all(metadataPromises).then(function (metadataResponses) {
|
|
_.forEach(metadataResponses, function (metadataArray) {
|
|
if (Array.isArray(metadataArray)) {
|
|
_.forEach(metadataArray, loadMetadata);
|
|
}
|
|
else {
|
|
loadMetadata(metadataArray);
|
|
}
|
|
function loadMetadata(metadata) {
|
|
metadataModel.cache[metadata.metadatatype] = metadata;
|
|
addStatusReason(metadata.statuses, metadata.metadatatype);
|
|
metadataModel.allStatuses = _.uniqBy((metadataModel.allStatuses.concat(metadata.statuses)), 'name');
|
|
}
|
|
});
|
|
//Return metadata in the same sequence in which it was demanded
|
|
collectedMetaData = [];
|
|
_.forEach(types, function (metadataType) {
|
|
collectedMetaData.push(metadataModel.cache[metadataType]);
|
|
});
|
|
return collectedMetaData;
|
|
});
|
|
};
|
|
//person metadata call for creating a new customer, we don't use type here when we make the backend call
|
|
// because this is not a ticket, it is a resource
|
|
metadataModel.getPersonMetadata = function (type) {
|
|
metadataModel.cache[type] = metadataService.getPersonMetadata().then(function (response) {
|
|
metadataModel.cache[type] = response[0];
|
|
return angular.copy(metadataModel.cache[type]);
|
|
});
|
|
return metadataModel.cache[type];
|
|
};
|
|
return metadataModel;
|
|
}]);
|
|
})();
|