Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add translation module for labels #11

Merged
merged 3 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"@angular/platform-browser": "^18.0.0",
"@angular/platform-browser-dynamic": "^18.0.0",
"@angular/router": "^18.0.0",
"@ngx-translate/core": "^15.0.0",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"zone.js": "~0.14.3"
Expand Down
69 changes: 43 additions & 26 deletions projects/osmosys-form/src/lib/osmosys-form.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ <h2>{{ formConfig.title.text }}</h2>
<!-- Input elements will be inserted here based on type -->
<!-- Input field (Text, Email, Password, etc.) -->
<div *ngSwitchCase="'input'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<input
[type]="element.inputType"
[formControlName]="element.name"
[placeholder]="element.placeholder ? translate(element.placeholder) : ''"
[ngClass]="
element.class +
' ' +
Expand All @@ -34,6 +35,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
[readonly]="element.readonly || false"
[autocomplete]="element.autocomplete || 'off'"
class="form-control"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
Expand All @@ -45,14 +47,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Select field -->
<div *ngSwitchCase="'select'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<select
[formControlName]="element.name"
[ngClass]="
Expand All @@ -67,14 +69,18 @@ <h2>{{ formConfig.title.text }}</h2>
[id]="element.name"
class="form-select"
aria-label="Default select example"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
>
<!--can add disabled property-->
<option value="">{{ 'Select ' + element.label }}</option>
<option value="">
{{ element.placeholder ? translate(element.placeholder) : '' }}
</option>
<option *ngFor="let option of element.options" [value]="option.value">
{{ option.label }}
{{ translate(option.label) }}
</option>
</select>
<div
Expand All @@ -83,14 +89,15 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>

<!-- Range field -->
<div *ngSwitchCase="'range'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<input
type="range"
[formControlName]="element.name"
Expand All @@ -107,6 +114,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
class="form-range"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
Expand All @@ -122,14 +130,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Date field -->
<div *ngSwitchCase="'date'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<input
type="date"
[formControlName]="element.name"
Expand All @@ -144,6 +152,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
class="form-control"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
Expand All @@ -154,14 +163,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- File upload field -->
<div *ngSwitchCase="'file'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<input
type="file"
[formControlName]="element.name"
Expand All @@ -176,6 +185,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
class="form-control"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
Expand All @@ -186,14 +196,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Multiselect field -->
<div *ngSwitchCase="'multiselect'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<select
[formControlName]="element.name"
[ngClass]="
Expand All @@ -208,12 +218,13 @@ <h2>{{ formConfig.title.text }}</h2>
[id]="element.name"
multiple
class="form-control"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
>
<option *ngFor="let option of element.options" [value]="option.value">
{{ option.label }}
{{ translate(option.label) }}
</option>
</select>
<div
Expand All @@ -222,7 +233,7 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
Expand All @@ -235,12 +246,13 @@ <h2>{{ formConfig.title.text }}</h2>
[disabled]="element.action === 'submit' && form.invalid"
(click)="handleButtonClick(element.action)"
>
{{ element.label }}
{{ translate(element.label) }}
</button>
</ng-container>

<!-- Color field -->
<div *ngSwitchCase="'color'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<input
type="color"
[formControlName]="element.name"
Expand All @@ -255,6 +267,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
class="form-control form-control-color"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
Expand All @@ -265,14 +278,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Radio button field -->
<div *ngSwitchCase="'radio'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<div
*ngFor="let option of element.options"
class="form-check"
Expand All @@ -293,12 +306,13 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name + '_' + option.value"
class="form-check-input"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
/>
<label class="form-check-label" [for]="element.name + '_' + option.value">
{{ option.label }}
{{ translate(option.label) }}
</label>
</div>
<div
Expand All @@ -307,17 +321,18 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Textarea field -->
<div *ngSwitchCase="'textarea'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<textarea
[formControlName]="element.name"
[rows]="element.rows"
[placeholder]="element.placeholder ? translate(element.placeholder) : ''"
[ngClass]="
element.class +
' ' +
Expand All @@ -329,6 +344,7 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name"
class="form-control"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
Expand All @@ -339,14 +355,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!-- Checkbox field -->
<div *ngSwitchCase="'checkbox'" class="form-group">
<label [for]="element.name">{{ element.label }}</label>
<label [for]="element.name">{{ translate(element.label) }}</label>
<div
*ngFor="let option of element.options"
class="form-check"
Expand All @@ -367,12 +383,13 @@ <h2>{{ formConfig.title.text }}</h2>
"
[id]="element.name + '_' + option.value"
class="form-check-input"
[autocomplete]="element.autocomplete || 'off'"
(change)="handleEvent(element.events?.change, $event)"
(focus)="handleEvent(element.events?.focus, $event)"
(blur)="handleEvent(element.events?.blur, $event)"
/>
<label class="form-check-label" [for]="element.name + '_' + option.value">
{{ option.label }}
{{ translate(option.label) }}
</label>
</div>
<div
Expand All @@ -381,14 +398,14 @@ <h2>{{ formConfig.title.text }}</h2>
>
<div *ngFor="let validation of element.validations">
<div *ngIf="form.get(element.name)?.errors?.[validation.name]">
{{ validation.message }}
{{ translate(validation.message) }}
</div>
</div>
</div>
</div>
<!--paragraph field-->
<div *ngSwitchCase="'paragraph'" class="form-group">
<p>{{ element.value }}</p>
<p>{{ translate(element.value) }}</p>
</div>
</ng-container>
</div>
Expand Down
19 changes: 19 additions & 0 deletions projects/osmosys-form/src/lib/osmosys-form.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
} from '@angular/forms';
import { Router } from '@angular/router';
import { CommonModule } from '@angular/common';
import { TranslateService } from '@ngx-translate/core';

@Component({
selector: 'osmosys-form',
Expand All @@ -34,6 +35,10 @@ export class OsmosysFormComponent implements OnInit, OnChanges {

@Input() eventHandlers: { [key: string]: (event: Event) => void } = {};

@Input() useTranslation = false;

@Input() translateService!: TranslateService;

@Output() formSubmit = new EventEmitter<any>();

@Output() formInstance = new EventEmitter<FormGroup>();
Expand Down Expand Up @@ -179,4 +184,18 @@ export class OsmosysFormComponent implements OnInit, OnChanges {

this.form.reset(defaultValues);
}

translate(key: string): string {
if (this.useTranslation && this.translateService) {
if (key) {
return this.translateService.instant(key) || key;
}

// eslint-disable-next-line no-console
console.warn(`Translation key is empty: ${key}`);
return ''; // Return an empty string if the key is invalid
}

return key; // Return the key as fallback if translation is not used
}
}