creating meta data creation component(first tab)
[ccsdk/cds.git] / cds-ui / designer-client / src / app / modules / feature-modules / packages / package-creation / package-creation.component.ts
1 /*
2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2019 Orange. All rights reserved.
5 ===================================================================
6
7 Unless otherwise specified, all software contained herein is licensed
8 under the Apache License, Version 2.0 (the License);
9 you may not use this software except in compliance with the License.
10 You may obtain a copy of the License at
11
12     http://www.apache.org/licenses/LICENSE-2.0
13
14 Unless required by applicable law or agreed to in writing, software
15 distributed under the License is distributed on an "AS IS" BASIS,
16 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 See the License for the specific language governing permissions and
18 limitations under the License.
19 ============LICENSE_END============================================
20 */
21
22 import {Component, OnInit} from '@angular/core';
23 import {FilesContent, FolderNodeElement, MetaDataFile, MetaDataTab} from './mapping-models/metadata/MetaDataTab.model';
24 // import {saveAs} from 'file-saver/dist/FileSaver';
25 import * as JSZip from 'jszip';
26 import {Observable} from 'rxjs';
27 import {ApiService} from '../../../../common/core/services/api.service';
28 import {BlueprintURLs} from '../../../../common/constants/app-constants';
29 import {Import, Metadata, VlbDefinition} from './mapping-models/definitions/VlbDefinition';
30 import {JsonConvert} from 'json2typescript';
31 import {JsonPipe} from '@angular/common';
32 import {PackageCreationService} from './package-creation.service';
33 import {PackageCreationUtils} from './package-creation.utils';
34 import List = _.List;
35 import {Router} from '@angular/router';
36
37 @Component({
38     selector: 'app-package-creation',
39     templateUrl: './package-creation.component.html',
40     styleUrls: ['./package-creation.component.css']
41 })
42 export class PackageCreationComponent implements OnInit {
43     counter = 0;
44     modes: object[] = [
45         {name: 'Designer Mode', style: 'mode-icon icon-designer-mode'},
46         {name: 'Scripting Mode', style: 'mode-icon icon-scripting-mode'}];
47     customKeysAndValues: Map<string, string> = new Map<string, string>();
48
49     dictionaryLibraryInstances: string[] = ['x', 'y'];
50     private container: HTMLElement;
51     private elements: HTMLCollection;
52     private newElement: HTMLElement;
53     private metaDataTab: MetaDataTab = new MetaDataTab();
54
55     private result: string;
56
57     private folder: FolderNodeElement = new FolderNodeElement();
58     private zipFile: JSZip = new JSZip();
59     private filesData: any = [];
60     private errorMessage: string;
61     private keys: NodeListOf<HTMLElement>;
62     private values: NodeListOf<HTMLElement>;
63
64
65     constructor(private packageCreationService: PackageCreationService, private packageCreationUtils: PackageCreationUtils,
66                 private router: Router) {
67     }
68
69     ngOnInit() {
70         // this.customKeysAndValues.set('Dictionary Library Instances', ' ');
71         this.keys = document.getElementsByName('key');
72         this.values = document.getElementsByName('value');
73     }
74
75
76     createAnotherCustomKeyDiv() {
77         this.newElement = document.getElementById('target');
78         const id = this.newElement.getAttribute('id');
79         this.newElement.setAttribute('id', 'target' + this.counter++);
80         const copiedElement = this.newElement.cloneNode(true);
81         this.container = document.getElementById('container');
82         this.container.appendChild(copiedElement);
83         this.elements = this.container.children;
84         this.newElement.setAttribute('id', id);
85         this.clearCopiedElement();
86
87         // console.log(this.packageCreationService.checkBluePrintNameAndVersion(this.metaDataTab.name, this.metaDataTab.version));
88         /*this.metaDataTab = new MetaDataTab();
89         this.metaDataTab.name = 'klfdj';
90         this.metaDataTab.entryFileName = 'Definitions/vLB_CDS.json';
91         this.metaDataTab.description = 'rere';
92         this.metaDataTab.tags = 'ffsssssss';
93         this.metaDataTab.version = '1.01.10';
94         this.metaDataTab.templateName = 'test';
95
96
97         this.saveToFileSystem(MetaDataFile.getObjectInstance(this.metaDataTab));*/
98     }
99
100     private clearCopiedElement() {
101         const newCopiedElement: HTMLInputElement = document.getElementById('target' + (this.counter - 1)) as HTMLInputElement;
102         const inputElements = newCopiedElement.getElementsByTagName('input');
103         for (let i = 0; i < inputElements.length; i++) {
104             const element: HTMLInputElement = inputElements.item(i) as HTMLInputElement;
105             element.value = '';
106         }
107     }
108
109
110     validatePackageNameAndVersion() {
111         if (this.metaDataTab.name && this.metaDataTab.version) {
112             this.packageCreationService.checkBluePrintNameAndVersion(this.metaDataTab.name, this.metaDataTab.version).then(element => {
113                 if (element) {
114                     this.errorMessage = 'the package with name and version is exists';
115                 } else {
116                     this.errorMessage = ' ';
117                 }
118             });
119         }
120
121     }
122
123     getDictionaryLibraryInstances() {
124
125
126     }
127
128     saveMetaData() {
129         for (let i = 0; i < this.values.length; i++) {
130             const inputKeyElement: HTMLInputElement = this.keys.item(i) as HTMLInputElement;
131             const inputKey: string = inputKeyElement.value;
132             const inputValueElement: HTMLInputElement = this.values.item(i) as HTMLInputElement;
133             const inputValue: string = inputValueElement.value;
134             this.customKeysAndValues.set(inputKey, inputValue);
135         }
136
137         this.metaDataTab.mapOfCustomKey = this.customKeysAndValues;
138         this.setModeType(this.metaDataTab);
139         this.setEntryPoint(this.metaDataTab);
140
141         this.addToscaMetaDataFile(this.metaDataTab);
142
143         const vlbDefinition: VlbDefinition = new VlbDefinition();
144         this.fillVLBDefinition(vlbDefinition, this.metaDataTab);
145
146         this.filesData.push(this.folder.TREE_DATA);
147         this.saveToBackend();
148         this.packageCreationService.refreshPackages();
149         this.router.navigate(['/packages']);
150
151     }
152
153     addToscaMetaDataFile(metaDataTab: MetaDataTab) {
154         const filename = 'TOSCA.meta';
155         FilesContent.putData(filename, MetaDataFile.getObjectInstance(this.metaDataTab));
156     }
157
158     private setModeType(metaDataTab: MetaDataTab) {
159         if (metaDataTab.mode.startsWith('Scripting')) {
160             metaDataTab.mode = 'KOTLIN_SCRIPT';
161         } else if (metaDataTab.mode.startsWith('Designer')) {
162             metaDataTab.mode = 'DEFAULT';
163         } else {
164             metaDataTab.mode = 'GENERIC_SCRIPT';
165         }
166     }
167
168     saveToBackend() {
169         this.create();
170         this.zipFile.generateAsync({type: 'blob'})
171             .then(blob => {
172                 this.saveBluePrint(blob);
173
174             });
175     }
176
177
178     private saveBluePrint(blob) {
179         const formData = new FormData();
180         formData.append('file', blob);
181         this.packageCreationService.saveBlueprint(formData)
182             .subscribe(
183                 data => {
184                     console.log('Success:' + JSON.stringify(data));
185                 }, error => {
186                     console.log('Error -' + error.message);
187                 });
188     }
189
190     create() {
191         this.folder.TREE_DATA.forEach((path) => {
192
193             const name = path.name;
194             if (path.children) {
195                 this.zipFile.folder(name);
196                 path.children.forEach(children => {
197                     const name2 = children.name;
198                     if (FilesContent.getMapOfFilesNamesAndContent().has(name2)) {
199                         this.zipFile.file(name + '/' + name2, FilesContent.getMapOfFilesNamesAndContent().get(name2));
200                     } else {
201                     }
202
203                 });
204
205             }
206         });
207     }
208
209
210     deleteCustomKey(event) {
211         this.container = document.getElementById('container');
212         const element = event.parentElement.parentElement.parentElement;
213         this.container.removeChild(element);
214     }
215
216
217     private setEntryPoint(metaDataTab: MetaDataTab) {
218         if (metaDataTab.mode.startsWith('DEFAULT')) {
219             metaDataTab.entryFileName = 'Definitions/vLB_CDS.json';
220         } else {
221             metaDataTab.entryFileName = '';
222         }
223
224
225     }
226
227     private fillVLBDefinition(vlbDefinition: VlbDefinition, metaDataTab: MetaDataTab) {
228
229         const metadata: Metadata = new Metadata();
230         metadata.template_author = 'Shaaban';
231         metadata.template_name = metaDataTab.templateName;
232         metadata.template_tags = metaDataTab.tags;
233
234         metadata.dictionary_group = 'default';
235         metadata.template_version = metaDataTab.version;
236         metadata['author-email'] = 'shaaban.altanany.ext@orange.com';
237         metadata['user-groups'] = 'ADMIN';
238         // metadata.mapOfCustomKeys = this.metaDataTab.mapOfCustomKey;
239         vlbDefinition.tosca_definitions_version = metaDataTab.version;
240         vlbDefinition.metadata = metadata;
241
242         // console.log(vlbDefinition.metadata.mapOfCustomKeys);
243         const value = this.packageCreationUtils.transformToJson(vlbDefinition);
244         console.log(value);
245         FilesContent.putData('vLB_CDS.json', value);
246     }
247 }