diff options
55 files changed, 1524 insertions, 422 deletions
@@ -1,6 +1,6 @@ -## Format code with ktlint checkstyle tool use the following command +##### Format code with ktlint checkstyle tool use the following command -mvn process-source -P format +`mvn process-sources -P format` ## Reference diff --git a/cds-ui/designer-client/angular.json b/cds-ui/designer-client/angular.json index 436a0df6d..6219bf68a 100644 --- a/cds-ui/designer-client/angular.json +++ b/cds-ui/designer-client/angular.json @@ -36,6 +36,7 @@ "scripts": [ "./node_modules/ace-builds/src-min/ace.js", "./node_modules/ace-builds/src-min/theme-eclipse.js", + "./node_modules/ace-builds/src-min/theme-tomorrow_night_bright.js", "./node_modules/ace-builds/src-min/mode-json.js", "./node_modules/ace-builds/src-min/mode-javascript.js", "./node_modules/ace-builds/src-min/mode-python.js", @@ -49,6 +50,8 @@ "./node_modules/ace-builds/src-min/ext-beautify.js", "./node_modules/ace-builds/src-min/ext-searchbox.js", "./node_modules/ace-builds/src-min/ext-language_tools.js", + "./node_modules/ace-builds/src-min/worker-json.js", + "./node_modules/ace-builds/src-min/worker-javascript.js", "./node_modules/jquery/dist/jquery.js", "./node_modules/lodash/index.js", "./node_modules/backbone/backbone.js", diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/DesignerCreationMode.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/DesignerCreationMode.ts new file mode 100644 index 000000000..41b81eea3 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/DesignerCreationMode.ts @@ -0,0 +1,57 @@ +import {PackageCreationModes} from './PackageCreationModes'; +import {CBAPackage, Scripts} from '../mapping-models/CBAPacakge.model'; +import {FilesContent} from '../mapping-models/metadata/MetaDataTab.model'; +import {Import, Metadata, VlbDefinition} from '../mapping-models/definitions/VlbDefinition'; +import {PackageCreationUtils} from '../package-creation.utils'; + + +export class DesignerCreationMode extends PackageCreationModes { + + constructor() { + super(); + } + + execute(cbaPackage: CBAPackage, packageCreationUtils: PackageCreationUtils) { + this.addToscaMetaDataFile(cbaPackage.metaData); + this.createDefinitionsFolder(cbaPackage, packageCreationUtils); + this.addScriptsFolder(cbaPackage.scripts); + } + + private addScriptsFolder(scripts: Scripts) { + scripts.files.forEach((key, value) => { + FilesContent.putData(key, value); + }); + } + + private createDefinitionsFolder(cbaPackage: CBAPackage, packageCreationUtils: PackageCreationUtils) { + cbaPackage.definitions.imports.forEach((key, valueOfFile) => { + FilesContent.putData(key, valueOfFile); + }); + + const filenameEntry = 'Definitions/vLB_CDS.json'; + const vlbDefinition: VlbDefinition = new VlbDefinition(); + const metadata: Metadata = new Metadata(); + + metadata.template_author = 'Shaaban Ebrahim'; + metadata.template_name = cbaPackage.metaData.name; + metadata.template_tags = cbaPackage.metaData.tags; + metadata.template_version = cbaPackage.metaData.version; + metadata['author-email'] = 'shaaban.eltanany.ext@orange.com'; + metadata['user-groups'] = 'test'; + cbaPackage.definitions.metaDataTab.mapOfCustomKey.forEach((key, customKeyValue) => { + metadata[key] = customKeyValue; + }); + vlbDefinition.metadata = metadata; + const files: Import[] = []; + cbaPackage.definitions.imports.forEach((key, valueOfFile) => { + files.push({file: valueOfFile}); + }); + console.log(vlbDefinition); + vlbDefinition.imports = files; + const value = packageCreationUtils.transformToJson(vlbDefinition); + FilesContent.putData(filenameEntry, value); + console.log('hello there'); + console.log(FilesContent.getMapOfFilesNamesAndContent()); + + } +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/GenericCreationMode.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/GenericCreationMode.ts new file mode 100644 index 000000000..58409eea8 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/GenericCreationMode.ts @@ -0,0 +1,12 @@ +/*import {CBAPackage} from '../mapping-models/CBAPacakge.model'; +import {PackageCreationModes} from './PackageCreationModes'; + +export class GenericCreationMode extends PackageCreationModes { + + execute(cbaPackage: CBAPackage) { + this.addToscaMetaDataFile(cbaPackage.metaData); + } + + +} +*/ diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreation.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreation.ts deleted file mode 100644 index e1d28105f..000000000 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreation.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {CBAPackage} from '../mapping-models/CBAPacakge.model'; - -export abstract class PackageCreation { - - abstract setModeType(cbaPackage: CBAPackage); - - abstract setEntryPoint(cbaPackage: CBAPackage); - - createToscaMetaData(cbaPackage: CBAPackage) { - - } - -} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationBuilder.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationBuilder.ts new file mode 100644 index 000000000..08443cca1 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationBuilder.ts @@ -0,0 +1,24 @@ +import {CBAPackage} from '../mapping-models/CBAPacakge.model'; +import {ModeType} from '../mapping-models/ModeType'; +import {DesignerCreationMode} from './DesignerCreationMode'; +import {PackageCreationModes} from './PackageCreationModes'; + + +export class PackageCreationBuilder { + + constructor() { + } + + public static getCreationMode(cbaPackage: CBAPackage): PackageCreationModes { + let creationMode: PackageCreationModes; + /*if (cbaPackage.metaData.mode.includes(ModeType.Generic)) { + creationMode = new GenericCreationMode(); + } else */ + if (cbaPackage.metaData.mode.includes(ModeType.Designer)) { + creationMode = new DesignerCreationMode(); + } /*else if (cbaPackage.metaData.mode.includes(ModeType.Scripting)) { + creationMode = new ScriptingCreationMode(); + }*/ + return creationMode; + } +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationModes.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationModes.ts new file mode 100644 index 000000000..400304aab --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/PackageCreationModes.ts @@ -0,0 +1,54 @@ +import {CBAPackage} from '../mapping-models/CBAPacakge.model'; +import {ModeType} from '../mapping-models/ModeType'; +import {FilesContent, MetaDataTabModel} from '../mapping-models/metadata/MetaDataTab.model'; +import {PackageCreationUtils} from '../package-creation.utils'; + + +export abstract class PackageCreationModes { + + protected constructor() { + } + + public static setEntryPoint(metaDataTab: MetaDataTabModel) { + if (metaDataTab.mode.startsWith(ModeType.Designer)) { + metaDataTab.entryFileName = 'Definitions/vLB_CDS.json'; + } else { + // TODO Not implemented + metaDataTab.entryFileName = ''; + } + return metaDataTab; + } + + public static mapModeType(cbaPackage: CBAPackage) { + if (cbaPackage.metaData.mode.startsWith('Scripting')) { + cbaPackage.metaData.mode = ModeType.Scripting; + } else if (cbaPackage.metaData.mode.startsWith('Designer')) { + cbaPackage.metaData.mode = ModeType.Designer; + } else { + cbaPackage.metaData.mode = ModeType.Generic; + } + return cbaPackage; + } + + getValueOfMetaData(metaDataTab: MetaDataTabModel): string { + return 'TOSCA-Meta-File-Version: 1.0.0\n' + + 'CSAR-Version: 1.0\n' + + 'Created-By: Shaaban Ebrahim <shaaban.eltanany.ext@orange.con>\n' + + 'Entry-Definitions:' + metaDataTab.entryFileName + '\n' + + 'Template-Name:' + metaDataTab.name + '\n' + + 'Template-Version:' + metaDataTab.version + '\n' + + 'Template-Type: ' + metaDataTab.mode + '\n' + + 'Template-Tags:' + metaDataTab.tags; + + } + + protected addToscaMetaDataFile(metaDataTab: MetaDataTabModel) { + const filename = 'TOSCA-Metadata/TOSCA.meta'; + FilesContent.putData(this.getValueOfMetaData(metaDataTab), filename); + } + + + abstract execute(cbaPackage: CBAPackage, packageCreationUtils: PackageCreationUtils) ; + + +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/ScriptingCreationMode.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/ScriptingCreationMode.ts new file mode 100644 index 000000000..21dce171d --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/creationModes/ScriptingCreationMode.ts @@ -0,0 +1,11 @@ +/*import {CBAPackage, Definition, Scripts} from '../mapping-models/CBAPacakge.model'; +import {PackageCreationModes} from './PackageCreationModes'; +import {FilesContent} from '../mapping-models/metadata/MetaDataTab.model'; + +export class ScriptingCreationMode extends PackageCreationModes { + execute(cbaPackage: CBAPackage) { + } + + +} +*/ diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.html index dde21297a..6fb1dcfd8 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.html @@ -1 +1,5 @@ -<ace-editor [(text)]="dslDefinition.content" [mode]="lang" #editor style="height:150px;"></ace-editor> +<ace-editor [(text)]="dslDefinition.content" [mode]="'javascript'" [autoUpdateContent]="true" + [durationBeforeCallback]="1000" [theme]="'tomorrow_night_bright'" #editor style="height:300px;"> +</ace-editor> + +<!-- <app-source-editor [lang]="'javascript'" (textChanged)="textChanged($event)" [(text)]="dslDefinition.content"></app-source-editor> -->
\ No newline at end of file diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.ts index 032ba0b7f..7171e730e 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/dsl-definitions-tab/dsl-definitions-tab.component.ts @@ -1,6 +1,6 @@ -import {Component, OnInit} from '@angular/core'; -import {DslDefinition} from '../mapping-models/CBAPacakge.model'; -import {PackageCreationStore} from '../package-creation.store'; +import { Component, OnInit } from '@angular/core'; +import { DslDefinition } from '../mapping-models/CBAPacakge.model'; +import { PackageCreationStore } from '../package-creation.store'; @Component({ selector: 'app-dsl-definitions-tab', @@ -19,4 +19,8 @@ export class DslDefinitionsTabComponent implements OnInit { this.packageCreationStore.changeDslDefinition(this.dslDefinition); } + + textChanged(event) { + console.log('event changed'); + } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.html index 5cd888828..344e7f599 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.html @@ -39,7 +39,7 @@ <button class="btn btn-link collapsed" data-toggle="collapse" [attr.data-target]="'#id-'+mapIndex" aria-expanded="false" [attr.aria-controls]="'id-'+mapIndex"> - <i class="icon-file-code"></i> Definitions/{{file.key}} + <i class="icon-file-code"></i> {{file.key}} </button> <a class="accordion-delete" (click)="removeFile(mapIndex)"><i class="icon-delete"></i></a> </h5> @@ -47,7 +47,10 @@ <div [id]="'id-'+mapIndex" class="collapse" [attr.aria-labelledby]="'head-'+mapIndex" data-parent="#accordion"> <div class="card-body"> - {{file.value}} + <ace-editor [(text)]="file.value" [mode]="'json'" [autoUpdateContent]="true" + [durationBeforeCallback]="1000" [theme]="'tomorrow_night_bright'" #editor + style="height:300px;"> + </ace-editor> </div> </div> </div> @@ -90,7 +93,7 @@ </button> </div> <div class="modal-body"> - <ngx-file-drop dropZoneLabel="Drop files here" (onFileDrop)="dropped($event)" + <ngx-file-drop accept=".json" dropZoneLabel="Drop files here" (onFileDrop)="dropped($event)" (onFileOver)="fileOver($event)" (onFileLeave)="fileLeave($event)"> <ng-template ngx-file-drop-content-tmp let-openFileSelector="openFileSelector"> <div class="folder-upload"> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.ts index a8ba164f3..106fe3090 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/imports-tab/imports-tab.component.ts @@ -1,7 +1,7 @@ -import {Component, OnInit} from '@angular/core'; -import {FileSystemFileEntry, NgxFileDropEntry} from 'ngx-file-drop'; -import {PackageCreationStore} from '../package-creation.store'; -import {PackageCreationUtils} from '../package-creation.utils'; +import { Component, OnInit } from '@angular/core'; +import { FileSystemFileEntry, NgxFileDropEntry } from 'ngx-file-drop'; +import { PackageCreationStore } from '../package-creation.store'; +import { PackageCreationUtils } from '../package-creation.utils'; @Component({ @@ -39,33 +39,13 @@ export class ImportsTabComponent implements OnInit { console.log(fileEntry.name); this.fileNames.add(fileEntry.name); - } /*else { - const directorEntry = droppedFile.fileEntry as FileSystemDirectoryEntry; - this.filesUnderDirectory = directorEntry.getFile(''); - // const fileEntry = droppedFile.fileEntry as FileSystemDirectoryEntry; - /* this.uploadedFile.push(droppedFile); - const formData = new FormData() - formData.append('logo', fileEntry, droppedFile.relativePath); - console.log(formData);*/ - /* // It was a directory (empty directories are added, otherwise only files) - const fileEntry = droppedFile.fileEntry as FileSystemDirectoryEntry; - console.log(droppedFile.relativePath, fileEntry); - - - const formData = new FormData(); - formData.append('logo', droppedFile, droppedFile.relativePath); - console.log(formData); - - //this.packageCreationStore.addDefinition(droppedFile.relativePath, this.getContent(droppedFile.relativePath)); -*/ - /* }*/ + } } } removeFile(fileIndex: number) { - console.log(this.uploadedFiles[fileIndex]); - console.log(this.uploadedFiles); - this.packageCreationStore.removeFileFromDefinition(this.uploadedFiles[fileIndex].name); + const filename = 'Definitions/' + this.uploadedFiles[fileIndex].name; + this.packageCreationStore.removeFileFromDefinition(filename); this.uploadedFiles.splice(fileIndex, 1); } @@ -77,23 +57,13 @@ export class ImportsTabComponent implements OnInit { console.log(event); } - /* readFileContent(file: File): string | ArrayBuffer { - const fileReader = new FileReader(); - // let content: string | ArrayBuffer = ''; - fileReader.onload = (e) => { - content = fileReader.result; - }; - fileReader.readAsText(file); - return content; - } - */ setFilesToStore() { for (const droppedFile of this.uploadedFiles) { droppedFile.file((file: File) => { const fileReader = new FileReader(); fileReader.onload = (e) => { - this.packageCreationStore.addDefinition(droppedFile.name, - this.packageCreationUtils.transformToJson(fileReader.result)); + this.packageCreationStore.addDefinition('Definitions/' + droppedFile.name, + fileReader.result.toString()); }; fileReader.readAsText(file); }); diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/CBAPacakge.model.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/CBAPacakge.model.ts index 78a9b5212..d94a64ca3 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/CBAPacakge.model.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/CBAPacakge.model.ts @@ -47,17 +47,33 @@ export class Scripts { } } + +export class Template { + public files: Map<string, string>; + + constructor() { + this.files = new Map<string, string>(); + } + + public setTemplates(key: string, value: string) { + this.files.set(key, value); + return this; + } +} + export class CBAPackage { public metaData: MetaDataTabModel; public definitions: Definition; public scripts: Scripts; + public templates: Template; constructor() { this.definitions = new Definition(); this.scripts = new Scripts(); this.metaData = new MetaDataTabModel(); + this.templates = new Template(); } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/ModeType.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/ModeType.ts new file mode 100644 index 000000000..d6f9a978f --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/ModeType.ts @@ -0,0 +1,5 @@ +export enum ModeType { + Scripting = 'KOTLIN_SCRIPT', + Designer = 'DEFAULT', + Generic = 'GENERIC_SCRIPT' +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/metadata/MetaDataTab.model.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/metadata/MetaDataTab.model.ts index 194e660c7..df723d58f 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/metadata/MetaDataTab.model.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/metadata/MetaDataTab.model.ts @@ -45,17 +45,6 @@ Content-Type: application/vnd.oasis.bpmn*/ export class MetaDataFile { - static getValueOfMetaData(metaDataTab: MetaDataTabModel): string { - return 'TOSCA-Meta-File-Version: 1.0.0\n' + - 'CSAR-Version: 1.0\n' + - 'Created-By: Shaaban Ebrahim <shaaban.eltanany.ext@orange.con>\n' + - 'Entry-Definitions:' + metaDataTab.entryFileName + '\n' + - 'Template-Name:' + metaDataTab.name + '\n' + - 'Template-Version:' + metaDataTab.version + '\n' + - 'Template-Type: ' + metaDataTab.mode + '\n' + - 'Template-Tags:' + metaDataTab.tags; - - } } @@ -118,4 +107,8 @@ export class FilesContent { public static putData(fileName: string, content: string) { FilesContent.mapOfFilesNamesAndContent.set(fileName, content); } + + public static clear() { + this.mapOfFilesNamesAndContent = new Map<string, string>(); + } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/template-mapping.model.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/template-mapping.model.ts new file mode 100644 index 000000000..400ef21c4 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/mapping-models/template-mapping.model.ts @@ -0,0 +1,11 @@ +export class Template { + public name: string; + public type: string; + public content: string; +} +export class Mapping { } + +export class TemplateMapping { + public template: Template; + public mapping: Mapping; +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.html index a94687b37..09393c403 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.html @@ -11,40 +11,62 @@ </span> </label> </div> + <div class="single-line"> + <label class="label-name">Dictionary Library Instance</label> + <div class="label-input"> + <select class="form-control" id="exampleFormControlSelect1"> + <option>Library Instance 1</option> + <option>Library Instance 2</option> + <option>Library Instance 3</option> + <option>Library Instance 4</option> + <option>Library Instance 5</option> + </select> + </div> + </div> </div> <div class="card creat-card"> - <div class="single-line"> - <label class="label-name">Name</label> + <div class="single-line-model error"> + <label class="label-name">Name <span>*</span></label> <div class="label-input"> <input type="input" [(ngModel)]="metaDataTab.name" placeholder="Topology name.vLB.CDS"> </div> + <div class="model-note-container error-message"> + Package name already exists with this version. Please enter a different name or enter different version number. + </div> </div> - <hr/> - <div class="single-line"> - <label class="label-name">Description</label> - <div class="label-input"> - <input type="input" [(ngModel)]="metaDataTab.description" - placeholder="Descripe the package"> - </div> - </div> - <hr/> - <div class="single-line"> - <label class="label-name">Version</label> + + <div class="single-line-model"> + <label class="label-name">Version <span>*</span></label> <div class="label-input"> <input type="input" [(ngModel)]="metaDataTab.version" (input)="validatePackageNameAndVersion()" placeholder="Example: 1.0.0"> </div> - <div><label style="color: red">{{errorMessage}}</label></div> + <div class="model-note-container error-message">{{errorMessage}}</div> </div> - <hr/> - <div class="single-line"> + <div class="single-line-model"> + <label class="label-name">Description</label> + <div class="label-input"> + <input type="input" [(ngModel)]="metaDataTab.description" + placeholder="Descripe the package"> + </div> + </div> + + <div class="single-line-model"> <label class="label-name">tags</label> <div class="label-input"> <input type="input" [(ngModel)]="metaDataTab.tags" placeholder="Ex., vDNS-CDS"> + + </div> + <div class="model-note-container tag-notes">Seprate tags with comma or space</div> + <div class="model-note-container tages-container"> + <span class="single-tage">vDNS-CDS <a href="#"> <i class="fa fa-times-circle"></i></a></span> + <span class="single-tage">vDNS-CDS <a href="#"> <i class="fa fa-times-circle"></i></a></span> + <span class="single-tage">vDNS-CDS <a href="#"> <i class="fa fa-times-circle"></i></a></span> + <span class="single-tage">vDNS-CDS <a href="#"> <i class="fa fa-times-circle"></i></a></span> </div> </div> </div> @@ -53,35 +75,58 @@ <div class="card creat-card"> <div class="single-line"> <h5 class="label-name"> - Custom key <a class="delete-key" (click)="deleteCustomKey($event)">Delete</a> + Custom key </h5> </div> - <div class="single-line"> - <label class="label-name">Name</label> + <div class="single-custom-key"> + <div class="single-line-custom-key"> + <label class="label-name"><span>1-</span> Name</label> <div class="label-input"> - <input name="key" type="input" placeholder="Enter Name"> + <input name="key" type="input" placeholder="Enter name"> </div> </div> - <hr/> - <div class="single-line"> + <div class="single-line-custom-key"> <label class="label-name">Value</label> <div class="label-input"> <input name="value" type="input" - placeholder="Enter Value"> + placeholder="Enter value"> </div> </div> + <div class="single-line-custom-key-delete"><button class="custom-key-delete"><i aria-hidden="true" class="icon-delete"></i></button></div> + </div> + <div class="single-custom-key"> + <div class="single-line-custom-key"> + <label class="label-name"><span>2-</span> Name</label> + <div class="label-input"> + <input name="key" type="input" placeholder="Enter name"> + </div> + </div> + <div class="single-line-custom-key"> + <label class="label-name">Value</label> + <div class="label-input"> + <input name="value" type="input" + placeholder="Enter value"> + </div> + </div> + <div class="single-line-custom-key-delete"><button class="custom-key-delete"><i aria-hidden="true" class="icon-delete"></i></button></div> + </div> - </div> - </div> -</div> -<div class="card creat-card"> - <div class="single-line"> - <div name="custom key"> - <button class="custom-key" (click)="createAnotherCustomKeyDiv()"><i - class="fa fa-plus" aria-hidden="true"></i> Add a custom key - </button> - + <div class="single-custom-key"> + <div class="single-line-custom-key"> + <label class="label-name"><span>3-</span> Name</label> + <div class="label-input"> + <input name="key" type="input" placeholder="Enter name"> + </div> + </div> + <div class="single-line-custom-key"> + <label class="label-name">Value</label> + <div class="label-input"> + <input name="value" type="input" + placeholder="Enter value"> + </div> + </div> + </div> </div> </div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.ts index 710ca924a..97040ee90 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/metadata-tab/metadata-tab.component.ts @@ -14,7 +14,8 @@ export class MetadataTabComponent implements OnInit { counter = 0; modes: object[] = [ {name: 'Designer Mode', style: 'mode-icon icon-designer-mode'}, - {name: 'Scripting Mode', style: 'mode-icon icon-scripting-mode'}]; + {name: 'Scripting Mode', style: 'mode-icon icon-scripting-mode'}, + {name: 'Generic Script Mode', style: 'mode-icon icon-generic-script-mode'}]; private metaDataTab: MetaDataTabModel = new MetaDataTabModel(); private errorMessage: string; diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.css b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.css index e69de29bb..8b1378917 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.css +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.css @@ -0,0 +1 @@ + diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.html index 73f917f52..906904855 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.html @@ -1,21 +1,27 @@ <app-header></app-header> <div class="new-wrapper"> + <div class="container-fluid main-container"> <header class="page-title"> <div class="row"> - <h2 class="col m-0">CBA Packages - <span>({{numberOfPackages}} packages)</span> + <h2 class="col m-0"> + <ul class="breadcrumb-header"> + <li>CBA Packages</li> + <li>Package Name</li> + </ul> </h2> - <div class="col"> + <div class="col d-flex justify-content-end header-button-save"> + <button class="float btn btn-sm btn-outline-secondary" disabled>Discard Changes</button> + <button class="float btn btn-sm btn-primary" (click)="saveBluePrint()">Save</button> </div> </div> </header> - <div class="main-container"> - <div class="container-fluid body-container creat-container-all"> - <div class="creat-container"> + <div class="container-fluid body-container"> + + <div class="container"> <div class="creat-action-container"> <a href="#" class="action-button"> <i class="icon-clone" aria-hidden="true"></i> @@ -27,20 +33,81 @@ <span>Archive</span> </a> - <a href="#" class="action-button"> + <a href="#" class="action-button delete"> <i class="icon-delete" aria-hidden="true"></i> <span>Delete</span> </a> </div> - <nav class="row"> - <div class="col pr-0"> - <button class="float btn btn-sm btn-primary" (click)="saveBluePrint()">Save</button> - <button class="float btn btn-sm btn-outline-secondary" disabled>Cancel</button> + + <div class="card creat-card view-package-container"> + <div class="row"> + <div class="col-8"> + <div class="row"> + <div class="col d-flex"> + <i class="package-type-icon icon-designer-mode"></i> + <div class="package-name-container"> + <div class="row"> + <div class="col-12 package-name deployed"> + Package Name + <span>.vLB.CDS</span> + <i class="icon-deploy"></i> + </div> + <div class="col-12 package-description"> + Last modified Oct 4, 2019 03:48 PM By Ahmed Abbas + </div> + </div> + <!-- <div class="row"> + <div class="col-4"> + <div class="package-view-title">Author Name</div> + <p>Abdelmuhaimen Seaudi</p> + </div> + <div class="col-4"> + <div class="package-view-title">Author Email</div> + <p>abdelmuhaimen.seaudi@orange.com</p> + </div> + <div class="col-4"> + <div class="package-view-title">Contributions</div> + <ul class="package-contributers"> + <li> + <button type="button" class="border-fade" data-toggle="tooltip" + data-placement="bottom" + title="User name"> + <img src="/assets/img/img-user1.jpeg"> + </button> + </li> + <li> + <button type="button" data-toggle="tooltip" data-placement="bottom" + title="User name"> + <img src="/assets/img/img-user2.jpg"> + </button> + </li> + <li> + <button type="button" data-toggle="tooltip" data-placement="bottom" + title="User name"> + <img src="/assets/img/img-user3.jpg"> + </button> + </li> + <li> + <a href="">5 contributors</a> + </li> + </ul> + </div> + </div> --> + </div> + </div> + </div> + </div> + <div class="col-4 package-view-button"> + <button class="btn btn-sm btn-outline-secondary"><i class="fa fa-play-circle"></i> Deploy</button> + <button class="btn btn-sm btn-primary">Designer Mode</button> + </div> </div> - </nav> + + </div> + <nav class="row"> <!--Nav Tabs--> - <div class="col pr-0"> + <div class="col"> <div class="nav nav-tabs " id="nav-tab" role="tablist"> <a class="nav-item nav-link active" id="nav-metadata-tab" data-toggle="tab" href="#nav-metadata" @@ -85,12 +152,16 @@ </div> <div class="tab-pane fade" id="nav-authentication" role="tabpanel" aria-labelledby="nav-authentication-tab"> - <app-dsl-definitions-tab></app-dsl-definitions-tab> + <div class="card creat-card"> + <div class="editor-container"> + <app-dsl-definitions-tab></app-dsl-definitions-tab> + </div> + </div> </div> </div> </div> </div> </div> </div> - </div> +</div> </div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.ts index cdf8cf38b..c15a5dd4f 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.component.ts @@ -20,11 +20,15 @@ limitations under the License. */ import {Component, OnInit} from '@angular/core'; -import {FilesContent, FolderNodeElement, MetaDataFile, MetaDataTabModel} from './mapping-models/metadata/MetaDataTab.model'; -// import {saveAs} from 'file-saver/dist/FileSaver'; +import {FilesContent, FolderNodeElement, MetaDataTabModel} from './mapping-models/metadata/MetaDataTab.model'; + import * as JSZip from 'jszip'; import {PackageCreationStore} from './package-creation.store'; import {Definition} from './mapping-models/CBAPacakge.model'; +import {PackageCreationModes} from './creationModes/PackageCreationModes'; +import {PackageCreationBuilder} from './creationModes/PackageCreationBuilder'; +import {PackageCreationUtils} from './package-creation.utils'; + @Component({ selector: 'app-package-creation', @@ -42,7 +46,10 @@ export class PackageCreationComponent implements OnInit { private filesData: any = []; private definition: Definition = new Definition(); - constructor(private packageCreationStore: PackageCreationStore) { + // adding initial referencing to designer mode + + + constructor(private packageCreationStore: PackageCreationStore, private packageCreationUtils: PackageCreationUtils) { } ngOnInit() { @@ -53,17 +60,12 @@ export class PackageCreationComponent implements OnInit { this.packageCreationStore.state$.subscribe( cbaPackage => { console.log(cbaPackage); - this.metaDataTab = cbaPackage.metaData; - this.setModeType(this.metaDataTab); - this.setEntryPoint(this.metaDataTab); - this.addToscaMetaDataFile(this.metaDataTab); - - this.definition = cbaPackage.definitions; - this.definition.metaDataTab = cbaPackage.metaData; - this.createDefinitionsFolder(this.definition); - // const vlbDefinition: VlbDefinition = new VlbDefinition(); - // this.fillVLBDefinition(vlbDefinition, this.metaDataTab); - + FilesContent.clear(); + let packageCreationModes: PackageCreationModes; + cbaPackage = PackageCreationModes.mapModeType(cbaPackage); + cbaPackage.metaData = PackageCreationModes.setEntryPoint(cbaPackage.metaData); + packageCreationModes = PackageCreationBuilder.getCreationMode(cbaPackage); + packageCreationModes.execute(cbaPackage, this.packageCreationUtils); this.filesData.push(this.folder.TREE_DATA); this.saveBluePrintToDataBase(); }); @@ -71,29 +73,6 @@ export class PackageCreationComponent implements OnInit { } - private addToscaMetaDataFile(metaDataTab: MetaDataTabModel) { - const filename = 'TOSCA-Metadata/TOSCA.meta'; - FilesContent.putData(filename, MetaDataFile.getValueOfMetaData(metaDataTab)); - } - -// TODO use enumerator - private setModeType(metaDataTab: MetaDataTabModel) { - if (metaDataTab.mode.startsWith('Scripting')) { - metaDataTab.mode = 'KOTLIN_SCRIPT'; - } else if (metaDataTab.mode.startsWith('Designer')) { - metaDataTab.mode = 'DEFAULT'; - } else { - metaDataTab.mode = 'GENERIC_SCRIPT'; - } - } - - private setEntryPoint(metaDataTab: MetaDataTabModel) { - if (metaDataTab.mode.startsWith('DEFAULT')) { - metaDataTab.entryFileName = 'Definitions/vLB_CDS.json'; - } else { - metaDataTab.entryFileName = ''; - } - } saveBluePrintToDataBase() { this.create(); @@ -105,7 +84,11 @@ export class PackageCreationComponent implements OnInit { create() { - this.folder.TREE_DATA.forEach((path) => { + FilesContent.getMapOfFilesNamesAndContent().forEach((key, value) => { + this.zipFile.folder(key.split('/')[0]); + this.zipFile.file(key, value); + }); + /*this.folder.TREE_DATA.forEach((path) => { const name = path.name; if (path.children) { this.zipFile.folder(name); @@ -114,37 +97,14 @@ export class PackageCreationComponent implements OnInit { if (FilesContent.getMapOfFilesNamesAndContent().has(name2)) { this.zipFile.file(name + '/' + name2, FilesContent.getMapOfFilesNamesAndContent().get(name2)); } else { + // this.zipFile.file(name2, FilesContent.getMapOfFilesNamesAndContent().get(name2)); } }); } - }); + });*/ } - private createDefinitionsFolder(definition: Definition) { - this.definition.imports.forEach((key, value) => { - FilesContent.putData(key, value); - }); - - /*const filenameEntry = 'vLB_CDS.json'; - const vlbDefinition: VlbDefinition = new VlbDefinition(); - const metadata: MetaDataTabModel = new MetaDataTabModel(); - - metadata.templateAuthor = ' lldkslds'; - metadata.templateName = ' lldkslds'; - metadata.templateTags = ' lldkslds'; - metadata.templateVersion = ' lldkslds'; - metadata['author-email'] = ' lldkslds'; - metadata['user-groups'] = ' lldkslds'; - vlbDefinition.metadata = metadata; - - vlbDefinition.imports = [{ - file: 'Definitions/data_types.json' - }]; - - const value = this.packageCreationUtils.transformToJson(vlbDefinition); - FilesContent.putData(filenameEntry, value);*/ - } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.store.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.store.ts index 3e37952b2..3dae2e570 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.store.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/package-creation.store.ts @@ -86,4 +86,11 @@ export class PackageCreationStore extends Store<CBAPackage> { saveBluePrint(blob) { this.packageCreationService.savePackage(blob); } + + addTemplate(filePath: string, fileContent: string) { + this.setState({ + ...this.state, + templates: this.state.templates.setTemplates(filePath, fileContent) + }); + } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.html index 1685b7eaf..824152035 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.html @@ -5,7 +5,7 @@ <a class="enter-link" href="#"><i class="icon-enter"></i></a> </div> <span class="import-container-span">Or you can also <a data-target="#scriptsModal" data-toggle="modal" - href="#">Import File</a></span> + href="#">Import File</a></span> </div> @@ -15,23 +15,25 @@ <label class="label-name">File</label> </div> </div> - <div *ngFor="let file of scriptsFiles | keyvalue; let mapIndex = index" id="accordion"> + <div *ngFor="let file of scriptsFiles | keyvalue; let mapIndex = index" id="accordion-script"> <div class="card"> - <div [id]="'head-'+mapIndex" class="card-header"> + <div [id]="'head-script-'+mapIndex" class="card-header"> <h5 class="mb-0 d-flex justify-content-between"> - <button [attr.aria-controls]="'id-'+mapIndex" [attr.data-target]="'#id-'+mapIndex" - aria-expanded="false" class="btn btn-link collapsed" - data-toggle="collapse"> - <i class="icon-file-code"></i> Definitions/{{file.key}} + <button [attr.aria-controls]="'id-script-'+mapIndex" [attr.data-target]="'#id-script-'+mapIndex" + aria-expanded="false" class="btn btn-link collapsed" data-toggle="collapse"> + <i class="icon-file-code"></i> {{file.key}} </button> <a (click)="removeFile(mapIndex)" class="accordion-delete"><i class="icon-delete"></i></a> </h5> </div> - <div [attr.aria-labelledby]="'head-'+mapIndex" [id]="'id-'+mapIndex" class="collapse" - data-parent="#accordion"> + <div [attr.aria-labelledby]="'head-script-'+mapIndex" [id]="'id-script-'+mapIndex" class="collapse" + data-parent="#accordion-script"> <div class="card-body"> - {{file.value}} + <ace-editor [(text)]="file.value" [mode]="'kotlin'" [autoUpdateContent]="true" + [durationBeforeCallback]="1000" [theme]="'tomorrow_night_bright'" #editor + style="height:300px;"> + </ace-editor> </div> </div> </div> @@ -42,7 +44,7 @@ </div> <div aria-hidden="true" aria-labelledby="scriptsModalLabel" class="modal fade" id="scriptsModal" role="dialog" - tabindex="-1"> + tabindex="-1"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> @@ -52,11 +54,11 @@ </button> </div> <div class="modal-body"> - <ngx-file-drop (onFileDrop)="dropped($event)" (onFileLeave)="fileLeave($event)" - (onFileOver)="fileOver($event)" dropZoneLabel="Drop files here"> + <ngx-file-drop accept=".kt" (onFileDrop)="dropped($event)" (onFileLeave)="fileLeave($event)" + (onFileOver)="fileOver($event)" dropZoneLabel="Drop files here"> <ng-template let-openFileSelector="openFileSelector" ngx-file-drop-content-tmp> <div class="folder-upload"> - <img src="assets/img/folder-upload.svg"/> + <img src="assets/img/folder-upload.svg" /> </div> <div class="folder-upload-text"> Drag & Drop file @@ -72,16 +74,16 @@ <div *ngFor="let item of uploadedFiles; let i=index" class="upload-table"> <table class="table"> <thead> - <tr> - <th>Name : {{ item.name }}</th> - </tr> + <tr> + <th>Name : {{ item.name }}</th> + </tr> </thead> </table> </div> </div> <div class="modal-footer"> <button (click)="resetTheUploadedFiles()" class="btn btn-sm btn-secondary" data-dismiss="modal" - type="button">Cancel + type="button">Cancel </button> <button (click)="setFilesToStore()" class="btn btn-sm btn-primary" data-dismiss="modal" type="button"> Import @@ -89,4 +91,4 @@ </div> </div> </div> -</div> +</div>
\ No newline at end of file diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.ts index 43b9b503c..eee291bba 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/scripts-tab/scripts-tab.component.ts @@ -1,7 +1,9 @@ -import {Component, OnInit} from '@angular/core'; -import {FileSystemFileEntry, NgxFileDropEntry} from 'ngx-file-drop'; -import {PackageCreationStore} from '../package-creation.store'; -import {PackageCreationUtils} from '../package-creation.utils'; +import { Component, OnInit } from '@angular/core'; +import { FileSystemFileEntry, NgxFileDropEntry } from 'ngx-file-drop'; +import { PackageCreationStore } from '../package-creation.store'; +import { PackageCreationUtils } from '../package-creation.utils'; +import 'ace-builds/src-noconflict/ace'; +import 'ace-builds/webpack-resolver'; @Component({ selector: 'app-scripts-tab', @@ -43,7 +45,8 @@ export class ScriptsTabComponent implements OnInit { removeFile(fileIndex: number) { console.log(this.uploadedFiles[fileIndex]); - this.packageCreationStore.removeFileFromState(this.uploadedFiles[fileIndex].name); + const filename = 'Scripts/' + this.uploadedFiles[fileIndex].name; + this.packageCreationStore.removeFileFromState(filename); this.uploadedFiles.splice(fileIndex, 1); } @@ -61,8 +64,8 @@ export class ScriptsTabComponent implements OnInit { droppedFile.file((file: File) => { const fileReader = new FileReader(); fileReader.onload = (e) => { - this.packageCreationStore.addScripts(droppedFile.name, - this.packageCreationUtils.transformToJson(fileReader.result)); + this.packageCreationStore.addScripts('Scripts/' + droppedFile.name, + fileReader.result.toString()); }; fileReader.readAsText(file); }); diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/TemplateType.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/TemplateType.ts new file mode 100644 index 000000000..17a4bfae6 --- /dev/null +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/TemplateType.ts @@ -0,0 +1,5 @@ +export enum TemplateType { + Velocity = 'vtl', + Koltin = 'kt', + Jinja = 'Unknown' +} diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.html index f6afb4929..3c92bc7c7 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.html @@ -1,64 +1,12 @@ <h6 class="create-title">CREATE</h6> <div class="card creat-card"> - <div class="single-line"> - <label class="label-name">Name</label> - <div class="label-input"> - <input type="input" placeholder="Topology name.vLB.CDS"> - </div> - </div> - <hr /> - <div class="single-line"> - <label class="label-name">Management Type</label> - <div class="label-input"> - <div class="row"> - <div class="col-md-4 d-flex"> - <a class="select-type active" href="#"> - <div class="select-type-icon"><span class="icon-template-mapping"></span></div> - <div>Template And Support Mapping</div> - </a> - </div> - <div class="col-md-4 d-flex"> - <a class="select-type" href="#"> - <div class="select-type-icon"><span class="icon-template"></span></div> - <div>Template Only</div> - </a> - </div> - <div class="col-md-4 d-flex"> - <a class="select-type" href="#"> - <div class="select-type-icon"><span class="icon-mapping"></span></div> - <div>Mapping Only</div> - </a> - - </div> - </div> + <div class="single-line-model"> + <label class="label-name">Name + <span _ngcontent-uew-c3="">*</span> + </label> - </div> - </div> - <hr /> - <div class="single-line"> - <label class="label-name">Type</label> <div class="label-input"> - <label name="trst"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value=Velcoity> - - <span> - Velcoity - </span> - </label> - <label name="trst"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value=Velcoity> - - <span> - Jinja - </span> - </label> - <label name="trst"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value=Velcoity> - - <span> - Kotlin - </span> - </label> + <input type="input" [(ngModel)]="fileName" placeholder="Topology name.vLB.CDS"> </div> </div> </div> @@ -69,7 +17,7 @@ <div class="card-header" id="headingOne"> <h5 class="mb-0 d-flex justify-content-between"> <button class="btn btn-link" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" - aria-controls="collapseOne"> + aria-controls="collapseOne"> 1. Create Template </button> @@ -78,13 +26,42 @@ <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion"> <div class="card-body"> - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 - wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum - eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla - assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt - sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer - farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus - labore sustainable VHS. + <div class="single-line"> + <label class="label-name">Template Type</label> + <div class="label-input"> + <label name="trst"> + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" + value=Velcoity> + + <span> + Velcoity + </span> + </label> + <label name="trst"> + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" + value=Velcoity> + + <span> + Jinja + </span> + </label> + <label name="trst"> + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" + value=Velcoity> + + <span> + Kotlin + </span> + </label> + </div> + </div> + <div class="create-template-import">Use the editor to add parameters or you can also <a href="#" + data-toggle="modal" + data-target="#exampleModal">Import + File</a></div> + <div class="editor-container"> + <app-dsl-definitions-tab></app-dsl-definitions-tab> + </div> </div> </div> </div> @@ -92,22 +69,101 @@ <div class="card-header" id="headingTwo"> <h5 class="mb-0"> <button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseTwo" - aria-expanded="false" aria-controls="collapseTwo"> + aria-expanded="false" aria-controls="collapseTwo"> 2. Manage Mapping </button> </h5> </div> <div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion"> <div class="card-body"> - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 - wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum - eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla - assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt - sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer - farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus - labore sustainable VHS. + <h6 class="text-center">Select a source to load config parameters</h6> + <div class="text-center"> + <a href="#" class="mapping-source-load"> + <i class="icon-current-template"></i> + <br/> + <span>Use Current Template Instance</span> + </a> + <a href="#" data-toggle="modal" data-target="#exampleModal" class="mapping-source-load"> + <i class="icon-Upload-attribute"></i> + <br/> + <div>Upload attribute list</div> + <div class="source-load-note">(Should be comma delimited file)</div> + </a> + <!-- <a href="#" class="mapping-source-load"> + <i class="icon-import-cds"></i> + <br/> + <span>Import from SDC Model</span> + </a> --> + </div> + + <div class="table-container"> + + + </div> </div> + + </div> + + + </div> + + <div class="template-mapping-action"> + <button class="btn btn-sm btn-outline-secondary">Cancel</button> + <button class="btn btn-sm btn-primary">Finish</button> </div> </div> -</div>
\ No newline at end of file +</div> + + +<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" + aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="exampleModalLabel">Import File</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <ngx-file-drop dropZoneLabel="Drop files here" (onFileDrop)="dropped($event)" + (onFileOver)="fileOver($event)" (onFileLeave)="fileLeave($event)"> + <ng-template ngx-file-drop-content-tmp let-openFileSelector="openFileSelector"> + <div class="folder-upload"> + <img src="assets/img/folder-upload.svg"/> + </div> + <div class="folder-upload-text"> + Drag & Drop file + </div> + <div class="folder-upload-text">or + <button type="button" class="btn btn-sm btn-primary" (click)="openFileSelector()">Browse + Files + </button> + </div> + <div class="folder-upload-type">Allowed file type: json</div> + </ng-template> + </ngx-file-drop> + <div class="upload-table" *ngFor="let item of uploadedFiles; let i=index"> + <table class="table"> + <thead> + <tr> + <th>Name : {{ item.name }}</th> + </tr> + </thead> + </table> + </div> + </div> + + <div class="modal-footer"> + <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal" + (click)="resetTheUploadedFiles()">Cancel + </button> + <button type="button" class="btn btn-sm btn-primary" data-dismiss="modal" + (click)="setFilesToStore()"> + Import + </button> + </div> + </div> + </div> +</div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.ts index 3a938c5ae..752bd510b 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-creation/templ-mapp-creation.component.ts @@ -1,15 +1,68 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, EventEmitter, OnInit, Output} from '@angular/core'; +import {FileSystemFileEntry, NgxFileDropEntry} from 'ngx-file-drop'; +import {PackageCreationStore} from '../../package-creation.store'; @Component({ - selector: 'app-templ-mapp-creation', - templateUrl: './templ-mapp-creation.component.html', - styleUrls: ['./templ-mapp-creation.component.css'] + selector: 'app-templ-mapp-creation', + templateUrl: './templ-mapp-creation.component.html', + styleUrls: ['./templ-mapp-creation.component.css'] }) export class TemplMappCreationComponent implements OnInit { - constructor() { } + public uploadedFiles: FileSystemFileEntry[] = []; + private fileNames: Set<string> = new Set(); - ngOnInit() { - } + public files: NgxFileDropEntry[] = []; + fileName: any; + constructor(private packageCreationStore: PackageCreationStore) { + } + + ngOnInit() { + } + + public dropped(files: NgxFileDropEntry[]) { + this.files = files; + for (const droppedFile of files) { + // Is it a file? & Not added before + if (droppedFile.fileEntry.isFile && !this.fileNames.has(droppedFile.fileEntry.name)) { + const fileEntry = droppedFile.fileEntry as FileSystemFileEntry; + this.uploadedFiles.push(fileEntry); + this.fileNames.add(fileEntry.name); + + } + } + } + + removeFile(fileIndex: number) { + /*const filename = 'Definitions/' + this.uploadedFiles[fileIndex].name; + this.packageCreationStore.removeFileFromDefinition(filename); + this.uploadedFiles.splice(fileIndex, 1);*/ + } + + setFilesToStore() { + for (const droppedFile of this.uploadedFiles) { + droppedFile.file((file: File) => { + const fileReader = new FileReader(); + fileReader.onload = (e) => { + this.packageCreationStore.addTemplate('Templates/' + this.fileName, + fileReader.result.toString()); + }; + fileReader.readAsText(file); + }); + + } + } + + public fileOver(event) { + console.log(event); + } + + public fileLeave(event) { + console.log(event); + } + + resetTheUploadedFiles() { + this.uploadedFiles = []; + } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.html index ef233ad99..ddf06c824 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.html @@ -1,6 +1,156 @@ -<h6>Basic List Template and mapping</h6> -<div> - <a (click)="openCreationView()" class="action-button"> - <span>Create</span> + + + <a (click)="openCreationView()" class="create-template-mapping-button"> + <i class="fa fa-plus"></i> <span>Create</span> </a> -</div>
\ No newline at end of file + + +<div class="template-mapping-accordion"> + <div id="accordion"> + <div class="card"> + <div class="card-header" id="headingThree"> + <h5 class="mb-0 d-flex justify-content-between"> + <button class="btn btn-link" data-toggle="collapse" data-target="#collapseThree" aria-expanded="true" + aria-controls="collapseThree"> + Template and Mapping List + </button> + + </h5> + </div> + + <div id="collapseThree" class="collapse show" aria-labelledby="headingThree" data-parent="#accordion"> + <div class="card-body max-height-list" *ngFor="let file of templates.files | keyvalue; let mapIndex = index"> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list active">{{file.key}} + <span>Mapping</span> + <span>Template</span> + </a> + </div> + <!-- <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Mapping</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + </a> + </div>--> + </div> + <!-- <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + <span>Mapping</span> + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Mapping</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + </a> + </div> + </div> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + <span>Template</span> + </a> + </div> + </div> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Mapping</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + </a> + </div> + </div> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + <span>Mapping</span> + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Mapping</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + </a> + </div> + </div> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + <span>Mapping</span> + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Mapping</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + </a> + </div> + </div> + <div class="row"> + <div class="col"> + <a href="#" class="template-mapping-list">hostname + + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-1 + <span>Template</span> + </a> + </div> + <div class="col"> + <a href="#" class="template-mapping-list">vf-module-2 + <span>Mapping</span> + <span>Template</span> + </a> + </div> + </div>--> + </div> + </div> + </div> + + </div> +</div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.ts index 525e58128..5cb41c35e 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/package-creation/template-mapping/templ-mapp-listing/templ-mapp-listing.component.ts @@ -1,20 +1,29 @@ -import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import {Component, EventEmitter, OnInit, Output} from '@angular/core'; +import {PackageCreationStore} from '../../package-creation.store'; +import {Template} from '../../mapping-models/CBAPacakge.model'; @Component({ - selector: 'app-templ-mapp-listing', - templateUrl: './templ-mapp-listing.component.html', - styleUrls: ['./templ-mapp-listing.component.css'] + selector: 'app-templ-mapp-listing', + templateUrl: './templ-mapp-listing.component.html', + styleUrls: ['./templ-mapp-listing.component.css'] }) export class TemplMappListingComponent implements OnInit { - @Output() showCreationViewParentNotification = new EventEmitter<any>(); + @Output() showCreationViewParentNotification = new EventEmitter<any>(); + private templates: Template; - constructor() { } + constructor(private packageCreationStore: PackageCreationStore) { + this.packageCreationStore.state$.subscribe(cba => { + if (cba.templates) { + this.templates = cba.templates; + } + }); + } - ngOnInit() { - } + ngOnInit() { + } - openCreationView() { - this.showCreationViewParentNotification.emit('tell parent to open create views'); - } + openCreationView() { + this.showCreationViewParentNotification.emit('tell parent to open create views'); + } } diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html index f45b2fed7..7f6c0a6f4 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/packages-dashboard/package-list/package-list.component.html @@ -7,11 +7,11 @@ </div> <div class="card-footer row"> <div class="col"> - <a routerLink="/packages/createPackage" role="button" aria-pressed="true" class="btn-create-package float">Create Package + <a routerLink="/packages/createPackage" role="button" aria-pressed="true" class="btn-create-package float">Create </a> </div> <div class="col"> - <a href="#" role="button" aria-pressed="true" class="btn-import-package float">Import Package + <a href="#" role="button" aria-pressed="true" class="btn-import-package float">Import </a> </div> </div> diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.html b/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.html index 24423cfac..2f647f9b9 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.html +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.html @@ -1 +1 @@ -<ace-editor (textChanged)="onChange($event)" [(text)]="Data" [mode]="lang" #editor style="height:150px;"></ace-editor> +<ace-editor (textChanged)="onChange($event)" [(text)]="text" [mode]="lang" #editor style="height:150px;"></ace-editor>
\ No newline at end of file diff --git a/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.ts b/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.ts index a63dfa7e0..8f4c376a3 100644 --- a/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.ts +++ b/cds-ui/designer-client/src/app/modules/feature-modules/packages/source-editor/source-editor.component.ts @@ -1,4 +1,5 @@ -import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; +import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { AceEditorComponent } from 'ng2-ace-editor'; // import 'brace/ext/searchbox'; // import 'ace-builds/webpack-resolver'; // import 'brace'; @@ -13,12 +14,10 @@ import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild export class SourceEditorComponent implements OnInit, AfterViewInit { - @Input() Data: string; - @Output() DataChange = new EventEmitter(); + @Input() text: string; + @Output() textChange = new EventEmitter(); @Input() lang: string; - mode = 'json'; - @ViewChild('editor', {static: false}) editor; - text = ''; + @ViewChild('editor', { static: false }) editor: AceEditorComponent; ngOnInit(): void { // throw new Error("Method not implemented."); @@ -26,10 +25,18 @@ export class SourceEditorComponent implements OnInit, AfterViewInit { ngAfterViewInit() { - this.editor.setTheme('eclipse'); + console.log(this.lang); + this.editor.setTheme('eclipse'); this.editor.getEditor().setOptions({ - enableBasicAutocompletion: true + enableBasicAutocompletion: true, + // fontSize: '14pt', + // maxLines: 4096, + // behavioursEnabled: true, + // wrapBehavioursEnabled: true, + // showPrintMargin: true, + // indentedSoftWrap: true, + // wrap: true, }); this.editor.getEditor().commands.addCommand({ @@ -41,9 +48,7 @@ export class SourceEditorComponent implements OnInit, AfterViewInit { }); } - onChange($event: {}) { - console.log('editor action'); - console.log(this.Data); - console.log($event); + onChange(editor) { + this.textChange.emit(this.text); } } diff --git a/cds-ui/designer-client/src/app/modules/shared-modules/header/header.component.html b/cds-ui/designer-client/src/app/modules/shared-modules/header/header.component.html index 24b492ffb..f57ab100b 100644 --- a/cds-ui/designer-client/src/app/modules/shared-modules/header/header.component.html +++ b/cds-ui/designer-client/src/app/modules/shared-modules/header/header.component.html @@ -8,21 +8,21 @@ <a routerLink="packages/list">Packages</a> <span class="icon"> <!-- <i class="fa fa-dashboard"></i> --> - <img src="../assets/img/icon-nav-packages.svg"> + <i class="icon-package"></i> </span> </li> <li class="menu-hasdropdown"> <a href="#">Data Dictionary</a> <span class="icon"> - <img src="../assets/img/icon-nav-dictionary.svg"> + <i class="icon-dictionary"></i> </span> - <label title="toggle menu" for="settings"> + <!-- <label title="toggle menu" for="settings"> <span class="downarrow"> <i class="fa fa-caret-down"></i> </span> </label> <input type="checkbox" class="sub-menu-checkbox" id="settings" /> - <ul class="sub-menu-dropdown"> + <ul class="sub-menu-dropdown"> <li> <a href="">Link</a> </li> @@ -33,7 +33,7 @@ <a href="">Link</a> </li> </ul> - </li> + </li> --> <!-- <li> <a href="#">Favourites</a> <span class="icon"> @@ -53,7 +53,7 @@ <div class="dropdown"> <input class="dropdown-toggle" type="text"> <div class="dropdown-text">User name</div> - <ul class="dropdown-content"> + <!-- <ul class="dropdown-content"> <li> <a href="#">Settings</a> </li> @@ -63,7 +63,7 @@ <li> <a href="#">Log out</a> </li> - </ul> + </ul> --> </div> </li> </ul> diff --git a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.eot b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.eot Binary files differindex b04c6c41e..b21dc0253 100755 --- a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.eot +++ b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.eot diff --git a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.svg b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.svg index 22693eb7a..af56e61c0 100755 --- a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.svg +++ b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.svg @@ -7,15 +7,22 @@ <font-face units-per-em="1024" ascent="960" descent="-64" /> <missing-glyph horiz-adv-x="1024" /> <glyph unicode=" " horiz-adv-x="0" d="" /> -<glyph unicode="" glyph-name="clone" horiz-adv-x="830" d="M205.943 684.214c16.494 0 29.864 13.274 29.864 29.652v202.771h249.198c16.494 0 29.871-13.274 29.871-29.659v-136.986h-81.325c-8.034 0-15.633-3.229-21.148-8.698l-234.083-232.43c-5.253-5.209-8.761-12.739-8.761-20.953v-367.34h-137.965c-16.502 0-29.871 13.282-29.871 29.659v533.986h204.219zM176.072 874.7v-131.175h-132.112zM463.4 487.909v202.771h249.176c16.502 0 29.871-13.282 29.871-29.659v-690.013c0-16.385-13.369-29.659-29.871-29.659h-453.41c-16.494 0-29.871 13.274-29.871 29.659v487.242h204.242c16.487 0 29.864 13.267 29.864 29.659zM403.665 517.568h-132.112l132.112 131.153zM685.427 892.834v67.166l-90.194-89.555 90.194-89.555v67.166c49.734 0 90.194-40.174 90.194-89.555v-44.777h45.097v44.777c0 74.072-60.693 134.332-135.292 134.332z" /> -<glyph unicode="" glyph-name="delete" d="M170.667 49.778c0-62.578 51.2-113.778 113.778-113.778h455.111c62.578 0 113.778 51.2 113.778 113.778v682.667h-682.667v-682.667zM910.222 903.111h-199.111l-56.889 56.889h-284.444l-56.889-56.889h-199.111v-113.778h796.444v113.778z" /> -<glyph unicode="" glyph-name="designer-mode" d="M1024 793.672c0 71.312-58.064 129.328-129.434 129.328h-765.132c-71.37 0-129.434-58.016-129.434-129.328v-530.574c0-32.88 12.344-62.934 32.646-85.778-19.814-14.932-32.646-38.648-32.646-65.302 0-76.654 62.414-139.018 139.132-139.018h745.734c76.718 0 139.132 62.364 139.132 139.018 0 26.654-12.832 50.37-32.646 65.302 20.304 22.844 32.648 52.898 32.648 85.778zM60 793.672c0 38.228 31.148 69.328 69.434 69.328h765.132c38.286 0 69.434-31.1 69.434-69.328v-530.574c0-38.228-31.148-69.328-69.434-69.328h-203.372c-27.154 0-49.246-22.084-49.246-49.226 0-8.080-6.596-14.654-14.702-14.654h-230.492c-8.106 0-14.702 6.574-14.702 14.654 0 27.142-22.092 49.226-49.246 49.226h-203.372c-38.286 0-69.434 31.1-69.434 69.328zM884.868 33h-745.736c-43.634 0-79.132 35.448-79.132 79.018 0 11.994 9.784 21.752 21.806 21.752h241.022c5.242-36.078 36.396-63.878 73.926-63.878h230.492c37.53 0 68.684 27.802 73.926 63.878h241.022c12.024 0 21.806-9.758 21.806-21.752 0-43.57-35.498-79.018-79.132-79.018zM597.9 290.358c2.062-8.968 8.128-16.494 16.456-20.416 4.050-1.908 8.416-2.86 12.782-2.86 4.608 0 9.21 1.060 13.438 3.178l95.882 48.032c6.012 3.012 10.838 7.956 13.704 14.040l152.756 324.352c22.62 48.028 1.948 105.504-46.082 128.124h0.002c-23.268 10.958-49.408 12.2-73.606 3.496-24.202-8.704-43.562-26.31-54.52-49.576l-152.758-324.352c-2.866-6.084-3.604-12.954-2.096-19.508zM803.536 731.846c9.118 3.278 18.97 2.812 27.734-1.318h0.002c18.096-8.524 25.886-30.18 17.364-48.278l-14.16-30.064-65.642 30.916 14.16 30.064c4.128 8.766 11.422 15.4 20.542 18.68zM743.268 628.82l65.644-30.914-108.612-230.616-52.482-26.292-13.16 57.208zM161.846 267.084h290.574c16.568 0 30 13.432 30 30v234.358c0 16.568-13.432 30-30 30h-290.574c-16.568 0-30-13.432-30-30v-234.358c0-16.568 13.432-30 30-30zM191.846 501.442h230.574v-174.358h-230.574zM161.846 730.892h371.668c16.568 0 30 13.432 30 30s-13.432 30-30 30h-371.668c-16.568 0-30-13.432-30-30s13.432-30 30-30zM161.846 630.892h281.668c16.568 0 30 13.432 30 30s-13.432 30-30 30h-281.668c-16.568 0-30-13.432-30-30s13.432-30 30-30z" /> -<glyph unicode="" glyph-name="scripting-mode" d="M407.383 250.611c-0.418 2.89-1.966 5.494-4.302 7.243l-118.568 88.668 118.568 88.668c2.337 1.749 3.884 4.353 4.302 7.243 0.415 2.89-0.33 5.825-2.082 8.168l-18.836 25.185c-3.645 4.869-10.539 5.866-15.408 2.22l-164.036-122.669c-2.777-2.076-4.416-5.343-4.416-8.816s1.639-6.74 4.416-8.816l164.036-122.669c1.975-1.481 4.29-2.192 6.583-2.192 3.353 0 6.664 1.522 8.825 4.412l18.836 25.185c1.749 2.343 2.497 5.277 2.082 8.168zM816.975 355.338l-164.030 122.669c-4.869 3.642-11.762 2.645-15.404-2.22l-18.836-25.185c-1.749-2.34-2.497-5.277-2.082-8.168 0.418-2.887 1.963-5.494 4.302-7.243l118.565-88.668-118.565-88.668c-2.34-1.749-3.884-4.356-4.302-7.243-0.415-2.89 0.33-5.828 2.082-8.168l18.836-25.185c2.164-2.89 5.472-4.412 8.825-4.412 2.293 0 4.604 0.714 6.583 2.192l164.030 122.669c2.777 2.076 4.416 5.343 4.416 8.816s-1.642 6.74-4.419 8.816zM617.258 543.483l-28.969 12.25c-2.686 1.139-5.718 1.157-8.426 0.063-2.705-1.098-4.865-3.224-6.001-5.913l-172.977-409.119c-2.368-5.598 0.252-12.058 5.853-14.426l28.969-12.25c1.368-0.582 2.827-0.868 4.287-0.868 1.406 0 2.812 0.27 4.139 0.808 2.705 1.098 4.862 3.224 6.001 5.913l172.977 409.119c2.365 5.598-0.255 12.055-5.853 14.423zM968.962 933.384h-913.924c-30.346 0-55.038-24.692-55.038-55.038v-860.691c0-30.346 24.692-55.038 55.038-55.038h913.924c30.346 0 55.038 24.692 55.038 55.038v860.691c0 30.35-24.692 55.038-55.038 55.038zM860.058 848.993c25.145 0 45.603-20.458 45.603-45.603s-20.458-45.603-45.603-45.603c-25.145 0-45.603 20.458-45.603 45.603s20.458 45.603 45.603 45.603zM705.414 848.993c25.145 0 45.603-20.458 45.603-45.603s-20.458-45.603-45.603-45.603c-25.145 0-45.603 20.458-45.603 45.603s20.458 45.603 45.603 45.603zM139.637 826.977h183.985c13.027 0 23.588-10.558 23.588-23.588s-10.561-23.588-23.588-23.588h-183.985c-13.027 0-23.588 10.558-23.588 23.588s10.561 23.588 23.588 23.588zM936.58 57.984c0-3.956-3.221-7.18-7.183-7.18h-834.794c-3.96 0-7.183 3.224-7.183 7.18v592.746h849.161v-592.746z" /> -<glyph unicode="" glyph-name="archive" d="M945.238 644.924h-866.463c-10.674 0-19.905-3.895-27.697-11.691-7.796-7.792-11.691-17.024-11.691-27.691v-590.772c0-10.665 3.895-19.901 11.691-27.691 7.792-7.796 17.024-11.7 27.697-11.7h866.463c10.667 0 19.893 3.904 27.691 11.7 7.79 7.788 11.685 17.024 11.685 27.691v590.772c0 10.674-3.88 19.897-11.685 27.691-7.79 7.796-17.024 11.691-27.691 11.691zM618.454 459.694c-7.788-7.794-17.024-11.691-27.691-11.691h-157.539c-10.661 0-19.893 3.899-27.691 11.691-7.792 7.796-11.691 17.024-11.691 27.697 0 10.665 3.899 19.897 11.691 27.691 7.796 7.796 17.028 11.695 27.691 11.695h157.554c10.659 0 19.888-3.899 27.691-11.695 7.79-7.792 11.685-17.024 11.685-27.691 0-10.672-3.904-19.901-11.7-27.697zM1012.32 908.927c-7.798 7.796-17.024 11.691-27.693 11.691h-945.242c-10.665 0-19.897-3.895-27.691-11.691-7.794-7.792-11.693-17.024-11.693-27.691v-157.539c0-10.665 3.899-19.893 11.695-27.691 7.794-7.796 17.024-11.691 27.691-11.691h945.227c10.665 0 19.901 3.895 27.706 11.691 7.788 7.796 11.682 17.024 11.682 27.691v157.539c0 10.674-3.895 19.899-11.682 27.691z" /> -<glyph unicode="" glyph-name="enter" d="M677.571 437.241h-644.248c-18.395 0-33.323 14.929-33.323 33.323s14.929 33.323 33.323 33.323h644.248c18.395 0 33.323-14.929 33.323-33.323s-14.929-33.323-33.323-33.323zM499.849 259.519c-8.534 0-17.060 3.238-23.552 9.771-13.017 13.017-13.017 34.121 0 47.146l154.177 154.169-154.177 154.177c-13.017 13.017-13.017 34.129 0 47.146 13.025 13.017 34.129 13.017 47.146 0l177.722-177.73c13.017-13.017 13.017-34.121 0-47.137l-177.722-177.722c-6.533-6.582-15.059-9.82-23.593-9.82v0zM533.173-18.18c-202.21 0-380.728 121.651-454.884 309.957-6.753 17.060 1.684 36.431 18.793 43.184 17.060 6.663 36.48-1.643 43.232-18.842 64.027-162.573 218.245-267.652 392.859-267.652 232.726 0 422.098 189.372 422.098 422.098s-189.372 422.098-422.098 422.098c-174.614 0-328.832-105.079-392.859-267.652-6.801-17.199-26.172-25.505-43.232-18.842-17.109 6.753-25.546 26.123-18.793 43.184 74.156 188.306 252.675 309.957 454.884 309.957 269.475 0 488.744-219.27 488.744-488.744s-219.27-488.744-488.744-488.744z" /> -<glyph unicode="" glyph-name="file-code" horiz-adv-x="768" d="M512 960h-512v-1024h768v768l-256 256zM448 640h256v-640h-640v896h384v-256zM512 704v192l192-192h-192zM268.8 128h-44.8l-128 160 128 160h44.8l-128-160zM499.2 128h44.8l128 160-128 160h-44.8l128-160zM300.8 64h38.4l134.4 448h-51.2z" /> -<glyph unicode="" glyph-name="drag-menu" horiz-adv-x="372" d="M169.256 845.363c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 591.728c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 338.091c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 84.455c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 845.363c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 591.728c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 338.091c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 84.455c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546z" /> -<glyph unicode="" glyph-name="mapping" horiz-adv-x="1698" d="M439.686 447.811c0 118.806-96.658 215.464-215.464 215.464s-215.464-96.658-215.464-215.464c0-118.806 96.658-215.464 215.464-215.464s215.464 96.658 215.464 215.464zM224.222 293.908c-84.863 0-153.903 69.040-153.903 153.903s69.040 153.903 153.903 153.903c84.863 0 153.903-69.040 153.903-153.903s-69.040-153.903-153.903-153.903zM612.057 878.739c16.965 0 30.781 13.815 30.781 30.781 0 16.989-13.815 30.781-30.781 30.781s-30.781-13.791-30.781-30.781c0-16.965 13.815-30.781 30.781-30.781zM488.935 940.3h-169.293c-8.092 0-16.040-3.294-21.763-9.018s-9.018-13.671-9.018-21.763v-147.747c0-16.965 13.815-30.781 30.781-30.781s30.781 13.815 30.781 30.781v116.966h138.513c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM612.057 16.883c-16.965 0-30.781-13.815-30.781-30.781s13.815-30.781 30.781-30.781c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM488.935 16.883h-138.513v116.966c0 16.965-13.815 30.781-30.781 30.781s-30.781-13.815-30.781-30.781v-147.747c0-8.092 3.294-16.040 9.018-21.763s13.671-9.018 21.763-9.018h169.293c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM1129.404 550.103c-13.736 14.479-36.54 15.296-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.293-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.74-1.37 1.444-2.107 2.117zM1654.962 471.362h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624zM1129.404 843.097c-13.736 14.479-36.54 15.296-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.296-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.74-1.37 1.444-2.107 2.117zM1654.962 764.356h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624zM1129.404 257.112c-13.736 14.479-36.54 15.293-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.293-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.736-1.37 1.441-2.107 2.117zM1654.962 178.368h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624z" /> -<glyph unicode="" glyph-name="template-mapping" horiz-adv-x="1843" d="M872 448c0-66.273-53.727-120-120-120s-120 53.727-120 120c0 66.273 53.727 120 120 120s120-53.727 120-120zM892 448c0 77.195-62.805 140-140 140s-140-62.805-140-140c0-77.195 62.805-140 140-140s140 62.805 140 140zM752 348c-55.141 0-100 44.859-100 100s44.859 100 100 100c55.141 0 100-44.859 100-100s-44.859-100-100-100zM252 960h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232 728h-192v192h192v-192zM252 208h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232-24h-192v192h192v-192zM252 584h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232 352h-192v192h192v-192zM332 428h140l-32-24c-8.836-6.625-10.625-19.164-4-28 3.93-5.234 9.938-8 16.016-8 4.18 0 8.383 1.305 11.984 4l80 60c0.102 0.070 8 6 8 16 0 6.172-3.039 12.305-8 16l-80 60c-8.836 6.633-21.375 4.836-28-4s-4.836-21.375 4-28l32-24h-140c-11.047 0-20-8.953-20-20s8.953-20 20-20zM332 804h169.711l140-140h-49.711c-11.047 0-20-8.953-20-20s8.953-20 20-20h100c12.82 0 22.789 13.312 19.203 25.602l-28 96c-3.094 10.602-14.203 16.703-24.805 13.602-10.602-3.094-16.688-14.195-13.594-24.805l6.961-23.875-127.625 127.625c-3.75 3.742-8.836 5.852-14.141 5.852h-178c-11.047 0-20-8.953-20-20s8.953-20 20-20zM692 268h-100c-11.047 0-20-8.953-20-20s8.953-20 20-20h49.711l-140-140h-169.711c-11.047 0-20-8.953-20-20s8.953-20 20-20h178c5.305 0 10.391 2.109 14.141 5.859l127.625 127.625-6.969-23.883c-3.094-10.609 3-21.711 13.602-24.797 1.875-0.547 3.758-0.813 5.609-0.813 8.664 0 16.641 5.68 19.195 14.406 0 0 27.867 95.562 28 96 3.578 12.297-6.437 25.602-19.203 25.602v0zM1004 728c11.023 0 20 8.977 20 20 0 11.039-8.977 20-20 20s-20-8.961-20-20c0-11.023 8.977-20 20-20zM924 768h-110c-5.258 0-10.422-2.141-14.141-5.859s-5.859-8.883-5.859-14.141v-96c0-11.023 8.977-20 20-20s20 8.977 20 20v76h90c11.023 0 20 8.977 20 20s-8.977 20-20 20zM1004 168c-11.023 0-20-8.977-20-20s8.977-20 20-20c11.023 0 20 8.977 20 20s-8.977 20-20 20zM924 168h-90v76c0 11.023-8.977 20-20 20s-20-8.977-20-20v-96c0-5.258 2.141-10.422 5.859-14.141s8.883-5.859 14.141-5.859h110c11.023 0 20 8.977 20 20s-8.977 20-20 20zM1387.759 524.215c-11.101 11.702-29.53 12.362-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.359-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.598-1.108 1.167-1.702 1.711zM1812.494 460.58h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598zM1387.759 761.001c-11.101 11.702-29.53 12.362-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.362-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.598-1.108 1.167-1.702 1.711zM1812.494 697.366h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598zM1387.759 287.432c-11.101 11.702-29.53 12.359-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.359-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.595-1.108 1.164-1.702 1.711zM1812.494 223.794h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598z" /> -<glyph unicode="" glyph-name="template" horiz-adv-x="1109" d="M253.953 960h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798 726.202h-193.488v193.488h193.488v-193.488zM1054.115 856.806h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828zM253.953 573.023h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798 339.225h-193.488v193.488h193.488v-193.488zM1054.115 469.829h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828zM253.953 211.845h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798-21.953h-193.488v193.488h193.488v-193.488zM1054.115 108.651h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828z" /> +<glyph unicode="" glyph-name="generic-script-mode" d="M972.8 960h-921.6c-28.228 0-51.2-22.972-51.2-51.2v-85.334h1024v85.334c0 28.228-22.972 51.2-51.2 51.2zM85.334 857.6c-9.42 0-17.066 7.628-17.066 17.066s7.646 17.066 17.066 17.066c9.42 0 17.066-7.628 17.066-17.066s-7.646-17.066-17.066-17.066zM153.6 857.6c-9.42 0-17.066 7.628-17.066 17.066s7.646 17.066 17.066 17.066c9.42 0 17.066-7.628 17.066-17.066s-7.646-17.066-17.066-17.066zM221.866 857.6c-9.42 0-17.066 7.628-17.066 17.066s7.646 17.066 17.066 17.066c9.42 0 17.066-7.628 17.066-17.066s-7.644-17.066-17.066-17.066zM1024 789.333v-802.134c0-28.228-22.972-51.2-51.2-51.2v0h-921.6c-28.228 0-51.2 22.972-51.2 51.2v0 802.134h1024zM938.667 704h-853.333v-682.667h853.333v682.667zM211.98 523.269c2.331-2.331 5.39-3.502 8.45-3.502s6.12 1.165 8.456 3.502c4.668 4.668 4.668 12.239 0 16.907l-29.027 29.027 29.027 29.021c4.668 4.674 4.668 12.239 0 16.907s-12.239 4.668-16.907 0l-37.477-37.477c-2.243-2.243-3.502-5.284-3.502-8.45 0-3.172 1.259-6.213 3.502-8.456l37.477-37.477zM330.606 569.203l-29.027-29.027c-4.668-4.668-4.668-12.239 0.006-16.907 2.331-2.331 5.39-3.502 8.45-3.502s6.12 1.172 8.45 3.502l37.484 37.484c4.668 4.668 4.668 12.239 0 16.9l-37.484 37.484c-4.668 4.668-12.233 4.668-16.9 0-4.674-4.674-4.674-12.239 0-16.907l29.021-29.027zM247.413 520.595c1.433-0.561 2.916-0.829 4.368-0.829 4.773 0 9.279 2.879 11.13 7.584l29.445 74.961c2.418 6.144-0.611 13.080-6.755 15.498-6.138 2.412-13.080-0.611-15.492-6.755l-29.451-74.961c-2.412-6.144 0.611-13.087 6.755-15.498zM189.72 449.635h80.532c6.599 0 11.952 5.353 11.952 11.959 0 6.599-5.353 11.952-11.952 11.952h-80.532c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.347-11.959 11.952-11.959zM455.733 473.546h-141.584c-6.599 0-11.952-5.353-11.952-11.952 0-6.606 5.353-11.959 11.952-11.959h141.584c6.606 0 11.959 5.353 11.959 11.959 0 6.599-5.353 11.952-11.959 11.952zM189.72 399.214h34.306c6.599 0 11.952 5.353 11.952 11.959 0 6.599-5.353 11.952-11.952 11.952h-34.306c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.347-11.959 11.952-11.959zM411.999 423.125c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.347-11.959 11.952-11.959h20.889c6.606 0 11.959 5.353 11.959 11.959 0 6.599-5.353 11.952-11.959 11.952h-20.889zM380.535 411.173c0 6.599-5.353 11.952-11.952 11.952h-102.611c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.347-11.959 11.952-11.959h102.611c6.599 0 11.952 5.353 11.952 11.959zM458.842 411.173c0-6.606 5.353-11.959 11.952-11.959h39.129c6.606 0 11.959 5.353 11.959 11.959 0 6.599-5.353 11.952-11.959 11.952h-39.129c-6.599 0-11.952-5.353-11.952-11.952zM393.74 559.612h41.273c6.606 0 11.959 5.353 11.959 11.959 0 6.599-5.353 11.952-11.959 11.952h-41.273c-6.606 0-11.959-5.353-11.959-11.952 0-6.606 5.353-11.959 11.959-11.959zM481.239 559.612h251.829c6.606 0 11.952 5.353 11.952 11.959 0 6.599-5.347 11.952-11.952 11.952h-251.829c-6.606 0-11.959-5.353-11.959-11.952 0-6.606 5.353-11.959 11.959-11.959zM694.818 530.927h-102.013c-6.599 0-11.952-5.353-11.952-11.959 0-6.599 5.353-11.952 11.952-11.952h102.013c6.599 0 11.952 5.353 11.952 11.952 0 6.606-5.353 11.959-11.952 11.959zM554.555 530.927h-35.066c-6.606 0-11.952-5.353-11.952-11.959 0-6.599 5.347-11.952 11.952-11.952h35.066c6.606 0 11.952 5.353 11.952 11.952 0 6.606-5.347 11.959-11.952 11.959zM393.74 507.016h85.904c6.599 0 11.952 5.353 11.952 11.952 0 6.606-5.353 11.959-11.952 11.959h-85.904c-6.606 0-11.959-5.353-11.959-11.959 0-6.599 5.353-11.952 11.959-11.952zM368.732 373.128h-80.526c-6.606 0-11.959-5.353-11.959-11.952s5.353-11.952 11.959-11.952h80.526c6.599 0 11.952 5.353 11.952 11.952s-5.353 11.952-11.952 11.952zM251.588 373.128h-61.868c-6.606 0-11.952-5.353-11.952-11.952s5.347-11.952 11.952-11.952h61.868c6.606 0 11.952 5.353 11.952 11.952s-5.347 11.952-11.952 11.952zM514.71 373.128h-105.197c-6.606 0-11.952-5.353-11.952-11.952s5.347-11.952 11.952-11.952h105.197c6.599 0 11.952 5.353 11.952 11.952s-5.353 11.952-11.952 11.952v0zM656.973 434.535h-57.525c-6.599 0-11.952-5.353-11.952-11.952 0-6.606 5.353-11.959 11.952-11.959h57.525c6.606 0 11.952 5.353 11.952 11.959 0 6.599-5.347 11.952-11.952 11.952v0zM756.793 410.624h81.205c6.606 0 11.959 5.353 11.959 11.959 0 6.599-5.353 11.952-11.959 11.952h-81.205c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.353-11.959 11.952-11.959zM716.187 434.535h-18.608c-6.606 0-11.959-5.353-11.959-11.952 0-6.606 5.353-11.959 11.959-11.959h18.608c6.606 0 11.952 5.353 11.952 11.959 0 6.599-5.347 11.952-11.952 11.952zM599.448 280.357h57.525c6.606 0 11.952 5.347 11.952 11.952 0 6.599-5.347 11.952-11.952 11.952h-57.525c-6.599 0-11.952-5.353-11.952-11.952 0-6.606 5.353-11.952 11.952-11.952v0zM756.793 280.357h81.205c6.606 0 11.959 5.347 11.959 11.952 0 6.599-5.353 11.952-11.959 11.952h-81.205c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.353-11.952 11.952-11.952zM697.579 280.357h18.608c6.606 0 11.959 5.347 11.959 11.952 0 6.599-5.353 11.952-11.959 11.952h-18.608c-6.606 0-11.952-5.353-11.952-11.952 0-6.606 5.347-11.952 11.952-11.952zM656.973 173.988h-57.525c-6.599 0-11.952-5.353-11.952-11.952s5.353-11.952 11.952-11.952h57.525c6.606 0 11.952 5.353 11.952 11.952s-5.347 11.952-11.952 11.952v0zM837.998 173.988h-81.205c-6.606 0-11.952-5.353-11.952-11.952s5.347-11.952 11.952-11.952h81.205c6.606 0 11.959 5.353 11.959 11.952s-5.353 11.952-11.959 11.952v0zM716.187 173.988h-18.608c-6.606 0-11.959-5.353-11.959-11.952s5.353-11.952 11.959-11.952h18.608c6.606 0 11.952 5.353 11.952 11.952s-5.347 11.952-11.952 11.952z" /> +<glyph unicode="" glyph-name="clone" horiz-adv-x="830" d="M205.943 684.214c16.494 0 29.864 13.274 29.864 29.652v202.771h249.198c16.494 0 29.871-13.274 29.871-29.659v-136.986h-81.325c-8.034 0-15.633-3.229-21.148-8.698l-234.083-232.43c-5.253-5.209-8.761-12.739-8.761-20.953v-367.34h-137.965c-16.502 0-29.871 13.282-29.871 29.659v533.986h204.219zM176.072 874.7v-131.175h-132.112zM463.4 487.909v202.771h249.176c16.502 0 29.871-13.282 29.871-29.659v-690.013c0-16.385-13.369-29.659-29.871-29.659h-453.41c-16.494 0-29.871 13.274-29.871 29.659v487.242h204.242c16.487 0 29.864 13.267 29.864 29.659zM403.665 517.568h-132.112l132.112 131.153zM685.427 892.834v67.166l-90.194-89.555 90.194-89.555v67.166c49.734 0 90.194-40.174 90.194-89.555v-44.777h45.097v44.777c0 74.072-60.693 134.332-135.292 134.332z" /> +<glyph unicode="" glyph-name="delete" d="M170.667 49.778c0-62.578 51.2-113.778 113.778-113.778h455.111c62.578 0 113.778 51.2 113.778 113.778v682.667h-682.667v-682.667zM910.222 903.111h-199.111l-56.889 56.889h-284.444l-56.889-56.889h-199.111v-113.778h796.444v113.778z" /> +<glyph unicode="" glyph-name="designer-mode" d="M1024 793.672c0 71.312-58.064 129.328-129.434 129.328h-765.132c-71.37 0-129.434-58.016-129.434-129.328v-530.574c0-32.88 12.344-62.934 32.646-85.778-19.814-14.932-32.646-38.648-32.646-65.302 0-76.654 62.414-139.018 139.132-139.018h745.734c76.718 0 139.132 62.364 139.132 139.018 0 26.654-12.832 50.37-32.646 65.302 20.304 22.844 32.648 52.898 32.648 85.778zM60 793.672c0 38.228 31.148 69.328 69.434 69.328h765.132c38.286 0 69.434-31.1 69.434-69.328v-530.574c0-38.228-31.148-69.328-69.434-69.328h-203.372c-27.154 0-49.246-22.084-49.246-49.226 0-8.080-6.596-14.654-14.702-14.654h-230.492c-8.106 0-14.702 6.574-14.702 14.654 0 27.142-22.092 49.226-49.246 49.226h-203.372c-38.286 0-69.434 31.1-69.434 69.328zM884.868 33h-745.736c-43.634 0-79.132 35.448-79.132 79.018 0 11.994 9.784 21.752 21.806 21.752h241.022c5.242-36.078 36.396-63.878 73.926-63.878h230.492c37.53 0 68.684 27.802 73.926 63.878h241.022c12.024 0 21.806-9.758 21.806-21.752 0-43.57-35.498-79.018-79.132-79.018zM597.9 290.358c2.062-8.968 8.128-16.494 16.456-20.416 4.050-1.908 8.416-2.86 12.782-2.86 4.608 0 9.21 1.060 13.438 3.178l95.882 48.032c6.012 3.012 10.838 7.956 13.704 14.040l152.756 324.352c22.62 48.028 1.948 105.504-46.082 128.124h0.002c-23.268 10.958-49.408 12.2-73.606 3.496-24.202-8.704-43.562-26.31-54.52-49.576l-152.758-324.352c-2.866-6.084-3.604-12.954-2.096-19.508zM803.536 731.846c9.118 3.278 18.97 2.812 27.734-1.318h0.002c18.096-8.524 25.886-30.18 17.364-48.278l-14.16-30.064-65.642 30.916 14.16 30.064c4.128 8.766 11.422 15.4 20.542 18.68zM743.268 628.82l65.644-30.914-108.612-230.616-52.482-26.292-13.16 57.208zM161.846 267.084h290.574c16.568 0 30 13.432 30 30v234.358c0 16.568-13.432 30-30 30h-290.574c-16.568 0-30-13.432-30-30v-234.358c0-16.568 13.432-30 30-30zM191.846 501.442h230.574v-174.358h-230.574zM161.846 730.892h371.668c16.568 0 30 13.432 30 30s-13.432 30-30 30h-371.668c-16.568 0-30-13.432-30-30s13.432-30 30-30zM161.846 630.892h281.668c16.568 0 30 13.432 30 30s-13.432 30-30 30h-281.668c-16.568 0-30-13.432-30-30s13.432-30 30-30z" /> +<glyph unicode="" glyph-name="scripting-mode" d="M407.383 250.611c-0.418 2.89-1.966 5.494-4.302 7.243l-118.568 88.668 118.568 88.668c2.337 1.749 3.884 4.353 4.302 7.243 0.415 2.89-0.33 5.825-2.082 8.168l-18.836 25.185c-3.645 4.869-10.539 5.866-15.408 2.22l-164.036-122.669c-2.777-2.076-4.416-5.343-4.416-8.816s1.639-6.74 4.416-8.816l164.036-122.669c1.975-1.481 4.29-2.192 6.583-2.192 3.353 0 6.664 1.522 8.825 4.412l18.836 25.185c1.749 2.343 2.497 5.277 2.082 8.168zM816.975 355.338l-164.030 122.669c-4.869 3.642-11.762 2.645-15.404-2.22l-18.836-25.185c-1.749-2.34-2.497-5.277-2.082-8.168 0.418-2.887 1.963-5.494 4.302-7.243l118.565-88.668-118.565-88.668c-2.34-1.749-3.884-4.356-4.302-7.243-0.415-2.89 0.33-5.828 2.082-8.168l18.836-25.185c2.164-2.89 5.472-4.412 8.825-4.412 2.293 0 4.604 0.714 6.583 2.192l164.030 122.669c2.777 2.076 4.416 5.343 4.416 8.816s-1.642 6.74-4.419 8.816zM617.258 543.483l-28.969 12.25c-2.686 1.139-5.718 1.157-8.426 0.063-2.705-1.098-4.865-3.224-6.001-5.913l-172.977-409.119c-2.368-5.598 0.252-12.058 5.853-14.426l28.969-12.25c1.368-0.582 2.827-0.868 4.287-0.868 1.406 0 2.812 0.27 4.139 0.808 2.705 1.098 4.862 3.224 6.001 5.913l172.977 409.119c2.365 5.598-0.255 12.055-5.853 14.423zM968.962 933.384h-913.924c-30.346 0-55.038-24.692-55.038-55.038v-860.691c0-30.346 24.692-55.038 55.038-55.038h913.924c30.346 0 55.038 24.692 55.038 55.038v860.691c0 30.35-24.692 55.038-55.038 55.038zM860.058 848.993c25.145 0 45.603-20.458 45.603-45.603s-20.458-45.603-45.603-45.603c-25.145 0-45.603 20.458-45.603 45.603s20.458 45.603 45.603 45.603zM705.414 848.993c25.145 0 45.603-20.458 45.603-45.603s-20.458-45.603-45.603-45.603c-25.145 0-45.603 20.458-45.603 45.603s20.458 45.603 45.603 45.603zM139.637 826.977h183.985c13.027 0 23.588-10.558 23.588-23.588s-10.561-23.588-23.588-23.588h-183.985c-13.027 0-23.588 10.558-23.588 23.588s10.561 23.588 23.588 23.588zM936.58 57.984c0-3.956-3.221-7.18-7.183-7.18h-834.794c-3.96 0-7.183 3.224-7.183 7.18v592.746h849.161v-592.746z" /> +<glyph unicode="" glyph-name="archive" d="M945.238 644.924h-866.463c-10.674 0-19.905-3.895-27.697-11.691-7.796-7.792-11.691-17.024-11.691-27.691v-590.772c0-10.665 3.895-19.901 11.691-27.691 7.792-7.796 17.024-11.7 27.697-11.7h866.463c10.667 0 19.893 3.904 27.691 11.7 7.79 7.788 11.685 17.024 11.685 27.691v590.772c0 10.674-3.88 19.897-11.685 27.691-7.79 7.796-17.024 11.691-27.691 11.691zM618.454 459.694c-7.788-7.794-17.024-11.691-27.691-11.691h-157.539c-10.661 0-19.893 3.899-27.691 11.691-7.792 7.796-11.691 17.024-11.691 27.697 0 10.665 3.899 19.897 11.691 27.691 7.796 7.796 17.028 11.695 27.691 11.695h157.554c10.659 0 19.888-3.899 27.691-11.695 7.79-7.792 11.685-17.024 11.685-27.691 0-10.672-3.904-19.901-11.7-27.697zM1012.32 908.927c-7.798 7.796-17.024 11.691-27.693 11.691h-945.242c-10.665 0-19.897-3.895-27.691-11.691-7.794-7.792-11.693-17.024-11.693-27.691v-157.539c0-10.665 3.899-19.893 11.695-27.691 7.794-7.796 17.024-11.691 27.691-11.691h945.227c10.665 0 19.901 3.895 27.706 11.691 7.788 7.796 11.682 17.024 11.682 27.691v157.539c0 10.674-3.895 19.899-11.682 27.691z" /> +<glyph unicode="" glyph-name="enter" d="M677.571 437.241h-644.248c-18.395 0-33.323 14.929-33.323 33.323s14.929 33.323 33.323 33.323h644.248c18.395 0 33.323-14.929 33.323-33.323s-14.929-33.323-33.323-33.323zM499.849 259.519c-8.534 0-17.060 3.238-23.552 9.771-13.017 13.017-13.017 34.121 0 47.146l154.177 154.169-154.177 154.177c-13.017 13.017-13.017 34.129 0 47.146 13.025 13.017 34.129 13.017 47.146 0l177.722-177.73c13.017-13.017 13.017-34.121 0-47.137l-177.722-177.722c-6.533-6.582-15.059-9.82-23.593-9.82v0zM533.173-18.18c-202.21 0-380.728 121.651-454.884 309.957-6.753 17.060 1.684 36.431 18.793 43.184 17.060 6.663 36.48-1.643 43.232-18.842 64.027-162.573 218.245-267.652 392.859-267.652 232.726 0 422.098 189.372 422.098 422.098s-189.372 422.098-422.098 422.098c-174.614 0-328.832-105.079-392.859-267.652-6.801-17.199-26.172-25.505-43.232-18.842-17.109 6.753-25.546 26.123-18.793 43.184 74.156 188.306 252.675 309.957 454.884 309.957 269.475 0 488.744-219.27 488.744-488.744s-219.27-488.744-488.744-488.744z" /> +<glyph unicode="" glyph-name="file-code" horiz-adv-x="768" d="M512 960h-512v-1024h768v768l-256 256zM448 640h256v-640h-640v896h384v-256zM512 704v192l192-192h-192zM268.8 128h-44.8l-128 160 128 160h44.8l-128-160zM499.2 128h44.8l128 160-128 160h-44.8l128-160zM300.8 64h38.4l134.4 448h-51.2z" /> +<glyph unicode="" glyph-name="drag-menu" horiz-adv-x="372" d="M169.256 845.363c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 591.728c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 338.091c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM169.256 84.455c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 845.363c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 591.728c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 338.091c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546zM372.165 84.455c0-46.693-37.852-84.546-84.546-84.546s-84.546 37.852-84.546 84.546c0 46.693 37.852 84.546 84.546 84.546s84.546-37.852 84.546-84.546z" /> +<glyph unicode="" glyph-name="mapping" horiz-adv-x="1698" d="M439.686 447.811c0 118.806-96.658 215.464-215.464 215.464s-215.464-96.658-215.464-215.464c0-118.806 96.658-215.464 215.464-215.464s215.464 96.658 215.464 215.464zM224.222 293.908c-84.863 0-153.903 69.040-153.903 153.903s69.040 153.903 153.903 153.903c84.863 0 153.903-69.040 153.903-153.903s-69.040-153.903-153.903-153.903zM612.057 878.739c16.965 0 30.781 13.815 30.781 30.781 0 16.989-13.815 30.781-30.781 30.781s-30.781-13.791-30.781-30.781c0-16.965 13.815-30.781 30.781-30.781zM488.935 940.3h-169.293c-8.092 0-16.040-3.294-21.763-9.018s-9.018-13.671-9.018-21.763v-147.747c0-16.965 13.815-30.781 30.781-30.781s30.781 13.815 30.781 30.781v116.966h138.513c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM612.057 16.883c-16.965 0-30.781-13.815-30.781-30.781s13.815-30.781 30.781-30.781c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM488.935 16.883h-138.513v116.966c0 16.965-13.815 30.781-30.781 30.781s-30.781-13.815-30.781-30.781v-147.747c0-8.092 3.294-16.040 9.018-21.763s13.671-9.018 21.763-9.018h169.293c16.965 0 30.781 13.815 30.781 30.781s-13.815 30.781-30.781 30.781zM1129.404 550.103c-13.736 14.479-36.54 15.296-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.293-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.74-1.37 1.444-2.107 2.117zM1654.962 471.362h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624zM1129.404 843.097c-13.736 14.479-36.54 15.296-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.296-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.74-1.37 1.444-2.107 2.117zM1654.962 764.356h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624zM1129.404 257.112c-13.736 14.479-36.54 15.293-51.275 1.83l-117.198-111.703-49.442 51.275c-13.736 14.479-36.54 15.293-51.275 1.83-14.185-14.861-14.185-38.244 0-53.105l75.078-76.911c6.498-7.276 15.885-11.3 25.636-10.988 9.66 0.137 18.875 4.087 25.636 10.988l142.834 135.509c14.16 12.99 15.107 35.001 2.114 49.158-0.666 0.736-1.37 1.441-2.107 2.117zM1654.962 178.368h-421.178c-20.228 0-36.624-16.397-36.624-36.624s16.397-36.624 36.624-36.624h421.178c20.228 0 36.624 16.397 36.624 36.624s-16.397 36.624-36.624 36.624z" /> +<glyph unicode="" glyph-name="template-mapping" horiz-adv-x="1843" d="M872 448c0-66.273-53.727-120-120-120s-120 53.727-120 120c0 66.273 53.727 120 120 120s120-53.727 120-120zM892 448c0 77.195-62.805 140-140 140s-140-62.805-140-140c0-77.195 62.805-140 140-140s140 62.805 140 140zM752 348c-55.141 0-100 44.859-100 100s44.859 100 100 100c55.141 0 100-44.859 100-100s-44.859-100-100-100zM252 960h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232 728h-192v192h192v-192zM252 208h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232-24h-192v192h192v-192zM252 584h-232c-11.047 0-20-8.953-20-20v-232c0-11.047 8.953-20 20-20h232c11.047 0 20 8.953 20 20v232c0 11.047-8.953 20-20 20zM232 352h-192v192h192v-192zM332 428h140l-32-24c-8.836-6.625-10.625-19.164-4-28 3.93-5.234 9.938-8 16.016-8 4.18 0 8.383 1.305 11.984 4l80 60c0.102 0.070 8 6 8 16 0 6.172-3.039 12.305-8 16l-80 60c-8.836 6.633-21.375 4.836-28-4s-4.836-21.375 4-28l32-24h-140c-11.047 0-20-8.953-20-20s8.953-20 20-20zM332 804h169.711l140-140h-49.711c-11.047 0-20-8.953-20-20s8.953-20 20-20h100c12.82 0 22.789 13.312 19.203 25.602l-28 96c-3.094 10.602-14.203 16.703-24.805 13.602-10.602-3.094-16.688-14.195-13.594-24.805l6.961-23.875-127.625 127.625c-3.75 3.742-8.836 5.852-14.141 5.852h-178c-11.047 0-20-8.953-20-20s8.953-20 20-20zM692 268h-100c-11.047 0-20-8.953-20-20s8.953-20 20-20h49.711l-140-140h-169.711c-11.047 0-20-8.953-20-20s8.953-20 20-20h178c5.305 0 10.391 2.109 14.141 5.859l127.625 127.625-6.969-23.883c-3.094-10.609 3-21.711 13.602-24.797 1.875-0.547 3.758-0.813 5.609-0.813 8.664 0 16.641 5.68 19.195 14.406 0 0 27.867 95.562 28 96 3.578 12.297-6.437 25.602-19.203 25.602v0zM1004 728c11.023 0 20 8.977 20 20 0 11.039-8.977 20-20 20s-20-8.961-20-20c0-11.023 8.977-20 20-20zM924 768h-110c-5.258 0-10.422-2.141-14.141-5.859s-5.859-8.883-5.859-14.141v-96c0-11.023 8.977-20 20-20s20 8.977 20 20v76h90c11.023 0 20 8.977 20 20s-8.977 20-20 20zM1004 168c-11.023 0-20-8.977-20-20s8.977-20 20-20c11.023 0 20 8.977 20 20s-8.977 20-20 20zM924 168h-90v76c0 11.023-8.977 20-20 20s-20-8.977-20-20v-96c0-5.258 2.141-10.422 5.859-14.141s8.883-5.859 14.141-5.859h110c11.023 0 20 8.977 20 20s-8.977 20-20 20zM1387.759 524.215c-11.101 11.702-29.53 12.362-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.359-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.598-1.108 1.167-1.702 1.711zM1812.494 460.58h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598zM1387.759 761.001c-11.101 11.702-29.53 12.362-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.362-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.598-1.108 1.167-1.702 1.711zM1812.494 697.366h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598zM1387.759 287.432c-11.101 11.702-29.53 12.359-41.439 1.479l-94.715-90.273-39.957 41.439c-11.101 11.702-29.53 12.359-41.439 1.479-11.464-12.010-11.464-30.907 0-42.917l60.675-62.157c5.252-5.881 12.838-9.132 20.718-8.88 7.807 0.11 15.254 3.303 20.718 8.88l115.433 109.513c11.444 10.498 12.209 28.287 1.708 39.728-0.538 0.595-1.108 1.164-1.702 1.711zM1812.494 223.794h-340.379c-16.347 0-29.598-13.251-29.598-29.598s13.251-29.598 29.598-29.598h340.379c16.347 0 29.598 13.251 29.598 29.598s-13.251 29.598-29.598 29.598z" /> +<glyph unicode="" glyph-name="template" horiz-adv-x="1109" d="M253.953 960h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798 726.202h-193.488v193.488h193.488v-193.488zM1054.115 856.806h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828zM253.953 573.023h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798 339.225h-193.488v193.488h193.488v-193.488zM1054.115 469.829h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828zM253.953 211.845h-233.798c-11.133 0-20.155-9.023-20.155-20.155v-233.798c0-11.133 9.023-20.155 20.155-20.155h233.798c11.133 0 20.155 9.023 20.155 20.155v233.798c0 11.133-9.023 20.155-20.155 20.155zM233.798-21.953h-193.488v193.488h193.488v-193.488zM1054.115 108.651h-518.829c-24.917 0-45.116-13.354-45.116-29.828s20.198-29.828 45.116-29.828h518.829c24.917 0 45.116 13.354 45.116 29.828s-20.198 29.828-45.116 29.828z" /> +<glyph unicode="" glyph-name="Upload-attribute" horiz-adv-x="931" d="M529.597 725.461h108.895l-167.074 177.515v-117.847c0-32.818 25.36-59.668 58.177-59.668zM347.605 280.926h-193.925c-10.441 0-17.901 7.458-17.901 17.901s7.458 17.901 17.901 17.901h205.857c11.932 28.342 26.851 53.702 44.752 77.569h-250.609c-10.441 0-17.901 7.458-17.901 17.901s7.458 17.901 17.901 17.901h284.918c53.702 47.735 125.304 77.569 202.875 77.569 7.458 0 13.427 0 22.376-1.492v183.482h-134.254c-52.21 0-93.98 41.769-93.98 93.98v146.189h-343.098c-44.752 0-79.061-35.8-79.061-80.553v-681.72c0-44.752 35.8-79.061 79.061-79.061h268.511c-14.918 35.8-23.868 76.078-23.868 117.847 1.492 25.36 4.475 50.719 10.441 74.586zM153.682 543.471h226.743c10.441 0 17.901-7.458 17.901-17.901s-7.458-17.901-17.901-17.901h-226.743c-10.441 0-17.901 7.458-17.901 17.901 0 8.95 7.458 17.901 17.901 17.901zM641.475 471.868c-147.681 0-267.019-119.337-267.019-267.019s119.337-267.019 267.019-267.019c147.681 0 267.019 119.337 267.019 267.019s-120.83 267.019-267.019 267.019zM783.19 200.374c-2.983-2.983-7.458-4.475-11.932-4.475s-8.95 1.492-13.427 5.967l-98.454 107.403v-255.085c0-10.441-7.458-17.901-17.901-17.901s-17.901 7.458-17.901 17.901v255.085l-99.946-107.403c-5.967-7.458-17.901-7.458-25.36-1.492s-7.458 17.901-1.492 25.36l131.272 140.223c2.983 2.983 7.458 5.967 13.427 5.967 4.475 0 8.95-1.492 13.427-5.967l131.272-140.223c5.967-7.458 4.475-17.901-2.983-25.36z" /> +<glyph unicode="" glyph-name="import-cds" horiz-adv-x="1271" d="M373.922 551.955c-4.153 0-7.839-2.815-8.912-6.821l-187.326-467.415v-16.35c0-11.999-0.773-16.35 9.241-16.35h731.938c18.904 0 35.549 12.744 40.064 29.648l167.225 460.935c0 0 0 10.222 0 16.35h-752.23zM353.172 584.661h674.859v102.495c0 24.645-20.053 44.677-44.677 44.677h-404.776l-81.76 114.466h-307.158c-24.624 0-44.677-20.053-44.677-44.677v-683.478l168.143 436.897c4.494 16.876 21.147 29.619 40.044 29.619z" /> +<glyph unicode="" glyph-name="current-template" horiz-adv-x="1327" d="M522.495 853.894l13.749-77.003h653.568v-718.647h-1052.314v795.65h384.991zM625.163 468.903h-77.003v-205.329h77.003v205.329zM471.169 545.894h-77.003v-282.332h77.003v282.332zM779.157 571.561h-77.003v-307.992h77.003v307.992zM933.15 520.231h-77.003v-256.665h77.003v256.665z" /> +<glyph unicode="" glyph-name="package" horiz-adv-x="1205" d="M1154.309 638.745h-70.074v125.852c0 30.258-24.616 54.854-54.854 54.854h-497.001l-100.392 140.549h-377.133c-30.238 0-54.854-24.616-54.854-54.854v-877.166h0.12c-0.1-11.304 3.413-22.367 10.481-31.624 9.838-12.85 24.737-20.199 40.9-20.199h898.691c23.211 0 43.651 15.641 49.192 36.402l205.322 562.959v3.554c0 34.575-21.203 59.673-50.397 59.673zM40.157 905.146c0 8.112 6.606 14.697 14.697 14.697h356.452l100.392-140.549h517.662c8.112 0 14.697-6.586 14.697-14.697v-125.852h-788.44c-2.891 0-5.763-0.241-8.553-0.723-19.536-3.273-35.78-17.528-40.619-35.659l-166.29-453.512v756.294zM961.134 24.686c-1.325-4.919-5.843-8.373-10.943-8.373h-898.691c-4.879 0-7.73 2.791-8.995 4.457-1.265 1.646-3.213 5.14-2.47 8.192l204.619 561.252c1.325 4.919 5.843 8.373 10.943 8.373h898.711c7.63 0 9.577-10.963 10.079-16.444l-203.254-557.458zM743.632 478.118c-21.744 0-39.427-17.683-39.427-39.427 0-6.801 1.728-13.201 4.771-18.793l-64.588-64.588c-8.904 6.933-20.048 11.099-32.179 11.099s-23.275-4.166-32.185-11.092l-50.394 50.394c2.313 3.91 3.726 8.404 3.726 13.267 0 14.496-11.789 26.284-26.284 26.284s-26.284-11.789-26.284-26.284c0-14.496 11.789-26.284 26.284-26.284 4.863 0 9.357 1.413 13.267 3.726l50.394-50.394c-6.926-8.91-11.092-20.055-11.092-32.185s4.166-23.275 11.092-32.179l-83.217-83.223c-7.005 6.354-16.264 10.264-26.442 10.264-21.744 0-39.427-17.683-39.427-39.427s17.683-39.427 39.427-39.427c21.744 0 39.427 17.683 39.427 39.427 0 6.801-1.728 13.201-4.771 18.793l84.301 84.301c7.268-5.651 16.034-9.436 25.614-10.639v-66.763c-18.616-3.141-32.856-19.332-32.856-38.835 0-21.744 17.683-39.427 39.427-39.427s39.427 17.683 39.427 39.427c0 19.497-14.24 35.688-32.856 38.835v66.763c9.581 1.203 18.347 4.987 25.614 10.639l50.394-50.394c-2.32-3.916-3.732-8.411-3.732-13.274 0-14.496 11.789-26.284 26.284-26.284s26.284 11.789 26.284 26.284c0 14.496-11.789 26.284-26.284 26.284-4.863 0-9.357-1.413-13.267-3.726l-50.394 50.394c6.926 8.91 11.092 20.055 11.092 32.185s-4.166 23.275-11.092 32.179l63.51 63.51c6.998-6.354 16.257-10.264 26.436-10.264 21.744 0 39.427 17.683 39.427 39.427s-17.683 39.427-39.427 39.427z" /> +<glyph unicode="" glyph-name="dictionary" d="M991.457 533.163c-13.803 0-24.993-11.19-24.993-24.993v-203.273c0-13.803 11.19-24.993 24.993-24.993s24.993 11.19 24.993 24.993v203.273c-0.003 13.803-11.193 24.993-24.993 24.993v0zM960.173 959.5h-856.973c-56.907 0-103.2-34.087-103.2-75.984v-835.988c0-48.869 54-88.628 120.377-88.628h799.807c13.6 0 25.733 5.969 30.91 15.209 5.203 9.287 2.297 19.877-7.403 26.98-16.927 12.389-26.247 28.882-26.247 46.439 0 20.432 12.837 39.437 34.62 51.827h8.11c31.030 0 56.277 18.586 56.277 41.435v194.1c0 10.163-11.19 18.402-24.993 18.402s-24.993-8.239-24.993-18.402v-194.1c0-2.555-2.82-4.631-6.29-4.631h-839.797c-25.133 0-50.023-5.925-70.39-16.77v764.128c0 21.602 23.87 39.18 53.213 39.18h856.973c3.47 0 6.29-2.076 6.29-4.631v-144.885c0-10.163 11.19-18.402 24.993-18.402s24.993 8.239 24.993 18.402v144.885c0 22.847-25.247 41.435-56.277 41.435v0zM886.563 99.357c-12.343-15.459-19.107-33.27-19.107-51.829 0-18.522 6.64-36.286 19.090-51.827h-766.17c-38.813 0-70.39 23.249-70.39 51.827s31.577 51.827 70.39 51.827l766.187 0.002zM348.708 760.797c-53.594 0-97.198-43.604-97.198-97.198v-217.009c0-53.594 43.604-97.198 97.198-97.198h319.034c53.594 0 97.198 43.604 97.198 97.198v217.009c0 53.594-43.604 97.198-97.198 97.198h-319.034zM723.265 663.599v-217.009c0-30.617-24.909-55.523-55.523-55.523h-319.034c-30.617 0-55.526 24.909-55.526 55.523v217.009c0 30.617 24.909 55.526 55.526 55.526h319.034c30.617 0 55.523-24.909 55.523-55.526v0zM627.88 590.463c-6.871 0-9.357 1.746-14.802 5.569-7.384 5.184-17.496 12.282-36.054 12.282s-28.67-7.1-36.054-12.282c-5.445-3.823-7.931-5.569-14.802-5.569s-9.357 1.746-14.802 5.569c-7.384 5.184-17.498 12.282-36.054 12.282s-28.668-7.1-36.049-12.284c-5.445-3.823-7.931-5.569-14.8-5.569s-9.354 1.744-14.797 5.569c-7.384 5.184-17.496 12.284-36.052 12.284-10.213 0-18.492-8.279-18.492-18.492s8.279-18.492 18.492-18.492c6.869 0 9.354-1.744 14.797-5.569 7.384-5.184 17.496-12.284 36.052-12.284s28.668 7.1 36.052 12.284c5.443 3.823 7.929 5.569 14.797 5.569 6.871 0 9.357-1.746 14.805-5.569 7.384-5.184 17.498-12.282 36.054-12.282s28.668 7.1 36.054 12.282c5.445 3.823 7.931 5.569 14.805 5.569s9.357-1.746 14.802-5.569c7.384-5.184 17.496-12.282 36.054-12.282 10.213 0 18.492 8.279 18.492 18.492s-8.284 18.492-18.497 18.492v0zM497.633 493.266c-5.575 0-7.592 1.417-12.010 4.518-5.991 4.206-14.195 9.965-29.253 9.965s-23.262-5.761-29.253-9.965c-4.418-3.102-6.435-4.518-12.010-4.518s-7.592 1.417-12.012 4.518c-5.991 4.206-14.197 9.965-29.253 9.965-8.286 0-15.004-6.717-15.004-15.004s6.717-15.004 15.004-15.004c5.575 0 7.592-1.417 12.010-4.518 5.991-4.206 14.197-9.965 29.253-9.965s23.26 5.761 29.253 9.965c4.418 3.102 6.435 4.518 12.012 4.518 5.575 0 7.592-1.417 12.010-4.518 5.991-4.206 14.197-9.965 29.253-9.965 8.286 0 15.004 6.717 15.004 15.004s-6.717 15.004-15.004 15.004z" /> +<glyph unicode="" glyph-name="deploy" d="M890.522 252.945l-95.505-137.216-67.396 55.313c-7.27 5.99-18.039 4.898-24.013-2.355-5.99-7.287-4.932-18.057 2.372-24.013l81.681-67.055c3.072-2.526 6.895-3.891 10.82-3.891 0.768 0 1.553 0.051 2.338 0.171 4.71 0.649 8.943 3.243 11.674 7.151l106.052 152.388c5.376 7.731 3.482 18.364-4.267 23.757-7.748 5.461-18.364 3.516-23.757-4.25zM802.133 379.733c-122.334 0-221.867-99.533-221.867-221.867s99.533-221.867 221.867-221.867c122.334 0 221.867 99.533 221.867 221.867s-99.533 221.867-221.867 221.867zM802.133-29.867c-103.509 0-187.733 84.224-187.733 187.733s84.224 187.733 187.733 187.733c103.509 0 187.733-84.224 187.733-187.733s-84.224-187.733-187.733-187.733zM945.357 960h-866.714c-43.366 0-78.643-35.277-78.643-78.643v-201.097c0-16.623 5.359-31.898 14.251-44.527h995.482c8.909 12.629 14.268 27.904 14.268 44.51v201.114c0 43.366-35.277 78.643-78.643 78.643zM179.2 704c-42.342 0-76.8 34.458-76.8 76.8s34.458 76.8 76.8 76.8c42.342 0 76.8-34.458 76.8-76.8s-34.458-76.8-76.8-76.8zM580.267 789.333c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM614.4 738.133c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM648.533 789.333c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM682.667 738.133c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM716.8 789.333c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM750.933 738.133c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM785.067 789.333c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM819.2 738.133c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM853.333 789.333c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM887.467 738.133c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM529.067 157.867c0 42.871 10.206 83.319 27.904 119.467h-542.72c-8.892-12.629-14.251-27.904-14.251-44.51v-201.097c0-43.383 35.277-78.66 78.643-78.66h543.471c-56.9 50.091-93.047 123.221-93.047 204.8zM179.2 55.467c-42.342 0-76.8 34.458-76.8 76.8s34.458 76.8 76.8 76.8c42.342 0 76.8-34.458 76.8-76.8s-34.458-76.8-76.8-76.8zM14.251 601.6c-8.892-12.629-14.251-27.904-14.251-44.51v-201.097c0-16.623 5.359-31.898 14.251-44.527h562.278c49.22 72.055 131.959 119.467 225.587 119.467 87.433 0 165.205-41.472 215.211-105.609 4.147 9.421 6.656 19.695 6.656 30.652v201.114c0 16.623-5.359 31.881-14.251 44.51h-995.482zM179.2 379.733c-42.342 0-76.8 34.458-76.8 76.8s34.458 76.8 76.8 76.8c42.342 0 76.8-34.458 76.8-76.8s-34.458-76.8-76.8-76.8zM580.267 465.067c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM648.533 465.067c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM716.8 465.067c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM785.067 465.067c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067zM853.333 465.067c-9.421 0-17.067 7.646-17.067 17.067s7.646 17.067 17.067 17.067c9.421 0 17.067-7.646 17.067-17.067s-7.646-17.067-17.067-17.067z" /> </font></defs></svg>
\ No newline at end of file diff --git a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.ttf b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.ttf Binary files differindex 1f3af3988..67d9da298 100755 --- a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.ttf +++ b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.ttf diff --git a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.woff b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.woff Binary files differindex e5f2266d2..6378c642f 100755 --- a/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.woff +++ b/cds-ui/designer-client/src/assets/icomoon/fonts/icomoon.woff diff --git a/cds-ui/designer-client/src/assets/icomoon/style.css b/cds-ui/designer-client/src/assets/icomoon/style.css index 6294f3088..cc5d3fb83 100755 --- a/cds-ui/designer-client/src/assets/icomoon/style.css +++ b/cds-ui/designer-client/src/assets/icomoon/style.css @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('fonts/icomoon.eot?3g19qh'); - src: url('fonts/icomoon.eot?3g19qh#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?3g19qh') format('truetype'), - url('fonts/icomoon.woff?3g19qh') format('woff'), - url('fonts/icomoon.svg?3g19qh#icomoon') format('svg'); + src: url('fonts/icomoon.eot?3iboyv'); + src: url('fonts/icomoon.eot?3iboyv#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?3iboyv') format('truetype'), + url('fonts/icomoon.woff?3iboyv') format('woff'), + url('fonts/icomoon.svg?3iboyv#icomoon') format('svg'); font-weight: normal; font-style: normal; font-display: block; @@ -25,36 +25,57 @@ -moz-osx-font-smoothing: grayscale; } -.icon-mapping:before { - content: "\e908"; +.icon-package:before { + content: "\e90f"; } -.icon-template-mapping:before { - content: "\e909"; +.icon-dictionary:before { + content: "\e910"; } -.icon-template:before { - content: "\e90a"; +.icon-deploy:before { + content: "\e911"; } -.icon-drag-menu:before { - content: "\e907"; +.icon-Upload-attribute:before { + content: "\e90c"; } -.icon-file-code:before { - content: "\e906"; +.icon-import-cds:before { + content: "\e90d"; } -.icon-enter:before { - content: "\e905"; +.icon-current-template:before { + content: "\e90e"; } -.icon-clone:before { +.icon-generic-script-mode:before { content: "\e900"; } -.icon-delete:before { +.icon-clone:before { content: "\e901"; } -.icon-designer-mode:before { +.icon-delete:before { content: "\e902"; } -.icon-scripting-mode:before { +.icon-designer-mode:before { content: "\e903"; } -.icon-archive:before { +.icon-scripting-mode:before { content: "\e904"; } +.icon-archive:before { + content: "\e905"; +} +.icon-enter:before { + content: "\e906"; +} +.icon-file-code:before { + content: "\e907"; +} +.icon-drag-menu:before { + content: "\e908"; +} +.icon-mapping:before { + content: "\e909"; +} +.icon-template-mapping:before { + content: "\e90a"; +} +.icon-template:before { + content: "\e90b"; +} diff --git a/cds-ui/designer-client/src/styles.css b/cds-ui/designer-client/src/styles.css index 91bc3f9ad..36cb20804 100644 --- a/cds-ui/designer-client/src/styles.css +++ b/cds-ui/designer-client/src/styles.css @@ -92,8 +92,13 @@ body{ color: #fff; } .menu-dropdown li .icon{ - padding: 2px 6px; + text-align: center; + font-size: 16px; color: #fff; + line-height: 33px; +} +.menu-dropdown a{ + cursor: pointer; } .menu-dropdown li.active .icon{ color: #fff; @@ -409,7 +414,6 @@ height: 40px; padding: 10px 10px 10px 32px; font-weight: bold; font-size: 10px; - text-transform: uppercase; border-radius: 2px; border-width: .5px; border-style: solid; @@ -470,7 +474,7 @@ height: 40px; border-bottom-color: #ECEDF2 !important; } .nav-link{ - padding: 15px 20px 15px 0 !important; + padding: 15px 20px 15px 20px !important; text-transform: uppercase !important; font-size: 12px; font-weight: bold; @@ -495,6 +499,8 @@ height: 40px; padding-right: 20px !important; color: #C3CDDB; font-weight: normal; + position: absolute; + left: 0px; } .nav-tabs .nav-link:first-child::before{ content: none; @@ -579,8 +585,9 @@ height: 40px; width: 0px; height: 0px; border-style: solid; - border-width: 5px 4px 0 4px; - border-color: #555 transparent transparent transparent; + /* border-width: 5px 4px 0 4px; + border-color: #555 transparent transparent transparent; */ + border:0px } .dropdown-toggle{ font-size: 0; @@ -718,9 +725,12 @@ height: 40px; .main-container{ padding: 0 !important; } +.header-button-save button{ + border-radius: 50px; +} /*Page Title*/ .page-title{ - padding: 21px 30px; + padding: 15px 30px 14px; background:#fff; border-left: solid 1px #FAFAFA; margin-bottom: 21px; @@ -728,10 +738,14 @@ height: 40px; box-shadow: 0 4px 10px 0 #eef0f5; position: relative; z-index: 8; + position: fixed; + width: calc(100% - 50px); } .page-title h2{ font-size: 16px; font-weight: bold; + padding-top: 3px; + padding-bottom: 2px; } .page-title h2 span{ color: #BABBC3; @@ -739,7 +753,7 @@ height: 40px; } /*Content*/ .body-container{ - padding: 0 30px !important; + padding: 90px 30px 0 !important; } .search-filter-col{ padding-right: 0 !important; @@ -924,14 +938,13 @@ height: 40px; } .addPaackage-card a{ margin: 0 0 14px; - padding: 10px 10px 10px 32px; + padding: 10px 20px 10px 42px; font-weight: bold; - font-size: 10px; - text-transform: uppercase; + font-size: 13px; border-radius: 2px; - border-width: .5px; + border-width: 0px; border-style: solid; - background-position: 10px center; + background-position: 20px center; background-repeat: no-repeat; text-align: left; } @@ -957,6 +970,8 @@ height: 40px; .btn-import-package:hover{ color: #1B3E6F; background-image: url(../src/assets/img/icon-import-blue.svg); + background-size: 16px; + background-color: #C3CDDB; } /***Actions Menu***/ .packages-card .dropdown{ @@ -1460,6 +1475,42 @@ padding-left: 20px !important; .btn + .btn{ margin-left: 10px; } + .package-view-button button{ + width: 150px; + float: right; + } +.package-view-button{ + margin-top: 6px; +} +.package-view-button .btn-primary{ + background-color: #1B3E6F !important; + border-color: #1B3E6F !important; + + /* margin-bottom: 10px; */ +} +.package-view-button .btn-outline-secondary{ + background-color: #fff !important; + border-color: #D0DFF1 !important; + color: #1B3E6F !important; + margin-left: 10px; +} +.package-view-title { + font-size: 11px; + color: #1B3E6F; + font-weight: bold; + margin-bottom: 5px; + margin-top: 20px; +} +.package-view-title+p{ + font-size: 11px; + margin-bottom: 0px; +} +.package-view-title+ul{ + margin-bottom: 0px; +} +.package-view-button .btn-outline-secondary i{ + font-size: 18px; +} .card.creat-card{ margin: 0; border-radius: 2px; @@ -1469,9 +1520,61 @@ padding-left: 20px !important; .card.creat-card .single-line{ padding: 15px 25px 15px; } +.card.creat-card .single-line-model{ + padding: 0px; +} +.card.creat-card .editor-container{ + padding: 25px; +} .single-line label{ margin-bottom: 0px; } + .single-line-model label{ + margin-bottom: 0px; + border-bottom: 1px solid #efefef; + padding: 15px 25px; + } + .single-line-model .label-name{ + width: 325px; + } + .single-line-model .label-input{ + width: calc(100% - 325px); + } + + .single-line-model input{ + border-bottom: 1px solid #efefef !important; + padding: 15px 25px 15px 0px; + } + .model-note-container{ + width: calc(100% - 325px); + padding: 0px 25px 0px 0px ; + margin-left: 325px; + } + .error-message{ + font-size:11px ; + } + .tages-container{ + margin-bottom: 25px; + } + .tag-notes{ +font-size: 11px; +color: #C3CDDB; +padding: 5px 25px 5px 0px; +margin-bottom: 5px; + } + .single-tage{ + background: #E0E8F2; + font-size: 13px; + color: #1B3E6F; + border-radius: 50px; + padding: 5px 10px; + margin-right:10px; + margin-bottom: 10px; + } + .single-tage a{ + color: #1B3E6F; + font-size: 14px; + } .label-name{ width: 300px; display: inline-block; @@ -1479,6 +1582,9 @@ padding-left: 20px !important; font-size: 14px; font-weight: bold; } + .label-name span{ + color:#FF6469 ; + } .delete-key{ color: #FF6469; font-size: 10px; @@ -1506,13 +1612,20 @@ padding-left: 20px !important; margin-left: 20px; margin-right: 50px; font-size: 14px; + display: flex; +} +.form-check-input+span i{ + margin-right: 5px; + margin-left: 5px; } + .label-input input{ margin-bottom: 0px; outline: 0px; border: 0px; font-size: 14px; width: 100%; + color: #1B3E6F; } .label-input input[type=radio]{ width: auto; @@ -1530,21 +1643,33 @@ padding-left: 20px !important; background: none; background: url(/assets/img/arrow.svg) center right no-repeat; background-size: 10spx; - width: 100%; + width: auto; -webkit-appearance: none; -moz-appearance: none; text-indent: 1px; text-overflow: ''; font-size: 14px; - + padding-left: 0px; + color: #1B3E6F; + padding-right: 20px; + } + .single-line select:focus{ + box-shadow: 0 0 0 0; } .single-line select option:first-child{ color: #C3CDDB; } - .single-line input::placeholder{ + .single-line-model input::placeholder{ font-size: 14px; color: #C3CDDB; } + .single-line-model.error{ + color:#FF6469; + } + .single-line-model.error input{ + color:#FF6469; + border-bottom: 1px solid #FF6469 !important; + } .single-line .custom-key{ background: none; border: 0px; @@ -1558,6 +1683,51 @@ padding-left: 20px !important; padding:70px 100px 70px 70px; position: relative; } +.single-custom-key{ + width: 100%; +} +.single-line-custom-key{ + width: 45%; + display: inline-block; +} +.single-line-custom-key-delete{ + width: 10%; + display: inline-block; + border-bottom: 1px solid #efefef; + padding: 12px; +} +.single-line-custom-key label{ + width: 150px; + margin-bottom: 0px; + border-bottom: 1px solid #efefef; + padding: 15px 25px; +} +.single-line-custom-key input{ + + border-bottom: 1px solid #efefef !important; + padding: 15px 25px; +} +.single-line-custom-key input::placeholder{ + font-size: 14px; + color: #C3CDDB; + } + .single-line-custom-key .label-input{ + width: calc(100% - 150px); + } + .single-line-custom-key .label-name span{ + color: #C3CDDB !important; + margin-right: 20px; + } +.custom-key-delete{ + background: transparent; + color: #FF6469; + outline: 0px; + border: 0px; +} +.custom-key-delete:focus{ + outline: 0px; + border: 0px; +} hr { margin-top: 0rem !important; margin-bottom: 0rem !important; @@ -1592,12 +1762,18 @@ hr { font-size: 17px; display: inline-block; } +.action-button.delete{ + color: #BABBC3; +} +.action-button.delete i{ + color: #BABBC3; +} +.action-button.delete:hover{ + color: #FF6469; +} .mode-icon{ font-size: 20px; } -.mode-icon.green{ - color: #5DBDBA; -} .action-button span{ width: 100%; display: inline-block; @@ -1673,11 +1849,14 @@ hr { .nav-tabs .nav-link{ position: relative; } +.nav-tabs .nav-link.tab-done{ + padding-left: 40px !important; +} .nav-tabs .nav-link.tab-done::after{ content: "\f058"; position: absolute; font-family: 'FontAwesome'; - left: 3px; + left: 17px; font-size: 16px; top: 11px; color: #66BB00; @@ -1769,7 +1948,7 @@ hr { border: 0px !important; } .card-header{ - padding: 10px 25px !important; + padding: 0px 25px !important; background: #F4F9FE !important; border-radius: 0px !important; border-bottom: 1px solid #ECEDF2 !important; @@ -1783,6 +1962,7 @@ hr { width: 100%; text-align: left; padding-left: 0px !important; + font-size:14px; } .accordion .card{ margin-bottom: 0px !important; @@ -1852,6 +2032,219 @@ hr { position: absolute; top: 13px; } +.ace-tomorrow-night-bright .ace_print-margin{ + background: #eee !important; +} +.ace_editor{ + line-height: 25px; + border: 1px solid #ECEDF2; + background-color: #fff; + color: #1B3E6F; +} +.ace-tomorrow-night-bright .ace_gutter{ + background: #1B3E6F !important; + border-right: 0px !important; + color: #fff !important; +} +.ace-tomorrow-night-bright .ace_gutter-active-line { + background-color: #265699; +} +.ace-tomorrow-night-bright .ace_cursor{ + color: #265699; +} +.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line { + background: #eee; +} +.breadcrumb-header{ + padding: 0px; + margin: 0px; +} +.breadcrumb-header li{ + list-style: none; + display: inline-block; + font-size: 12px; +} +.breadcrumb-header li::after{ + content: "/"; + padding: 0px 10px; + font-size: 16px; + color: #C3CDDB; +} +.breadcrumb-header li:last-child::after{ + display: none; +} + +.breadcrumb-header li:last-child{ +background: #F4F9FE; +border-radius: 50px; +color: #C3CDDB; +padding: 4px 10px; +} +.breadcrumb-header li:first-child{ + font-size: 16px; + font-weight: bold; + padding: 0px; + color: #1B3E6F; + border-radius: 0px; + background: transparent; + padding: 4px 0px 3px; +} +.create-template-import{ + width: 100%; + margin: 30px 0px 10px ; +} + +.create-template-import a:hover{ + text-decoration: none; +} +.mapping-source-load { + color: #1B3E6F; + font-size: 10px; + font-weight: bold; + display: inline-table; + margin-top: 20px; + margin-bottom: 10px; + margin:15px 30px 10px; +} +.mapping-source-load:hover{ + text-decoration: none; +} +.mapping-source-load i { + color: #1B3E6F; + font-size: 36px; + padding: 10px; + background: #F4F9FE; + border-radius: 100px; + width: 70px; + height: 70px; + display: inline-block; + line-height: 52px; + margin-bottom: 20px; +} +.source-load-note{ + color:#C3CDDB ; + font-size: 8px; +} +.template-mapping-list{ + background: #F4F9FE; + border: 1px solid #E9F3FF; + padding: 5px 10px; + box-shadow: 0 2px 6px 0 rgba(47, 83, 151, 0.1); + width: 100%; + display: inline-block; + margin-bottom: 20px; + color: #1B3E6F; +} +.template-mapping-list:hover, .template-mapping-list.active { + background: #1B3E6F; + text-decoration: none; + color: #fff; +} +.template-mapping-list span{ + background: #fff; + color: #2A81ED; + font-size: 8px; + float: right; + border-radius: 50px; + padding: 3px 10px; + margin-top: 1px; + margin-left: 5px; + +} +.max-height-list{ + max-height: 232px; + padding-bottom: 5px !important; + overflow: auto; +} +.create-template-mapping-button{ +background: #C3CDDB; +border-radius: 50px; +font-size: 12px; +padding: 10px 20px; +margin-bottom: 20px; + display: inline-block; + cursor: pointer; +} +.create-template-mapping-button i{ +margin-right: 5px; + } +.view-package-container{ + padding: 20px; +} +.package-type-icon{ + color: #fff; + background: #1B3E6F; + width: 40px; + height: 40px; + border-radius: 40px; + display: inline-block; + text-align: center; + line-height: 38px; + font-size: 20px; + margin-right: 20px; +} +.package-name-container{ + width: calc(100% - 60px); + display: inline-block; +} +.package-name{ +font-size: 14px; +color: #1B3E6F; +font-weight: bold; +margin-top: 3px; +} +.package-name span{ + font-size: 10px; + color: #C3CDDB; +} +.package-name i{ + font-size: 12px; + color: #C3CDDB; + margin-left: 5px; +} +.package-name.deployed i{ + color: #66BB00; +} +.package-description{ + color: #D0D7E4; + font-size: 12px; + font-weight: normal; +} +.template-mapping-action{ + width: 100%; + text-align: center; + margin-bottom: 30px; +} +.template-mapping-action button{ + border-radius: 50px; +} +.template-mapping-action .btn-primary{ + background:#5DBDBA !important ; + border-color:#5DBDBA !important ; + color: #fff !important ; +} +.template-mapping-action .btn-outline-secondary{ + background:#fff !important ; + border-color:#ECEDF2 !important ; + color: #C3CDDB !important ; +} +.table-container{ + width: 100%; +} +/* + server-side-angular-way.component.css +*/ +.no-data-available { + text-align: center; +} + +/* + src/styles.css (i.e. your global style) +*/ +.dataTables_empty { + display: none; +} + /* Extra small devices (portrait phones, less than 576px) */ @media (max-width: 575.98px) { .page-title{ diff --git a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/BluePrintProcessorCluster.kt b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/BluePrintProcessorCluster.kt index 16cb5d6e2..f7296d421 100644 --- a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/BluePrintProcessorCluster.kt +++ b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/BluePrintProcessorCluster.kt @@ -88,6 +88,6 @@ open class BluePrintProcessorCluster(private val bluePrintClusterService: BluePr @PreDestroy fun shutDown() = runBlocking { - bluePrintClusterService.shutDown(Duration.ofSeconds(1)) + bluePrintClusterService.shutDown(Duration.ofMillis(1)) } } diff --git a/ms/blueprintsprocessor/application/src/main/resources/hazelcast/hazelcast.yaml b/ms/blueprintsprocessor/application/src/main/resources/hazelcast/hazelcast.yaml index bacbe2a45..5c74682e0 100644 --- a/ms/blueprintsprocessor/application/src/main/resources/hazelcast/hazelcast.yaml +++ b/ms/blueprintsprocessor/application/src/main/resources/hazelcast/hazelcast.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/api/DeviceInfo.kt b/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/api/DeviceInfo.kt index 2f10bb56b..4456cb0de 100644 --- a/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/api/DeviceInfo.kt +++ b/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/api/DeviceInfo.kt @@ -32,8 +32,8 @@ class DeviceInfo { var connectTimeout: Long = 30 @get:JsonIgnore var source: String? = null - @get:JsonIgnore - var replyTimeout: Int = 20 + @get:JsonProperty("reply-time-out") + var replyTimeout: Int = 30 @get:JsonIgnore var idleTimeout: Int = 99999 diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt index 51e93a3c1..7272a3d63 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt @@ -152,8 +152,7 @@ open class ResourceResolutionServiceImpl( // Resource Assignment Artifact Definition Name val artifactMapping = "$artifactPrefix-mapping" - val resolvedContent: String - log.info("Resolving resource for template artifact($artifactTemplate) with resource assignment artifact($artifactMapping)") + log.info("Resolving resource with resource assignment artifact($artifactMapping)") val resourceAssignmentContent = bluePrintRuntimeService.resolveNodeTemplateArtifact(nodeTemplateName, artifactMapping) @@ -189,14 +188,20 @@ open class ResourceResolutionServiceImpl( val resolvedParamJsonContent = ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList()) - resolvedContent = blueprintTemplateService.generateContent( - bluePrintRuntimeService, nodeTemplateName, - artifactTemplate, resolvedParamJsonContent, false, - mutableMapOf( - ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE to - properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE].asJsonPrimitive() + val artifactTemplateDefinition = bluePrintRuntimeService.bluePrintContext().checkNodeTemplateArtifact(nodeTemplateName, artifactTemplate) + + val resolvedContent = if (artifactTemplateDefinition != null) { + blueprintTemplateService.generateContent( + bluePrintRuntimeService, nodeTemplateName, + artifactTemplate, resolvedParamJsonContent, false, + mutableMapOf( + ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE to + properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE].asJsonPrimitive() + ) ) - ) + } else { + resolvedParamJsonContent + } if (isToStore(properties)) { templateResolutionDBService.write(properties, resolvedContent, bluePrintRuntimeService, artifactPrefix) @@ -211,8 +216,7 @@ open class ResourceResolutionServiceImpl( resourceDefinitions: MutableMap<String, ResourceDefinition>, resolveDefinition: String, sources: List<String> - ): - MutableMap<String, JsonNode> { + ): MutableMap<String, JsonNode> { // Populate Dummy Resource Assignments val resourceAssignments = createResourceAssignments(resourceDefinitions, resolveDefinition, sources) @@ -397,8 +401,10 @@ open class ResourceResolutionServiceImpl( if (resourceResolution.status == BluePrintConstants.STATUS_SUCCESS) { resourceAssignmentList.forEach { if (compareOne(resourceResolution, it)) { - log.info("Resource ({}) already resolved: value=({})", it.name, - if (hasLogProtect(it.property)) LOG_REDACTED else resourceResolution.value) + log.info( + "Resource ({}) already resolved: value=({})", it.name, + if (hasLogProtect(it.property)) LOG_REDACTED else resourceResolution.value + ) // Make sure to recreate value as per the defined type. val value = resourceResolution.value!!.asJsonType(it.property!!.type) diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt index 53698ca82..e43b45e7d 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt @@ -132,7 +132,7 @@ open class DatabaseResourceAssignmentProcessor( private fun populateNamedParameter(inputKeyMapping: Map<String, String>): Map<String, Any> { val namedParameters = HashMap<String, Any>() inputKeyMapping.forEach { - val expressionValue = raRuntimeService.getDictionaryStore(it.value).textValue() + val expressionValue = raRuntimeService.getResolutionStore(it.value).textValue() logger.trace("Reference dictionary key (${it.key}) resulted in value ($expressionValue)") namedParameters[it.key] = expressionValue } diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt index 264b45789..2f338a3a1 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt @@ -202,20 +202,20 @@ class ResourceResolutionServiceTest { "resource-assignment" ) - resourceResolutionService.resolveResources( - resourceAssignmentRuntimeService, - "resource-assignment", - artifactPrefix, - props + assertNotNull( + resourceResolutionService.resolveResources( + resourceAssignmentRuntimeService, + "resource-assignment", + artifactPrefix, + props + ), "Couldn't Resolve Resources for artifact $artifactPrefix" ) } } @Test fun testResolveResourcesWithResourceIdAndResourceType() { - props[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOLUTION_KEY] = "" - runBlocking { Assert.assertNotNull("failed to create ResourceResolutionService", resourceResolutionService) @@ -245,11 +245,13 @@ class ResourceResolutionServiceTest { "resource-assignment" ) - resourceResolutionService.resolveResources( - resourceAssignmentRuntimeService, - "resource-assignment", - artifactPrefix, - props + assertNotNull( + resourceResolutionService.resolveResources( + resourceAssignmentRuntimeService, + "resource-assignment", + artifactPrefix, + props + ), "Couldn't Resolve Resources for artifact $artifactPrefix" ) } } diff --git a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintContext.kt b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintContext.kt index a112b6e6c..7c0970202 100644 --- a/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintContext.kt +++ b/ms/blueprintsprocessor/modules/blueprints/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintContext.kt @@ -231,15 +231,17 @@ class BluePrintContext(val serviceTemplate: ServiceTemplate) { return nodeTemplateByName(nodeTemplateName).artifacts } - fun nodeTemplateArtifact(nodeTemplateName: String, artifactName: String): ArtifactDefinition { + fun checkNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): ArtifactDefinition? { return nodeTemplateArtifacts(nodeTemplateName)?.get(artifactName) + } + + fun nodeTemplateArtifact(nodeTemplateName: String, artifactName: String): ArtifactDefinition { + return checkNodeTemplateArtifact(nodeTemplateName, artifactName) ?: throw BluePrintException("could't get NodeTemplate($nodeTemplateName)'s ArtifactDefinition($artifactName)") } fun nodeTemplateArtifactForArtifactType(nodeTemplateName: String, artifactType: String): ArtifactDefinition { - return nodeTemplateArtifacts(nodeTemplateName)?.filter { it.value.type == artifactType }?.map { it.value }?.get( - 0 - ) + return nodeTemplateArtifacts(nodeTemplateName)?.filter { it.value.type == artifactType }?.map { it.value }?.get(0) ?: throw BluePrintException("could't get NodeTemplate($nodeTemplateName)'s Artifact Type($artifactType)") } diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterService.kt b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterService.kt index 83a04d653..09641458c 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterService.kt +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterService.kt @@ -27,6 +27,7 @@ import com.hazelcast.config.FileSystemYamlConfig import com.hazelcast.config.MemberAttributeConfig import com.hazelcast.core.Hazelcast import com.hazelcast.core.HazelcastInstance +import com.hazelcast.cp.CPSubsystemManagementService import com.hazelcast.cp.lock.FencedLock import com.hazelcast.scheduledexecutor.IScheduledExecutorService import kotlinx.coroutines.delay @@ -48,6 +49,7 @@ open class HazlecastClusterService : BluePrintClusterService { private val log = logger(HazlecastClusterService::class) lateinit var hazelcast: HazelcastInstance + lateinit var cpSubsystemManagementService: CPSubsystemManagementService var joinedClient = false var joinedLite = false @@ -57,7 +59,10 @@ open class HazlecastClusterService : BluePrintClusterService { when (configuration) { is Config -> { joinedLite = configuration.isLiteMember - Hazelcast.newHazelcastInstance(configuration) + val hazelcastInstance = Hazelcast.newHazelcastInstance(configuration) + /** Promote as CP Member */ + promoteAsCPMember(hazelcastInstance) + hazelcastInstance } is ClientConfig -> { joinedClient = true @@ -99,7 +104,10 @@ open class HazlecastClusterService : BluePrintClusterService { hazelcastServerConfiguration.properties = configuration.properties hazelcastServerConfiguration.memberAttributeConfig = memberAttributeConfig joinedLite = hazelcastServerConfiguration.isLiteMember - Hazelcast.newHazelcastInstance(hazelcastServerConfiguration) + val hazelcastInstance = Hazelcast.newHazelcastInstance(hazelcastServerConfiguration) + /** Promote as CP Member */ + promoteAsCPMember(hazelcastInstance) + hazelcastInstance } } else -> { @@ -169,11 +177,17 @@ open class HazlecastClusterService : BluePrintClusterService { override suspend fun shutDown(duration: Duration) { if (::hazelcast.isInitialized && clusterJoined()) { delay(duration.toMillis()) - hazelcast.lifecycleService.terminate() + HazlecastClusterUtils.terminate(hazelcast) } } /** Utils */ + suspend fun promoteAsCPMember(hazelcastInstance: HazelcastInstance) { + if (!joinedClient && !joinedLite) { + HazlecastClusterUtils.promoteAsCPMember(hazelcastInstance) + } + } + suspend fun myHazelcastApplicationMembers(): Map<String, Member> { check(::hazelcast.isInitialized) { "failed to start and join cluster" } check(!isClient()) { "not supported for cluster client members." } @@ -198,11 +212,11 @@ open class BlueprintsClusterMembershipListener(val hazlecastClusterService: Hazl private val log = logger(BlueprintsClusterMembershipListener::class) override fun memberRemoved(membershipEvent: MembershipEvent) { - log.info("${hazlecastClusterService.hazelcast.cluster.localMember} : Member Removed: $membershipEvent") + log.info("MembershipEvent: $membershipEvent") } override fun memberAdded(membershipEvent: MembershipEvent) { - log.info("${hazlecastClusterService.hazelcast.cluster.localMember} : Member Added : $membershipEvent") + log.info("MembershipEvent: $membershipEvent") } } diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterUtils.kt b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterUtils.kt new file mode 100644 index 000000000..70970f6da --- /dev/null +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/cluster/HazlecastClusterUtils.kt @@ -0,0 +1,117 @@ +/* + * Copyright © 2018-2019 AT&T Intellectual Property. + * + * Licensed 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. + */ + +package org.onap.ccsdk.cds.blueprintsprocessor.core.cluster + +import com.hazelcast.core.HazelcastInstance +import com.hazelcast.cp.CPGroup +import com.hazelcast.cp.CPMember +import com.hazelcast.cp.CPSubsystemManagementService +import com.hazelcast.instance.impl.HazelcastInstanceProxy +import org.onap.ccsdk.cds.controllerblueprints.core.logger +import java.util.UUID +import java.util.concurrent.TimeUnit + +object HazlecastClusterUtils { + + private val log = logger(HazlecastClusterUtils::class) + + /** Promote [hazelcastInstance] member to CP Member */ + fun promoteAsCPMember(hazelcastInstance: HazelcastInstance) { + when (hazelcastInstance) { + is HazelcastInstanceProxy -> { + val cpSubsystemManagementService = cpSubsystemManagementService(hazelcastInstance) + cpSubsystemManagementService.promoteToCPMember() + .toCompletableFuture().get() + log.info("Promoted as CP member(${hazelcastInstance.cluster.localMember})") + val clusterCPMembers = clusterCPMembers(hazelcastInstance) + log.info("CP Members(${clusterCPMembers.size}): $clusterCPMembers") + val cpGroupMembers = cpGroupMembers(hazelcastInstance) + log.info("CP Group Members(${cpGroupMembers.size}): $cpGroupMembers") + } + else -> log.debug("Client instance not eligible for CP Member promotion") + } + } + + /** Terminate [hazelcastInstance] member */ + fun terminate(hazelcastInstance: HazelcastInstance) { + log.info("Terminating Member : ${hazelcastInstance.cluster.localMember}") + hazelcastInstance.lifecycleService.terminate() + } + + /** Remove [hazelcastInstance] member from cluster CP Member List*/ + fun removeFromCPMember(hazelcastInstance: HazelcastInstance) { + // check CP Member, then remove */ + val localCPMemberUuid = localCPMemberUUID(hazelcastInstance) + localCPMemberUuid?.let { uuid -> + removeFromCPMember(hazelcastInstance, uuid) + } + } + + /** Remove [removeCPMemberUuid] member from cluster CP Member List, using [hazelcastInstance]*/ + fun removeFromCPMember(hazelcastInstance: HazelcastInstance, removeCPMemberUuid: UUID) { + val cpSubsystemManagementService = cpSubsystemManagementService(hazelcastInstance) + cpSubsystemManagementService.removeCPMember(removeCPMemberUuid) + .toCompletableFuture().get() + log.info("Removed CP member($removeCPMemberUuid)") + } + + /** Get [hazelcastInstance] CP Group members*/ + fun cpGroupMembers(hazelcastInstance: HazelcastInstance): List<CPMember> { + return cpGroup(hazelcastInstance).members().toList() + } + + /** Get [hazelcastInstance] CP Group[groupName] members*/ + fun cpGroup( + hazelcastInstance: HazelcastInstance, + groupName: String? = CPGroup.METADATA_CP_GROUP_NAME + ): CPGroup { + return cpSubsystemManagementService(hazelcastInstance).getCPGroup(groupName) + .toCompletableFuture().get() + } + + /** Get [hazelcastInstance] CP member UUIDs*/ + fun clusterCPMemberUUIDs(hazelcastInstance: HazelcastInstance): List<UUID> { + return clusterCPMembers(hazelcastInstance).map { it.uuid } + } + + /** Get [hazelcastInstance] CP members*/ + fun clusterCPMembers(hazelcastInstance: HazelcastInstance): List<CPMember> { + return cpSubsystemManagementService(hazelcastInstance).cpMembers.toCompletableFuture().get().toList() + } + + /** Get CPSubsystemManagementService for [hazelcastInstance] */ + fun cpSubsystemManagementService(hazelcastInstance: HazelcastInstance): CPSubsystemManagementService { + val cpSubsystemManagementService = hazelcastInstance.cpSubsystem.cpSubsystemManagementService + cpSubsystemManagementService.awaitUntilDiscoveryCompleted(3, TimeUnit.MINUTES) + return cpSubsystemManagementService + } + + /** Get local CPMemberUUID for [hazelcastInstance] */ + fun localCPMemberUUID(hazelcastInstance: HazelcastInstance) = localCPMember(hazelcastInstance)?.uuid + + /** Check local member is CP member for [hazelcastInstance] */ + fun checkLocalMemberIsCPMember(hazelcastInstance: HazelcastInstance): Boolean { + return localCPMember(hazelcastInstance) != null + } + + /** Get local CP member for [hazelcastInstance] */ + fun localCPMember(hazelcastInstance: HazelcastInstance) = + cpSubsystemManagementService(hazelcastInstance).localCPMember + + /** Get local CP member UUID for [hazelcastInstance] */ + fun localMemberUUID(hazelcastInstance: HazelcastInstance) = hazelcastInstance.cluster.localMember.uuid +} diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5679.yaml b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5679.yaml index cbf488c95..e7ac273ed 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5679.yaml +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5679.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5680.yaml b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5680.yaml index 356be1d05..cb493d169 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5680.yaml +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5680.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5681.yaml b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5681.yaml index d256f49e3..e60b0c506 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5681.yaml +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5681.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5682.yaml b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5682.yaml index 9c7d566db..3cb10a08b 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5682.yaml +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast-5682.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast.yaml b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast.yaml index dcecf454f..ab5d44804 100644 --- a/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast.yaml +++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/test/resources/hazelcast/hazelcast.yaml @@ -6,6 +6,9 @@ hazelcast: cp-subsystem: cp-member-count: 3 group-size: 3 + session-time-to-live-seconds: 60 + session-heartbeat-interval-seconds: 5 + missing-cp-member-auto-removal-seconds: 120 # network: # join: # multicast: diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt index ebd9d553d..06100f1fc 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/ImperativeWorkflowExecutionService.kt @@ -144,7 +144,7 @@ open class ImperativeBluePrintWorkflowService(private val nodeTemplateExecutionS nodeInput: ExecutionServiceInput, nodeOutput: ExecutionServiceOutput ): EdgeLabel { - log.info("Executing workflow($workflowName[${this.workflowId}])'s step($${node.id})") + log.info("Executing workflow($workflowName[${this.workflowId}])'s step(${node.id})") val step = bluePrintRuntimeService.bluePrintContext().workflowStepByName(this.workflowName, node.id) checkNotEmpty(step.target) { "couldn't get step target for workflow(${this.workflowName})'s step(${node.id})" } val nodeTemplateName = step.target!! @@ -40,7 +40,7 @@ limitations under the License. <modules> <module>ms</module> - <!-- <module>cds-ui</module>--> + <module>cds-ui</module> <module>components</module> </modules> |