();
+
+ get fileFormats(): string[] {
+ return this._fileFormats;
+ }
+
+ ngOnInit(): void {
+ this.requestHeaders = this.headers;
+ }
+
+ choose(_: any, callback: () => void) {
+ callback();
+ }
+
+ onFileSelect(event: FileSelectEvent): void {
+ this.selectedFile = event.currentFiles;
+ this.fileSelected.emit(this.selectedFile!);
+ }
+
+ onAutoComplete(event: AutoCompleteCompleteEvent): void {
+ this.autoComplete.emit(event);
+ }
+
+ onAutoCompleteDropdownClick(event: AutoCompleteSelectEvent): void {
+ this.selectedFormat.emit(event.value.name);
+ this.selected = event.value.name;
+ }
+
+ onUploadEvent() {
+ this.upload.emit();
+ }
+}
\ No newline at end of file
diff --git a/src/tools/base64-converter/base64-converter.component.scss b/tools/src/assets/.gitkeep
similarity index 100%
rename from src/tools/base64-converter/base64-converter.component.scss
rename to tools/src/assets/.gitkeep
diff --git a/tools/src/environments/environment.ts b/tools/src/environments/environment.ts
new file mode 100644
index 0000000..8fe1c72
--- /dev/null
+++ b/tools/src/environments/environment.ts
@@ -0,0 +1,4 @@
+export const environment = {
+ production: false,
+ uploadServiceBaseUrl: 'http://localhost:1337'
+};
\ No newline at end of file
diff --git a/src/favicon.ico b/tools/src/favicon.ico
similarity index 100%
rename from src/favicon.ico
rename to tools/src/favicon.ico
diff --git a/src/index.html b/tools/src/index.html
similarity index 54%
rename from src/index.html
rename to tools/src/index.html
index df563fe..6f835ab 100644
--- a/src/index.html
+++ b/tools/src/index.html
@@ -6,6 +6,9 @@
+
+
+
diff --git a/src/main.ts b/tools/src/main.ts
similarity index 100%
rename from src/main.ts
rename to tools/src/main.ts
diff --git a/tools/src/styles.scss b/tools/src/styles.scss
new file mode 100644
index 0000000..ed70c4e
--- /dev/null
+++ b/tools/src/styles.scss
@@ -0,0 +1,11 @@
+/* You can add global styles to this file, and also import other style files */
+@import "primeicons/primeicons.css";
+body,
+body .p-component
+{
+
+ font-family: "Roboto Mono", monospace;
+ font-optical-sizing: auto;
+ font-weight: 304;
+ font-style: normal;
+}
\ No newline at end of file
diff --git a/src/tools/ascii-to-text/ascii-to-text.component.html b/tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.html
similarity index 100%
rename from src/tools/ascii-to-text/ascii-to-text.component.html
rename to tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.html
diff --git a/src/tools/ascii-to-text/ascii-to-text.component.scss b/tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.scss
similarity index 100%
rename from src/tools/ascii-to-text/ascii-to-text.component.scss
rename to tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.scss
diff --git a/src/tools/ascii-to-text/ascii-to-text.component.ts b/tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.ts
similarity index 90%
rename from src/tools/ascii-to-text/ascii-to-text.component.ts
rename to tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.ts
index 1a2d847..5c031bf 100644
--- a/src/tools/ascii-to-text/ascii-to-text.component.ts
+++ b/tools/src/tools/client-side/ascii-to-text/ascii-to-text.component.ts
@@ -1,5 +1,5 @@
import { Component } from '@angular/core';
-import { DualTextareaComponent } from '../../app/shared/dual-textarea/dual-textarea.component';
+import { DualTextareaComponent } from '../../../app/shared/dual-textarea/dual-textarea.component';
@Component({
selector: 'app-ascii-to-text',
diff --git a/src/tools/base64-converter/base64-converter.component.html b/tools/src/tools/client-side/base64-converter/base64-converter.component.html
similarity index 100%
rename from src/tools/base64-converter/base64-converter.component.html
rename to tools/src/tools/client-side/base64-converter/base64-converter.component.html
diff --git a/src/tools/dds-to-png/dds-to-png.component.scss b/tools/src/tools/client-side/base64-converter/base64-converter.component.scss
similarity index 100%
rename from src/tools/dds-to-png/dds-to-png.component.scss
rename to tools/src/tools/client-side/base64-converter/base64-converter.component.scss
diff --git a/src/tools/base64-converter/base64-converter.component.spec.ts b/tools/src/tools/client-side/base64-converter/base64-converter.component.spec.ts
similarity index 100%
rename from src/tools/base64-converter/base64-converter.component.spec.ts
rename to tools/src/tools/client-side/base64-converter/base64-converter.component.spec.ts
diff --git a/src/tools/base64-converter/base64-converter.component.ts b/tools/src/tools/client-side/base64-converter/base64-converter.component.ts
similarity index 85%
rename from src/tools/base64-converter/base64-converter.component.ts
rename to tools/src/tools/client-side/base64-converter/base64-converter.component.ts
index 2897182..bd46710 100644
--- a/src/tools/base64-converter/base64-converter.component.ts
+++ b/tools/src/tools/client-side/base64-converter/base64-converter.component.ts
@@ -1,5 +1,5 @@
import { Component } from '@angular/core';
-import { DualTextareaComponent } from '../../app/shared/dual-textarea/dual-textarea.component';
+import { DualTextareaComponent } from '../../../app/shared/dual-textarea/dual-textarea.component';
@Component({
selector: 'app-base64-converter',
diff --git a/src/tools/dds-to-png/dds-to-png.component.html b/tools/src/tools/client-side/dds-to-png/dds-to-png.component.html
similarity index 100%
rename from src/tools/dds-to-png/dds-to-png.component.html
rename to tools/src/tools/client-side/dds-to-png/dds-to-png.component.html
diff --git a/src/tools/jwt-to-json/jwt-to-json.component.scss b/tools/src/tools/client-side/dds-to-png/dds-to-png.component.scss
similarity index 100%
rename from src/tools/jwt-to-json/jwt-to-json.component.scss
rename to tools/src/tools/client-side/dds-to-png/dds-to-png.component.scss
diff --git a/src/tools/dds-to-png/dds-to-png.component.spec.ts b/tools/src/tools/client-side/dds-to-png/dds-to-png.component.spec.ts
similarity index 100%
rename from src/tools/dds-to-png/dds-to-png.component.spec.ts
rename to tools/src/tools/client-side/dds-to-png/dds-to-png.component.spec.ts
diff --git a/src/tools/dds-to-png/dds-to-png.component.ts b/tools/src/tools/client-side/dds-to-png/dds-to-png.component.ts
similarity index 88%
rename from src/tools/dds-to-png/dds-to-png.component.ts
rename to tools/src/tools/client-side/dds-to-png/dds-to-png.component.ts
index a7b196e..6343508 100644
--- a/src/tools/dds-to-png/dds-to-png.component.ts
+++ b/tools/src/tools/client-side/dds-to-png/dds-to-png.component.ts
@@ -1,12 +1,7 @@
import { Component, OnInit } from '@angular/core';
-import { FileConverterComponent } from '../../app/shared/upload/file-converter.component';
+import { FileConverterComponent } from '../../../app/shared/upload/file-converter.component';
import { DdsToPngService } from './dds-to-png.service';
-
-interface ProcessedFile {
- name: string;
- link: string;
- format: string;
-}
+import { ProcessedFile } from '../../../app/models/conversion.model';
@Component({
selector: 'app-dds-to-png',
diff --git a/src/tools/dds-to-png/dds-to-png.service.ts b/tools/src/tools/client-side/dds-to-png/dds-to-png.service.ts
similarity index 99%
rename from src/tools/dds-to-png/dds-to-png.service.ts
rename to tools/src/tools/client-side/dds-to-png/dds-to-png.service.ts
index 19caa1b..e170f4a 100644
--- a/src/tools/dds-to-png/dds-to-png.service.ts
+++ b/tools/src/tools/client-side/dds-to-png/dds-to-png.service.ts
@@ -4,8 +4,6 @@ import { Injectable } from '@angular/core';
providedIn: 'root'
})
export class DdsToPngService {
- constructor() {}
-
parseHeaders(arrayBuffer: ArrayBuffer) {
const header = new DataView(arrayBuffer, 0, 128);
const height = header.getUint32(12, true);
diff --git a/src/tools/guid/guid.component.html b/tools/src/tools/client-side/guid/guid.component.html
similarity index 100%
rename from src/tools/guid/guid.component.html
rename to tools/src/tools/client-side/guid/guid.component.html
diff --git a/src/tools/guid/guid.component.scss b/tools/src/tools/client-side/guid/guid.component.scss
similarity index 100%
rename from src/tools/guid/guid.component.scss
rename to tools/src/tools/client-side/guid/guid.component.scss
diff --git a/src/tools/guid/guid.component.ts b/tools/src/tools/client-side/guid/guid.component.ts
similarity index 100%
rename from src/tools/guid/guid.component.ts
rename to tools/src/tools/client-side/guid/guid.component.ts
diff --git a/src/tools/jwt-to-json/jwt-to-json.component.html b/tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.html
similarity index 100%
rename from src/tools/jwt-to-json/jwt-to-json.component.html
rename to tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.html
diff --git a/src/tools/text-to-cron/text-to-cron.component.scss b/tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.scss
similarity index 100%
rename from src/tools/text-to-cron/text-to-cron.component.scss
rename to tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.scss
diff --git a/src/tools/jwt-to-json/jwt-to-json.component.spec.ts b/tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.spec.ts
similarity index 100%
rename from src/tools/jwt-to-json/jwt-to-json.component.spec.ts
rename to tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.spec.ts
diff --git a/src/tools/jwt-to-json/jwt-to-json.component.ts b/tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.ts
similarity index 91%
rename from src/tools/jwt-to-json/jwt-to-json.component.ts
rename to tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.ts
index 79a2f41..9a9f7b5 100644
--- a/src/tools/jwt-to-json/jwt-to-json.component.ts
+++ b/tools/src/tools/client-side/jwt-to-json/jwt-to-json.component.ts
@@ -1,5 +1,5 @@
import { Component } from '@angular/core';
-import { DualTextareaComponent } from '../../app/shared/dual-textarea/dual-textarea.component';
+import { DualTextareaComponent } from '../../../app/shared/dual-textarea/dual-textarea.component';
@Component({
selector: 'app-jwt-to-json',
diff --git a/src/tools/text-to-cron/text-to-cron.component.html b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.html
similarity index 76%
rename from src/tools/text-to-cron/text-to-cron.component.html
rename to tools/src/tools/client-side/text-to-cron/text-to-cron.component.html
index 1c8aae6..b176d10 100644
--- a/src/tools/text-to-cron/text-to-cron.component.html
+++ b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.html
@@ -4,7 +4,6 @@
bottomPlaceholder="*/5 * * * *"
[bottomDisabled]="true"
[bottomValue]="cronExpression"
+ [isBeta]="true"
(topChange)="getCronExpression($event)">
-
-
-Still in beta, don't rely on this tool!
\ No newline at end of file
+
\ No newline at end of file
diff --git a/tools/src/tools/client-side/text-to-cron/text-to-cron.component.scss b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/tools/text-to-cron/text-to-cron.component.spec.ts b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.spec.ts
similarity index 100%
rename from src/tools/text-to-cron/text-to-cron.component.spec.ts
rename to tools/src/tools/client-side/text-to-cron/text-to-cron.component.spec.ts
diff --git a/src/tools/text-to-cron/text-to-cron.component.ts b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.ts
similarity index 94%
rename from src/tools/text-to-cron/text-to-cron.component.ts
rename to tools/src/tools/client-side/text-to-cron/text-to-cron.component.ts
index 8b839d7..dae0292 100644
--- a/src/tools/text-to-cron/text-to-cron.component.ts
+++ b/tools/src/tools/client-side/text-to-cron/text-to-cron.component.ts
@@ -1,5 +1,5 @@
import { Component } from '@angular/core';
-import { DualTextareaComponent } from '../../app/shared/dual-textarea/dual-textarea.component';
+import { DualTextareaComponent } from '../../../app/shared/dual-textarea/dual-textarea.component';
@Component({
selector: 'app-text-to-cron',
@@ -9,7 +9,6 @@ import { DualTextareaComponent } from '../../app/shared/dual-textarea/dual-texta
imports: [DualTextareaComponent]
})
export class TextToCronComponent {
-
cronExpression: string = '';
getCronExpression(description: string): string {
diff --git a/tools/src/tools/server-side/image-converter/image-converter.component.html b/tools/src/tools/server-side/image-converter/image-converter.component.html
new file mode 100644
index 0000000..e13b4ee
--- /dev/null
+++ b/tools/src/tools/server-side/image-converter/image-converter.component.html
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/tools/src/tools/server-side/image-converter/image-converter.component.scss b/tools/src/tools/server-side/image-converter/image-converter.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/tools/src/tools/server-side/image-converter/image-converter.component.spec.ts b/tools/src/tools/server-side/image-converter/image-converter.component.spec.ts
new file mode 100644
index 0000000..61afcea
--- /dev/null
+++ b/tools/src/tools/server-side/image-converter/image-converter.component.spec.ts
@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { ImageConverterComponent } from './image-converter.component';
+
+describe('ImageConverterComponent', () => {
+ let component: ImageConverterComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ImageConverterComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ImageConverterComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/tools/src/tools/server-side/image-converter/image-converter.component.ts b/tools/src/tools/server-side/image-converter/image-converter.component.ts
new file mode 100644
index 0000000..18d682e
--- /dev/null
+++ b/tools/src/tools/server-side/image-converter/image-converter.component.ts
@@ -0,0 +1,101 @@
+import { Component, OnDestroy, OnInit } from '@angular/core';
+import { map, Subscription } from 'rxjs';
+import { DropdownModule } from 'primeng/dropdown';
+import { AutoCompleteCompleteEvent, AutoCompleteModule } from 'primeng/autocomplete';
+import { FormsModule } from '@angular/forms';
+import { ImageService } from './image-converter.service';
+import { CommonModule } from '@angular/common';
+import { FileConverterComponent } from "../../../app/shared/upload/file-converter.component";
+import { Format, ProcessedFile } from '../../../app/models/conversion.model';
+import { HttpHeaders } from '@angular/common/http';
+
+@Component({
+ selector: 'app-image-converter',
+ templateUrl: 'image-converter.component.html',
+ styleUrls: ['image-converter.component.scss'],
+ standalone: true,
+ imports: [DropdownModule, AutoCompleteModule, FormsModule, CommonModule, FileConverterComponent]
+})
+export class ImageConverterComponent implements OnInit, OnDestroy {
+ constructor(private ImageService: ImageService) { }
+
+ url = 'http://localhost:1337/convert';
+ filteredFormats: string[] = [];
+ formats: Format[] = [];
+ selectedFormat: string | undefined;
+ subscriptions: Subscription[] = [];
+ selected = '';
+ headers = new HttpHeaders();
+ processedFiles: ProcessedFile[] = [];
+ fileFormats: string[] = ["image/*"];
+ selectedFile: File[] | null = null;
+
+ filterFormats(event: AutoCompleteCompleteEvent) {
+ let filtered: any[] = [];
+ let query = event.query;
+
+ for (let index = 0; index < (this.formats as any[]).length; index++) {
+ let format = (this.formats as any[])[index];
+ if (format.name.toLowerCase().indexOf(query.toLowerCase()) == 0) {
+ filtered.push(format);
+ }
+ }
+
+ this.filteredFormats = filtered;
+ }
+
+ onUploadClicked() {
+ if (this.selectedFormat && this.selectedFile) {
+ this.subscriptions.push(
+ this.ImageService.getMimeType(this.selectedFormat).subscribe((typeResponse) => {
+ this.subscriptions.push(
+ this.ImageService.convertImage(this.selectedFile![0], this.selectedFormat!)
+ .pipe(map((response: any) => {
+ const blob = new Blob([response], { type: typeResponse });
+ const blobUrl = URL.createObjectURL(blob);
+ const processedFile = {
+ name: this.selectedFile![0].name.replace(/\.[^/.]+$/, `.${this.selectedFormat?.toLowerCase()}`),
+ link: blobUrl,
+ format: this.selectedFormat
+ } as ProcessedFile;
+ this.processedFiles.push(processedFile);
+ }))
+ .subscribe()
+ );
+ })
+ );
+ }
+ }
+
+
+ onFormatSelected(format: string) {
+ this.selectedFormat = format;
+ }
+
+ onFileSelected(input: File[]): void {
+ this.selectedFile = input;
+ }
+
+ ngOnInit(): void {
+ this.subscriptions.push(this.ImageService.setAntiforgeryToken().subscribe());
+
+ this.subscriptions.push(this.ImageService.getFormats()
+ .pipe(map(formats => {
+ this.formats = formats.map(format => {
+ return {
+ name: format,
+ code: format.toLowerCase()
+ } as Format;
+ });
+ }))
+ .subscribe());
+
+ this.headers = new HttpHeaders({
+ '2311d8d8-607d-4747-8939-1bde65643254': localStorage.getItem('imgToken')!,
+ });
+ }
+
+ ngOnDestroy(): void {
+ this.subscriptions.forEach(sub => sub.unsubscribe());
+ }
+}
\ No newline at end of file
diff --git a/tools/src/tools/server-side/image-converter/image-converter.service.ts b/tools/src/tools/server-side/image-converter/image-converter.service.ts
new file mode 100644
index 0000000..c8899c6
--- /dev/null
+++ b/tools/src/tools/server-side/image-converter/image-converter.service.ts
@@ -0,0 +1,42 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { map, Observable } from 'rxjs';
+import { environment } from '../../../environments/environment';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class ImageService {
+ private baseUrl = environment.uploadServiceBaseUrl;
+
+ constructor(private http: HttpClient) { }
+
+ convertImage(image: File, format: string): Observable {
+ const formData = new FormData();
+ formData.append('file', image);
+
+ let imgToken = localStorage.getItem('imgToken');
+
+ const headers = new HttpHeaders({
+ '2311d8d8-607d-4747-8939-1bde65643254': imgToken!
+ });
+
+ return this.http.post(`${this.baseUrl}/convert/${format}`, formData, { headers, responseType: 'blob' }); }
+
+ setAntiforgeryToken(): Observable {
+ return this.http.get(`${this.baseUrl}/antiforgery/token`, { responseType: 'text' as 'json' }).pipe(
+ map((token) => {
+ localStorage.setItem('imgToken', token.replace('"', ''));
+ return token;
+ })
+ );
+ }
+
+ getMimeType(simpleType: string): Observable {
+ return this.http.get(`${this.baseUrl}/mimetype/${simpleType}`, { responseType: 'text' as 'json' });
+ }
+
+ getFormats(): Observable {
+ return this.http.get(`${this.baseUrl}/formats`);
+ }
+}
\ No newline at end of file
diff --git a/tsconfig.app.json b/tools/tsconfig.app.json
similarity index 100%
rename from tsconfig.app.json
rename to tools/tsconfig.app.json
diff --git a/tsconfig.json b/tools/tsconfig.json
similarity index 100%
rename from tsconfig.json
rename to tools/tsconfig.json
diff --git a/tsconfig.spec.json b/tools/tsconfig.spec.json
similarity index 100%
rename from tsconfig.spec.json
rename to tools/tsconfig.spec.json