*/
'use strict';
-import _ from 'lodash'
+import _isNumber from 'lodash/isNumber'
+import _cloneDeep from 'lodash/cloneDeep'
+import _isEmpty from 'lodash/isEmpty'
+import _mergeWith from 'lodash/mergeWith'
+import _uniqBy from 'lodash/uniqBy'
+import _isEqual from 'lodash/isEqual'
+import _findIndex from 'lodash/findIndex'
+import _remove from 'lodash/remove'
import d3 from 'd3'
import alt from '../alt'
import UID from '../libraries/UniqueId'
const getDefault = (name, defaultValue) => {
const val = window.localStorage.getItem('defaults-' + name);
if (val) {
- if (_.isNumber(val)) {
+ if (_isNumber(val)) {
if (val < 0) {
return setDefault(name, 0);
}
showDescriptor: ComposerAppActions.showDescriptor,
getFilelistSuccess: FileManagerActions.getFilelistSuccess,
updateFileLocationInput: FileManagerActions.updateFileLocationInput,
- sendDownloadFileRequst: FileManagerActions.sendDownloadFileRequst,
+ sendDownloadFileRequest: FileManagerActions.sendDownloadFileRequest,
addFileSuccess: FileManagerActions.addFileSuccess,
deletePackageFile: FileManagerActions.deletePackageFile,
deleteFileSuccess: FileManagerActions.deleteFileSuccess,
+ deleteFileError: FileManagerActions.deleteFileError,
closeFileManagerSockets: FileManagerActions.closeFileManagerSockets,
openFileManagerSockets: FileManagerActions.openFileManagerSockets,
openDownloadMonitoringSocketSuccess: FileManagerActions.openDownloadMonitoringSocketSuccess,
d.cpNumber = ++cpNumber;
containers.filter(d => DescriptorModelFactory.isVnfdConnectionPointRef(d)).filter(ref => ref.key === d.key).forEach(ref => ref.cpNumber = d.cpNumber);
});
- this.setState({containers: containers, item: _.cloneDeep(item)});
+ this.setState({containers: containers, item: _cloneDeep(item)});
}
SelectionManager.refreshOutline();
}
}
SelectionManager.select(item);
this.updateItem(item);
- this.openFileManagerSockets(item)
+ if (item) {
+ this.openFileManagerSockets(item);
+ }
}
catalogItemMetaDataChanged(item) {
this.updateItem(item);
applyDefaultLayout() {
if (this.item && this.item.uiState && this.item.uiState.containerPositionMap) {
- if (!_.isEmpty(this.item.uiState.containerPositionMap)) {
+ if (!_isEmpty(this.item.uiState.containerPositionMap)) {
this.item.uiState.containerPositionMap = {};
CatalogItemsActions.catalogItemMetaDataChanged.defer(this.item);
}
if (isFullScreen()) {
const layout = comp.layout;
- const restoreLayout = _.cloneDeep(layout);
+ const restoreLayout = _cloneDeep(layout);
uiTransientState.restoreLayout = restoreLayout;
layout.left = 0;
layout.right = 0;
if (self.fileMonitoringSocketID) {
let newState = {};
if(data.hasOwnProperty('contents')) {
- filesState = addInputState( _.cloneDeep(this.filesState),data);
- // filesState = _.merge(self.filesState, addInputState({},data));
+ filesState = updateFileState( _cloneDeep(this.filesState),data);
let normalizedData = normalizeTree(data);
newState = {
files: {
- data: _.mergeWith(normalizedData.data, self.files.data, function(obj, src) {
- return _.uniqBy(obj? obj.concat(src) : src, 'name');
+ data: _mergeWith(normalizedData.data, self.files.data, function(obj, src) {
+ return _uniqBy(obj? obj.concat(src) : src, 'name');
}),
id: normalizedData.id
},
files: false
}
}
+ if(!_isEqual(newState.files, this.files) || ! _isEqual(newState.fileState, this.fileState)) {
+ this.setState(newState);
+ }
- this.setState(newState);
}
function normalizeTree(data) {
let f = {
id:[],
data:{}
};
- data.contents.map(getContents);
function getContents(d) {
if(d.hasOwnProperty('contents')) {
let contents = [];
f.data[d.name] = contents;
}
}
+ getContents(data);
return f;
}
- function addInputState(obj, d) {
+ function updateFileState(obj, d) {
d.newFile = '';
if(d.hasOwnProperty('contents')) {
- d.contents.map(addInputState.bind(null, obj))
- }
- if(!obj[d.name]) {
- obj[d.name] = '';
+ d.contents.map(updateFileState.bind(null, obj))
}
+ // override any "pending" state we may have initialized
+ obj[d.name] = '';
return obj;
}
}
- sendDownloadFileRequst(data) {
+ sendDownloadFileRequest(data) {
let id = data.id || this.item.id;
let type = data.type || this.item.uiState.type;
+ let assetType = data.assetType;
let path = data.path;
let url = data.url;
- this.getInstance().addFile(id, type, path, url, data.refresh);
+ this.getInstance().addFile(id, type, assetType, path, url, data.refresh);
}
updateFileLocationInput = (data) => {
let name = data.name;
let value = data.value;
- var filesState = _.cloneDeep(this.filesState);
+ var filesState = _cloneDeep(this.filesState);
filesState[name] = value;
this.setState({
filesState: filesState
addFileSuccess = (data) => {
if(!data.refresh) {
let path = data.path;
+ if (path.startsWith('readme')) {
+ // this asset type stuff should be in a more common location
+ // this is a wee bit of a hack till it is
+ path = '.' + path.slice(6);
+ }
let fileName = data.fileName;
- let files = _.cloneDeep(this.files);
- let loadingIndex = files.data[path].push({
- status: 'DOWNLOADING',
- name: path + '/' + fileName
- }) - 1;
- this.setState({files: files});
+ let files = _cloneDeep(this.files);
+ let assetGroup = files.data[path] || [];
+ if (fileName) {
+ let name = path + '/' + fileName;
+ if (assetGroup.findIndex(f => f.name === name) == -1){
+ assetGroup.push({name});
+ }
+ }
+ files.data[path] = assetGroup;
+ if (files.id.indexOf(path) == -1){
+ files.id.push(path);
+ }
+ let filesState = _cloneDeep(this.filesState);
+ filesState[name] = "DOWNLOADING";
+ this.setState({files, filesState});
}
}
openDownloadMonitoringSocketSuccess = (id) => {
let self = this;
let ws = window.multiplexer.channel(id);
- let downloadJobs = _.cloneDeep(self.downloadJobs);
+ let downloadJobs = _cloneDeep(self.downloadJobs);
let newFiles = false;
ws.onmessage = (socket) => {
if (self.files && self.files.length > 0) {
try {
jobs = JSON.parse(socket.data);
} catch(e) {}
- newFiles = _.cloneDeep(self.files);
+ newFiles = _cloneDeep(self.files);
jobs.map(function(j) {
//check if not in completed state
let fullPath = j['package-path'];
let path = fullPath.split('/');
let fileName = path.pop();
path = path.join('/');
- let index = _.findIndex(self.files.data[path], function(o){
+ let index = _findIndex(self.files.data[path], function(o){
return fullPath == o.name
});
if((index > -1) && newFiles.data[path][index]) {
}
this.setState({
+ filesState: [],
+ files: {
+ id:[],
+ data:{}
+ },
fileMonitoringSocketID: id,
fileMonitoringSocket: ws
})
endWatchingJob(id) {
}
- deletePackageFile(name) {
+ deletePackageFile(asset) {
+ let {assetType, path} = asset;
let id = this.item.id;
let type = this.item.uiState.type;
- this.getInstance().deleteFile(id, type, name);
+ this.getInstance().deleteFile(id, type, assetType, path);
}
deleteFileSuccess = (data) => {
- let path = data.path.split('/')
- let files = _.cloneDeep(this.files);
- path.pop();
- path = path.join('/');
- let pathFiles = files.data[path]
- _.remove(pathFiles, function(c) {
- return c.name == data.path;
+ let name = null;
+ let path = null;
+ if (data.assetFolder === 'readme'){
+ // freak'n root folder is special
+ name = data.path;
+ path = ['.'];
+ } else {
+ name = data.assetFolder + '/' + data.path;
+ path = name.split('/');
+ path.pop();
+ }
+ let files = _cloneDeep(this.files);
+ let filesForPath = files.data[path.join('/')]
+ _remove(filesForPath, function(c) {
+ return c.name == name;
});
this.setState({
files: files
})
}
+ deleteFileError = (error) => {
+ const filepath = error.path;
+ const message = error.data && error.data.output ? ' (' + error.data.output['error-trace'] + ')' : ' (server error)';
+ console.log('Unable to delete', filepath, 'Error:', message);
+ ComposerAppActions.showError.defer({
+ errorMessage: 'Unable to delete ' + filepath + message + '. '
+ });
+ }
+
newPathNameUpdated = (event) => {
const value = event.target.value;
this.setState({
newPathName: value
})
}
- createDirectory = () => {
+ createDirectory = (assetType) => {
console.log(this.newPathName);
- this.sendDownloadFileRequst({
+ this.sendDownloadFileRequest({
id: this.item.id,
type: this.item.uiState.type,
- path: this.item.name + '/' + this.newPathName,
+ assetType: assetType,
+ path: this.newPathName,
url: utils.getSearchParams(window.location).dev_download_server || window.location.protocol + '//' + window.location.host,
refresh: true
});