/* *+------------------------------------------------------------------------+ *| Licensed Materials - Property of IBM *| IBM Cognos Products: Content Explorer *| (C) Copyright IBM Corp. 2015, 2018 *| *| US Government Users Restricted Rights - Use, duplication or disclosure *| restricted by GSA ADP Schedule Contract with IBM Corp. *+------------------------------------------------------------------------+ */ import { GlassContextHelper } from '@businessanalytics/content-nav'; export class AddFolderAction { constructor() { this.duplicateFileCount = 0; } addFolder = (glassContext, url, fileName, fileList, l10n) => { if (!fileName || fileName === '') { fileName = l10n.get('newFolderDefaultName'); } const requestOptions = { 'headers': { 'Accept': 'application/json', 'Content-Type': 'application/json' }, 'type': 'POST', 'url': url, 'data': JSON.stringify({ defaultName: fileName, type: 'folder' }) }; if(this.includesUnsafeApostrophe(fileName)){ GlassContextHelper.displayToast(glassContext, 'cannot create a folder with \' and " characters', { type: 'error' }); return Promise.reject('cannot include both \' and "'); } return glassContext.getCoreSvc('.Ajax').ajax(requestOptions) .then(() => { this.duplicateFileCount = 0; return Promise.resolve(fileName); }) .catch((err) => { return this.handleAddItemError(glassContext, err, fileName, fileList, l10n) .then((data) => { return this.addFolder(glassContext, url, data.fileName, fileList); }) .catch((err) => { GlassContextHelper.showAjaxServiceError(glassContext, err); return Promise.reject(err); }); }); } includesUnsafeApostrophe = (fileName) => { if ((fileName.indexOf('\'') > -1) && (fileName.indexOf('"') > -1)){ return true; } else { return false; } }; handleAddItemError = (glassContext, err, fileName, fileList, l10n) => { if (err.code === 400) { if (this.isNameConflict(err)){ const newFileName = this.getNewNameString(fileName, fileList); if (this.duplicateFileCount < 20){ return Promise.resolve({ fileName: newFileName }); } else if (this.duplicateFileCount >= 20) { const errorMsg = l10n.get('itemsOverLimit', { itemName: fileName }); GlassContextHelper.displayToast(glassContext, errorMsg, { type: 'error' }); let responseJSON = err.jqXHR && err.jqXHR.responseJSON || {}; responseJSON.messages.splice(1, 1); responseJSON.messages[0] = errorMsg; return Promise.reject(errorMsg); } } else if (this.isStringTruncationError(err)) { const errorMsg = l10n.get('errorMessageLengthFolderName'); GlassContextHelper.displayToast(glassContext, errorMsg, { type: 'error' }); let responseJSON = err.jqXHR && err.jqXHR.responseJSON || {}; responseJSON.messages.splice(1, 1); responseJSON.messages[0] = errorMsg; return Promise.reject(errorMsg); } } return Promise.reject(err); } isStringTruncationError = (error) => { const errorCode = (error && error.jqXHR && error.jqXHR.responseJSON && error.jqXHR.responseJSON.errorCode) || ''; if (error && error.code === 400) { return (errorCode.indexOf('cmStringTruncationException') !== -1); } } // TODO: move this general function to a content-nav ContentManagement file isNameConflict = (error) => { const errorCode = (error && error.jqXHR && error.jqXHR.responseJSON && error.jqXHR.responseJSON.errorCode) || ''; if (error && error.code === 400) { if (errorCode.indexOf('cmUpdateFailed1') !== -1) { //check if we have a CM-REQ-4036 error (duplicate error). var jqXHRMessages = error.jqXHR.responseJSON.messages || []; return jqXHRMessages.some((message) => { return message.indexOf('CM-REQ-4036') !== -1; }); } else { return ['cmDuplicateName','cmNameConflict', 'cmDuplicateObject'].indexOf(errorCode) !== -1; } } return false; } // TODO: possibly move this to another helper file getNewNameString = (fileName, fileList) => { let duplicateNameList = []; fileList.map((item) => { const name = item.defaultName.toLowerCase(); if (name.indexOf(fileName.toLowerCase()) === 0) { duplicateNameList.push(name); } }); let newNameString; for (var i = 1; i <= duplicateNameList.length; i++) { newNameString = fileName + ' (' + i + ')'; if(!duplicateNameList.includes(newNameString.toLowerCase())){ break; } } this.duplicateFileCount = i; return newNameString ? newNameString : fileName; } }