123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- *+------------------------------------------------------------------------+
- *| 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;
- }
- }
|