SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/knowledge-article/knowledge-article-model.js

302 lines
17 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('knowledgeArticleModule')
.factory('knowledgeArticleModel', ['knowledgeArticleService', '$q', 'searchService', 'configurationModel', 'metadataModel', 'systemAlertService', '$filter',
function (knowledgeArticleService, $q, searchService, configurationModel, metadataModel, systemAlertService, $filter) {
var knowledgeArticleModel = {
articles: {},
articleRevisions: {},
visibilities: {},
visitedArticlesCache: {}
}, serializationMap = configurationModel.get('knowledgeArticle.categorySerializationMap'), restrictionMap = configurationModel.get('knowledgeArticle.restrictionMap');
knowledgeArticleModel.getKnowledgeArticleById = function (id, ignoreCache, preventIncrement) {
if (knowledgeArticleModel.articles[id] && !ignoreCache) {
if (!preventIncrement) {
knowledgeArticleService.incrementViewCount(id, preventIncrement);
}
return $q.when(knowledgeArticleModel.articles[id]);
}
return knowledgeArticleService.getArticleById(id, !!preventIncrement).then(function (article) {
knowledgeArticleModel.articles[id] = article;
return article;
});
};
knowledgeArticleModel.getArticleRevisionsById = function (id, ignoreCache) {
if (!knowledgeArticleModel.articleRevisions[id] || ignoreCache) {
knowledgeArticleModel.articleRevisions[id] = knowledgeArticleService.getArticleRevisions(id).then(function (revisions) {
knowledgeArticleModel.articleRevisions[id] = revisions;
return revisions;
});
}
return $q.when(knowledgeArticleModel.articleRevisions[id]);
};
knowledgeArticleModel.rateArticle = function (articleId, vote) {
knowledgeArticleModel.articles[articleId].voted = (vote ? 'yes' : 'nope');
vote ? knowledgeArticleModel.articles[articleId].useCount++ : knowledgeArticleModel.articles[articleId].notUsefulCount++;
knowledgeArticleModel.articles[articleId].recalculateRating();
return knowledgeArticleService.rateArticle(articleId, vote);
};
knowledgeArticleModel.getDraft = function (templateId, context) {
if (context && context.type === EntityVO.TYPE_PROBLEM) {
return knowledgeArticleService.getProblemDraft(context.id, templateId);
}
if (context && context.type === EntityVO.TYPE_KNOWNERROR) {
return knowledgeArticleService.getKnownErrorDraft(context.id, templateId);
}
if (context && context.type === EntityVO.TYPE_INCIDENT) {
return knowledgeArticleService.getIncidentDraft(context.id, templateId);
}
if (context && context.type === EntityVO.TYPE_WORKORDER) {
return knowledgeArticleService.getWorkorderDraft(context.id, templateId);
}
return knowledgeArticleService.getDraft(templateId);
};
knowledgeArticleModel.getVisibilityByCompanyName = function (companyName, chunkSize) {
if (knowledgeArticleModel.visibilities[companyName]) {
return $q.when(knowledgeArticleModel.visibilities[companyName]);
}
return knowledgeArticleService.getVisibility(companyName, chunkSize).then(function (result) {
knowledgeArticleModel.visibilities[companyName] = result;
return result;
});
};
knowledgeArticleModel.getVisibilityGroupsByText = function (companyName, searchText, chunkSize) {
return knowledgeArticleService.getVisibilityByText(companyName, searchText, chunkSize).then(function (response) {
return response;
});
};
knowledgeArticleModel.findArticleByText = function (params, options, sortOptions) {
var jsonParams = {
types: ['knowledge']
};
if (sortOptions && sortOptions.sortFieldName) {
params.sortFieldName = sortOptions.sortFieldName;
params.sortFieldOrder = sortOptions.sortFieldOrder;
}
if (!_.isEmpty(options)) {
jsonParams = _.merge(jsonParams, options);
}
return searchService.getGlobalSearchResults(params, jsonParams).then(function (data) {
return data.items[0].results;
});
};
knowledgeArticleModel.getHKMRecommendedKA = function (queryParams, payload) {
if (queryParams.chunk_size) {
queryParams = {
chunk_size: queryParams.chunk_size
};
}
else {
queryParams = {};
}
return searchService.getHKMRecommendedKA(queryParams, payload).then(function (data) {
return data.items[0].results;
});
};
knowledgeArticleModel.createArticle = function (loginId, articleFull) {
return knowledgeArticleService.createArticle(loginId, prepareArticle(articleFull)).then(function (article) {
knowledgeArticleModel.articles[article.id] = article;
return article;
});
};
knowledgeArticleModel.update = function (oldArticle, isMinorEdit, articleRevisionList) {
var propsToUpdate = ['title', 'content'], params = _.pick(oldArticle, propsToUpdate);
params.isMinorEdit = isMinorEdit;
return knowledgeArticleService.updateArticle(oldArticle.uuid, params).then(function (article) {
if (isMinorEdit) {
var articleObject = knowledgeArticleModel.articles[article.uuid] ? knowledgeArticleModel.articles[article.uuid] : knowledgeArticleModel.articles[article.articleId];
angular.extend(articleObject, _.pick(article, propsToUpdate));
}
else {
if (articleRevisionList && articleRevisionList.length > 0) {
_.forEach(articleRevisionList, function (revision) {
knowledgeArticleModel.articleRevisions[revision.id] = null;
});
}
else {
knowledgeArticleModel.articleRevisions[oldArticle.uuid] = null;
}
knowledgeArticleModel.articles[oldArticle.uuid] = null;
knowledgeArticleModel.articles[article.uuid] = article;
}
return knowledgeArticleModel.articles[article.uuid];
});
};
knowledgeArticleModel.updateArticleMetadata = function (article, oldArticleData) {
var propsToUpdate = getPropsToUpdateMetadata(article.accessMappings);
article = prepareArticle(article);
var params = _.pick(article, propsToUpdate);
if (_.indexOf(propsToUpdate, "assignee") !== -1 && article.assigneeGroup) {
params.assigneeGroup = article.assigneeGroup.name;
params.assigneeOrganization = article.assigneeGroup.organization;
params.assigneeGroupId = article.assigneeGroup.id;
params.assigneeCompany = article.assigneeGroup.company && article.assigneeGroup.company.name;
}
params.isMinorEdit = true;
if (article.autoAssign) {
params.isAutoAssign = article.autoAssign;
delete params.assignee;
delete params.assigneeGroup;
delete params.assigneeGroupId;
delete params.assigneeCompany;
delete params.assigneeOrganization;
}
if (propsToUpdate.indexOf("nextReviewDate") !== -1 && oldArticleData && (params.nextReviewDate || oldArticleData.nextReviewDate)
&& article.status && article.status.value === 'Published'
&& Date.parse(params.nextReviewDate) !== Date.parse(oldArticleData.nextReviewDate)) {
var currentDate = new Date();
currentDate.setHours(0, 0, 0, 0);
if (params.nextReviewDate === undefined || params.nextReviewDate === null || (params.nextReviewDate && params.nextReviewDate < currentDate)) {
systemAlertService.error({
text: $filter('i18n')('create.ticket.invalid.requiredDate')
});
delete params.nextReviewDate;
}
else if (params.nextReviewDate && Date.parse(params.nextReviewDate) !== Date.parse(oldArticleData.nextReviewDate)) {
params.nextReviewDate = params.nextReviewDate.valueOf();
}
}
else {
delete params.nextReviewDate;
}
return knowledgeArticleService.updateArticle(article.uuid, params).then(function (article) {
angular.extend(knowledgeArticleModel.articles[article.uuid], _.pick(article, propsToUpdate));
return article;
});
};
function getPropsToUpdateMetadata(accessMappings) {
var props = [];
_.forIn(restrictionMap, function (value, property) {
props = props.concat(accessMappings[property] ? value : []);
});
return props;
}
function prepareArticle(articleFull) {
var article = _.omit(articleFull, ['accessMappings', 'defaultCategorization']);
article.tags = article.tags.join(',');
//splitting temporary all* property into primary and additional
_.forEach(serializationMap, function (field) {
article[field.primary] = _.isArray(article[field.primary]) ? _.filter(article[field.all], 'primary') : (_.find(article[field.all], 'primary') || {});
article[field.additional] = _.reject(article[field.all], 'primary');
delete article[field.all];
});
return article;
}
knowledgeArticleModel.getAutoSavedCopy = function (articleId) {
return knowledgeArticleService.getAutoSavedCopy(articleId);
};
knowledgeArticleModel.autoSave = function (article) {
return knowledgeArticleService.autoSave(article);
};
knowledgeArticleModel.removeAutoSavedCopy = function (articleId) {
return knowledgeArticleService.removeAutoSavedCopy(articleId);
};
knowledgeArticleModel.checkEditStatus = function (articleId) {
return knowledgeArticleService.checkEditStatus(articleId);
};
knowledgeArticleModel.mergeArticleMetaData = function (article, oldArticle, content) {
//TODO: refactor that
article.visibility = oldArticle.visibility;
article.author = oldArticle.author;
article.selectedAssignee = oldArticle.selectedAssignee;
article.tags = oldArticle.tags;
article.allSites = oldArticle.allSites;
article.allServices = oldArticle.allServices;
article.allOrganizations = oldArticle.allOrganizations;
article.linkedItems = oldArticle.linkedItems;
article.title = oldArticle.title;
article.content = content;
return article;
};
knowledgeArticleModel.refreshStatus = function (id, statusData) {
var article = knowledgeArticleModel.articles[id];
var metadata = metadataModel.cache[EntityVO.TYPE_KNOWLEDGE];
article.status.value = _.find(metadata.statuses, { name: statusData.status }).name;
if (!_.isEmpty(statusData.updatedTickets)) {
var currentArticle = _.find(statusData.updatedTickets, function (updatedTicket) {
return updatedTicket.id === id;
});
article.accessMappings = currentArticle.accessMappings;
}
};
knowledgeArticleModel.getKnowledgeArticleTemplates = function () {
if (!_.isUndefined(knowledgeArticleModel.knowledgeArticleTemplates)) {
return $q.when(knowledgeArticleModel.knowledgeArticleTemplates);
}
return knowledgeArticleService.getKnowledgeArticleTemplates().then(function (templates) {
knowledgeArticleModel.knowledgeArticleTemplates = templates;
return templates;
});
};
knowledgeArticleModel.updateTemplateStyles = function (templateID, styles) {
var params = {};
params.templateID = templateID;
params.styles = styles;
return knowledgeArticleService.updateTemplateStyles(params).then(function (data) {
updateExistingTemplates(data);
return data;
});
};
function updateExistingTemplates(data) {
if (!knowledgeArticleModel.knowledgeArticleTemplates) {
return;
}
_.find(knowledgeArticleModel.knowledgeArticleTemplates, { name: data.templateID }).templateObject.styles = data.styles;
}
knowledgeArticleModel.updateCachedArticles = function (ids, update) {
_.forEach(ids, function (id) {
knowledgeArticleModel.articles[id] && angular.extend(knowledgeArticleModel.articles[id], update);
});
};
knowledgeArticleModel.getPotentialPrimary = function (params) {
return knowledgeArticleService.getPotentialPrimary(params);
};
knowledgeArticleModel.markArticleVisited = function (articleId, ticketId) {
if (knowledgeArticleModel.visitedArticlesCache[ticketId]) {
if (!(_.includes(knowledgeArticleModel.visitedArticlesCache[ticketId], articleId))) {
knowledgeArticleModel.visitedArticlesCache[ticketId].push(articleId);
}
}
else {
knowledgeArticleModel.visitedArticlesCache[ticketId] = [articleId];
}
};
knowledgeArticleModel.getVisitedArticlesForTicket = function (ticketId) {
if (!knowledgeArticleModel.visitedArticlesCache[ticketId]) {
knowledgeArticleModel.visitedArticlesCache = {};
return null;
}
return knowledgeArticleModel.visitedArticlesCache[ticketId];
};
knowledgeArticleModel.clearVisitedArticlesForTicket = function (ticketId) {
if (knowledgeArticleModel.visitedArticlesCache[ticketId]) {
knowledgeArticleModel.visitedArticlesCache = {};
}
};
knowledgeArticleModel.getAssessmentQuestions = function (companyName, organization) {
return knowledgeArticleService.getAssessmentQuestions(companyName, organization);
};
knowledgeArticleModel.submitAssessment = function (articleId, answers) {
return knowledgeArticleService.submitAssessment(articleId, answers);
};
knowledgeArticleModel.getQuestionSetList = function () {
return knowledgeArticleService.getQuestionSetList();
};
knowledgeArticleModel.getQuestionSetById = function (questionSetId) {
return knowledgeArticleService.getQuestionSetById(questionSetId);
};
knowledgeArticleModel.deleteQuestionSetById = function (questionSetId) {
return knowledgeArticleService.deleteQuestionSetById(questionSetId);
};
knowledgeArticleModel.createQuestionSet = function (postdata) {
return knowledgeArticleService.createQuestionSet(postdata);
};
knowledgeArticleModel.updateQuestionSet = function (questionSetId, postdata) {
return knowledgeArticleService.updateQuestionSet(questionSetId, postdata);
};
return knowledgeArticleModel;
}
]);
}());