ui-modules/blueprint-composer/app/components/blueprint-data-manager/blueprint-data-manager.directive.js (104 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import angular from 'angular';
import template from './blueprint-data-manager.template.html';
import {saveAs} from 'file-saver/FileSaver';
const MODULE_NAME = 'brooklyn.components.blueprint-data-manager';
const TEMPLATE_URL = 'blueprint-composer/component/blueprint-data-manager/index.html';
const VALID_FILENAME_REGEX = /^.*\.ya?ml$/;
const FILETYPE_TOKEN_REGEX = /^.*\.(.*)$/;
angular.module(MODULE_NAME, [])
.directive('blueprintDataManager', blueprintDataManagerDirective)
.run(['$templateCache', templateCache]);
export default MODULE_NAME;
export function blueprintDataManagerDirective() {
return {
restrict: 'E',
templateUrl: function(tElement, tAttrs) {
return tAttrs.templateUrl || TEMPLATE_URL;
},
controller: ['$rootScope', '$scope', '$element', '$document', 'blueprintService', 'brSnackbar', controller]
};
function controller($rootScope, $scope, $element, $document, blueprintService, brSnackbar) {
var fileInputElement = null;
$scope.fileInputId = 'hidden-load-file-input-' + Math.random().toString(36).slice(2);
$scope.dragging = false;
$scope.targetActive = false;
$scope.openFileDialog = openFileDialog;
$scope.saveBlueprint = saveBlueprint;
$document.bind('drag dragstart dragend dragover dragenter dragleave drop', (event)=> {
event.preventDefault();
event.stopPropagation();
}).bind('drag dragstart dragover dragenter', (event)=> {
$element.addClass('drag-active');
}).bind('mouseout dragend drop', (event)=> {
$element.removeClass('drag-active');
$element.removeClass('drag-target-active');
});
$element.bind('drag dragstart dragend dragover dragenter dragleave drop', (event)=> {
event.preventDefault();
event.stopPropagation();
}).bind('dragstart dragover dragenter', (event)=> {
event.dataTransfer.dropEffect = 'copy';
$element.addClass('drag-active');
$element.addClass('drag-target-active');
}).bind('dragleave dragend drop', (event)=> {
$element.removeClass('drag-active');
$element.removeClass('drag-target-active');
}).bind('drop', (event)=> {
readFile(event.dataTransfer.files[0]);
});
$document.bind('keydown', (event)=> {
if (event.keyCode === 83 && (event.ctrlKey || event.metaKey)) {
event.preventDefault();
saveBlueprint();
}
});
function notify(message) {
$rootScope.$apply(brSnackbar.create(message));
}
function saveBlueprint() {
try {
var yaml = blueprintService.getAsYaml();
if (yaml.length > 0) {
var blob = new Blob([yaml], {type: 'text/plain;charset=' + document.inputEncoding || 'UTF-8'});
saveAs(blob, 'blueprint-' + Date.now() + '.yaml');
} else {
notify('Blueprint not saved ... empty');
}
} catch (error) {
notify('Blueprint saved');
}
}
function readFile(file) {
if (VALID_FILENAME_REGEX.test(file.name)) {
var reader = new FileReader();
reader.addEventListener('load', function () {
try {
var yaml = reader.result;
blueprintService.setFromYaml(yaml, true);
$rootScope.$broadcast('d3.redraw', true);
notify('Blueprint loaded successfully');
} catch (error) {
notify('Failed to load blueprint ' + error.message);
}
}, false);
reader.readAsText(file);
} else {
var match = file.name.match(FILETYPE_TOKEN_REGEX);
notify('Incorrect file type [' +
((match.length === 2) ? match[1] : match[0] ) + '] ... supported file types [yml, yaml]');
}
}
function openFileDialog() {
fileInputElement.click();
}
setTimeout(()=> {
fileInputElement = document.getElementById($scope.fileInputId);
fileInputElement.addEventListener('change', (e)=> {
readFile(e.target.files[0]);
}, false);
});
}
}
function templateCache($templateCache) {
$templateCache.put(TEMPLATE_URL, template);
}