diff --git a/src/app/app.component.html b/src/app/app.component.html index c96ed95..35fc20f 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,18 +1,7 @@
-
- -
-
-
- -
-
-
+ + +
diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 9a81a0c..63be152 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -2,106 +2,3 @@ font-family: "ABeeZee", sans-serif; margin: 0 1em 1em 1em; } - -.textwrapper { - margin: 0 0 1em 0; - padding: 0 1em 0 0; -} - -.arrow_box { - position: relative; - background: #fff; - border: 1px solid #aaa; - &:focus { - border-color: #888; - } - &:hover { - border-color: #333; - } - &:after, &:before { - top: 100%; - left: 50%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - } - &:after { - border-color: rgba(255, 255, 255, 0); - border-top-color: #fff; - border-width: 1em; - margin-left: -1em; - } - &:before { - border-color: rgba(170, 170, 170, 0); - border-top-color: #aaa; - border-width: calc(1em + 1px); - margin-left: calc(-1em - 1px); - } - &:focus:before { - border-color: rgba(136, 136, 136, 0); - border-top-color: #888; - } - &:hover:before { - border-color: rgba(51, 51, 51, 0); - border-top-color: #333; - } - .selectwrapper > & { - display: inline-block; - } -} - -.textinput { - background-color: #fff; - border: none; - color: #000; - font-family: "Free Monospaced", monospace; - height: 10em; - margin: 0; - padding: 0.5em; - resize: vertical; - width: 100%; - &:focus { - border-color: #888; - } - &:hover { - border-color: #333; - } -} - -.selectwrapper { - margin: 0 0 1em 0; - padding: 0; - text-align: center; - &.error { - > .arrow_box { - border-color: red; - &:before { - border-top-color: red; - } - } - select { - color: red; - } - } -} - -.select { - background-color: #fff; - border: none; - color: #000; - font-family: "ABeeZee", sans-serif; - margin: 0; - padding: 0.5em; -} - -.option { - /* font-family: "ABeeZee", sans-serif;*/ -} - -.errormessage { - color: red; - text-align: center; -} diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 820811b..051970e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,8 +1,6 @@ import {Component, OnInit} from '@angular/core'; -import {ConverterRegistryService} from './converter-registry.service'; import {InputComponentManagerService} from './input-component-manager.service'; import {Step} from './step'; -import {Converter} from './converter/converter'; @Component({ selector: 'app-root', @@ -11,47 +9,11 @@ import {Converter} from './converter/converter'; }) export class AppComponent implements OnInit { public steps: Step[] = []; - public converters: Converter[] = []; - constructor(private converterRegistryService: ConverterRegistryService, - private inputComponentManagerService: InputComponentManagerService) { - } - - convert(step: Step, $event: any): void { - step.selectedConverter = this.converterRegistryService.getConverter($event.target.selectedOptions[0].id); - this.update(step); - } - - update(step: Step): void { - const converter: Converter = step.selectedConverter; - - if (converter !== undefined) { - const content: string = step.content; - let result: string; - try { - result = converter.convert(content); - } catch (error) { - if (typeof console === 'object' && typeof console.log === 'function') { - console.log(error); - } - step.message = error.message; - step.error = true; - result = null; - } - if (result !== null) { - step.message = ''; - step.error = false; - if (result !== '') { - const nextComponent: Step = this.inputComponentManagerService.getNext(step); - nextComponent.content = result; - this.update(nextComponent); - } - } - } + constructor(private inputComponentManagerService: InputComponentManagerService) { } ngOnInit(): void { - this.converters = this.converterRegistryService.getAllConverters(); this.steps = this.inputComponentManagerService.getAllComponents(); this.inputComponentManagerService.getFirst(); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5e40ab8..875f69f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -6,11 +6,17 @@ import {InputComponentManagerService} from './input-component-manager.service'; import {NativeLibraryWrapperService} from './native-library-wrapper.service'; import {FormsModule} from '@angular/forms'; import {VersionComponent} from './version/version.component'; +import { TextInputFieldComponent } from './text-input-field/text-input-field.component'; +import { ConverterSelectorComponent } from './converter-selector/converter-selector.component'; +import { ErrorMessageComponent } from './error-message/error-message.component'; @NgModule({ declarations: [ AppComponent, - VersionComponent + VersionComponent, + TextInputFieldComponent, + ConverterSelectorComponent, + ErrorMessageComponent ], imports: [ BrowserModule, diff --git a/src/app/converter-selector/converter-selector.component.html b/src/app/converter-selector/converter-selector.component.html new file mode 100644 index 0000000..b15dd1b --- /dev/null +++ b/src/app/converter-selector/converter-selector.component.html @@ -0,0 +1,9 @@ +
+
+ +
+
diff --git a/src/app/converter-selector/converter-selector.component.scss b/src/app/converter-selector/converter-selector.component.scss new file mode 100644 index 0000000..b31f217 --- /dev/null +++ b/src/app/converter-selector/converter-selector.component.scss @@ -0,0 +1,74 @@ +.selectwrapper { + margin: 0 0 1em 0; + padding: 0; + text-align: center; + &.error { + > .arrow_box { + border-color: red; + &:before { + border-top-color: red; + } + } + select { + color: red; + } + } +} + +.select { + background-color: #fff; + border: none; + color: #000; + font-family: "ABeeZee", sans-serif; + margin: 0; + padding: 0.5em; +} + +.arrow_box { + position: relative; + background: #fff; + border: 1px solid #aaa; + &:focus { + border-color: #888; + } + &:hover { + border-color: #333; + } + &:after, &:before { + top: 100%; + left: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + } + &:after { + border-color: rgba(255, 255, 255, 0); + border-top-color: #fff; + border-width: 1em; + margin-left: -1em; + } + &:before { + border-color: rgba(170, 170, 170, 0); + border-top-color: #aaa; + border-width: calc(1em + 1px); + margin-left: calc(-1em - 1px); + } + &:focus:before { + border-color: rgba(136, 136, 136, 0); + border-top-color: #888; + } + &:hover:before { + border-color: rgba(51, 51, 51, 0); + border-top-color: #333; + } + .selectwrapper > & { + display: inline-block; + } +} + +.option { + /* font-family: "ABeeZee", sans-serif;*/ +} diff --git a/src/app/converter-selector/converter-selector.component.spec.ts b/src/app/converter-selector/converter-selector.component.spec.ts new file mode 100644 index 0000000..410aaa7 --- /dev/null +++ b/src/app/converter-selector/converter-selector.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConverterSelectorComponent } from './converter-selector.component'; + +describe('ConverterSelectorComponent', () => { + let component: ConverterSelectorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConverterSelectorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConverterSelectorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/converter-selector/converter-selector.component.ts b/src/app/converter-selector/converter-selector.component.ts new file mode 100644 index 0000000..c3b6230 --- /dev/null +++ b/src/app/converter-selector/converter-selector.component.ts @@ -0,0 +1,30 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {Step} from '../step'; +import {Converter} from '../converter/converter'; +import {ConverterRegistryService} from '../converter-registry.service'; +import {TextInputFieldComponent} from '../text-input-field/text-input-field.component'; + +@Component({ + selector: 'app-converter-selector', + templateUrl: './converter-selector.component.html', + styleUrls: ['./converter-selector.component.scss'] +}) +export class ConverterSelectorComponent implements OnInit { + @Input() + public step: Step; + @Input() + private textInput: TextInputFieldComponent; + public converters: Converter[] = []; + + constructor(private converterRegistryService: ConverterRegistryService) { + } + + convert(step: Step, $event: any): void { + step.selectedConverter = this.converterRegistryService.getConverter($event.target.selectedOptions[0].id); + this.textInput.update(step); + } + + ngOnInit() { + this.converters = this.converterRegistryService.getAllConverters(); + } +} diff --git a/src/app/error-message/error-message.component.html b/src/app/error-message/error-message.component.html new file mode 100644 index 0000000..6c306bd --- /dev/null +++ b/src/app/error-message/error-message.component.html @@ -0,0 +1 @@ +
diff --git a/src/app/error-message/error-message.component.scss b/src/app/error-message/error-message.component.scss new file mode 100644 index 0000000..ef9b713 --- /dev/null +++ b/src/app/error-message/error-message.component.scss @@ -0,0 +1,4 @@ +.errormessage { + color: red; + text-align: center; +} diff --git a/src/app/error-message/error-message.component.spec.ts b/src/app/error-message/error-message.component.spec.ts new file mode 100644 index 0000000..d90c1d5 --- /dev/null +++ b/src/app/error-message/error-message.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorMessageComponent } from './error-message.component'; + +describe('ErrorMessageComponent', () => { + let component: ErrorMessageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorMessageComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorMessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/error-message/error-message.component.ts b/src/app/error-message/error-message.component.ts new file mode 100644 index 0000000..8db15df --- /dev/null +++ b/src/app/error-message/error-message.component.ts @@ -0,0 +1,15 @@ +import {Component, Input} from '@angular/core'; +import {Step} from '../step'; + +@Component({ + selector: 'app-error-message', + templateUrl: './error-message.component.html', + styleUrls: ['./error-message.component.scss'] +}) +export class ErrorMessageComponent { + @Input() + public step: Step; + + constructor() { + } +} diff --git a/src/app/text-input-field/text-input-field.component.html b/src/app/text-input-field/text-input-field.component.html new file mode 100644 index 0000000..7000fb7 --- /dev/null +++ b/src/app/text-input-field/text-input-field.component.html @@ -0,0 +1,4 @@ +
+ +
diff --git a/src/app/text-input-field/text-input-field.component.scss b/src/app/text-input-field/text-input-field.component.scss new file mode 100644 index 0000000..89dc5f9 --- /dev/null +++ b/src/app/text-input-field/text-input-field.component.scss @@ -0,0 +1,69 @@ +.textwrapper { + margin: 0 0 1em 0; + padding: 0 1em 0 0; +} + +.arrow_box { + position: relative; + background: #fff; + border: 1px solid #aaa; + &:focus { + border-color: #888; + } + &:hover { + border-color: #333; + } + &:after, &:before { + top: 100%; + left: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + } + &:after { + border-color: rgba(255, 255, 255, 0); + border-top-color: #fff; + border-width: 1em; + margin-left: -1em; + } + &:before { + border-color: rgba(170, 170, 170, 0); + border-top-color: #aaa; + border-width: calc(1em + 1px); + margin-left: calc(-1em - 1px); + } + &:focus:before { + border-color: rgba(136, 136, 136, 0); + border-top-color: #888; + } + &:hover:before { + border-color: rgba(51, 51, 51, 0); + border-top-color: #333; + } +} + +.textinput { + background-color: #fff; + border: none; + color: #000; + font-family: "Free Monospaced", monospace; + height: 10em; + margin: 0; + padding: 0.5em; + resize: vertical; + width: 100%; + &:focus { + border-color: #888; + } + &:hover { + border-color: #333; + } +} + +.errormessage { + color: red; + text-align: center; +} diff --git a/src/app/text-input-field/text-input-field.component.spec.ts b/src/app/text-input-field/text-input-field.component.spec.ts new file mode 100644 index 0000000..144588c --- /dev/null +++ b/src/app/text-input-field/text-input-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TextInputFieldComponent } from './text-input-field.component'; + +describe('TextInputFieldComponent', () => { + let component: TextInputFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TextInputFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TextInputFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/text-input-field/text-input-field.component.ts b/src/app/text-input-field/text-input-field.component.ts new file mode 100644 index 0000000..932db29 --- /dev/null +++ b/src/app/text-input-field/text-input-field.component.ts @@ -0,0 +1,45 @@ +import {Component, Input} from '@angular/core'; +import {Step} from '../step'; +import {Converter} from '../converter/converter'; +import {InputComponentManagerService} from '../input-component-manager.service'; + +@Component({ + selector: 'app-text-input-field', + templateUrl: './text-input-field.component.html', + styleUrls: ['./text-input-field.component.scss'] +}) +export class TextInputFieldComponent { + @Input() + public step: Step; + + constructor(private inputComponentManagerService: InputComponentManagerService) { + } + + update(step: Step): void { + const converter: Converter = step.selectedConverter; + + if (converter !== undefined) { + const content: string = step.content; + let result: string; + try { + result = converter.convert(content); + } catch (error) { + if (typeof console === 'object' && typeof console.log === 'function') { + console.log(error); + } + step.message = error.message; + step.error = true; + result = null; + } + if (result !== null) { + step.message = ''; + step.error = false; + if (result !== '') { + const nextComponent: Step = this.inputComponentManagerService.getNext(step); + nextComponent.content = result; + this.update(nextComponent); + } + } + } + } +}