302 lines
17 KiB
JavaScript
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;
|
|
}
|
|
]);
|
|
}());
|