Skip to content

Commit

Permalink
Array translations for react vanilla, angular-material, vue (#2129)
Browse files Browse the repository at this point in the history
Replace existing hard-coded labels with translation-options for array-control elements for the vanilla, angular-material and vue renderers.
  • Loading branch information
LukasBoll committed Apr 14, 2023
1 parent 06bbb4b commit 8b6c9d2
Show file tree
Hide file tree
Showing 20 changed files with 105 additions and 88 deletions.
37 changes: 12 additions & 25 deletions packages/angular-material/src/layouts/array-layout.renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
import { JsonFormsAngularService, JsonFormsAbstractControl } from '@jsonforms/angular';
import {
ArrayLayoutProps,
ArrayTranslations,
createDefaultValue,
findUISchema,
isObjectArrayWithNesting,
Expand Down Expand Up @@ -68,15 +69,15 @@ import {
<span fxFlex></span>
<button
mat-button
matTooltip="{{ this.addTooltip }}"
matTooltip="{{ translations.addTooltip }}"
[disabled]="!isEnabled()"
(click)="add()"
attr.aria-label="{{ this.addAriaLabel }}"
attr.aria-label="{{ translations.addAriaLabel }}"
>
<mat-icon>add</mat-icon>
</button>
</div>
<p *ngIf="noData">{{ this.noDataMessage }}</p>
<p *ngIf="noData">{{ translations.noDataMessage }}</p>
<div
*ngFor="
let item of [].constructor(data);
Expand All @@ -97,8 +98,8 @@ import {
mat-button
[disabled]="first"
(click)="up(idx)"
attr.aria-label="{{ this.upAriaLabel }}"
matTooltip="{{ this.upTooltip }}"
attr.aria-label="{{ translations.upAriaLabel }}"
matTooltip="{{ translations.up }}"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
Expand All @@ -109,8 +110,8 @@ import {
mat-button
[disabled]="last"
(click)="down(idx)"
attr.aria-label="{{ this.downAriaLabel }}"
matTooltip="{{ this.downTooltip }}"
attr.aria-label="{{ translations.downAriaLabel }}"
matTooltip="{{ translations.down }}"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
Expand All @@ -119,8 +120,8 @@ import {
mat-button
color="warn"
(click)="remove(idx)"
attr.aria-label="{{ this.removeAriaLabel }}"
matTooltip="{{ this.removeTooltip }}"
attr.aria-label="{{ translations.removeAriaLabel }}"
matTooltip="{{ translations.removeTooltip }}"
matTooltipPosition="right"
>
<mat-icon>delete</mat-icon>
Expand Down Expand Up @@ -148,16 +149,8 @@ import {
export class ArrayLayoutRenderer
extends JsonFormsAbstractControl<StatePropsOfArrayLayout>
implements OnInit, OnDestroy {
addTooltip: string;
addAriaLabel: string;
noDataMessage: string;
removeTooltip: string;
removeAriaLabel: string;
upTooltip: string;
upAriaLabel: string;
downTooltip: string;
downAriaLabel:string;
noData: boolean;
translations: ArrayTranslations;
addItem: (path: string, value: any) => () => void;
moveItemUp: (path: string, index: number) => () => void;
moveItemDown: (path: string, index: number) => () => void;
Expand Down Expand Up @@ -196,15 +189,9 @@ export class ArrayLayoutRenderer
this.removeItems = removeItems;
}
mapAdditionalProps(props: ArrayLayoutProps) {
this.translations = props.translations;
this.noData = !props.data || props.data === 0;
this.uischemas = props.uischemas;
this.addTooltip = `Add to ${this.label}`;
this.addAriaLabel = `Add to ${this.label} button`;
this.upAriaLabel = `Move ${this.label} up`;
this.downAriaLabel = `Move ${this.label} down`;
this.removeTooltip = `Delete`;
this.removeAriaLabel = `Delete button`;
this.noDataMessage = `No data`;
}
getProps(index: number): OwnPropsOfRenderer {
const uischema = findUISchema(
Expand Down
8 changes: 6 additions & 2 deletions packages/angular-material/src/other/master-detail/master.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
} from '@jsonforms/angular';
import {
ArrayControlProps,
ArrayTranslations,
ControlElement,
createDefaultValue,
decode,
Expand Down Expand Up @@ -64,7 +65,7 @@ export const removeSchemaKeywords = (path: string) => {
<mat-sidenav mode="side" opened>
<mat-nav-list>
<mat-list-item *ngIf="masterItems.length === 0"
>No items</mat-list-item
>{{ translations.noDataMessage }}</mat-list-item
>
<mat-list-item
*ngFor="
Expand Down Expand Up @@ -96,7 +97,7 @@ export const removeSchemaKeywords = (path: string) => {
(click)="onAddClick()"
*ngIf="isEnabled()"
>
<mat-icon aria-label="Add item to list">add</mat-icon>
<mat-icon [attr.aria-label]="translations.addAriaLabel">add</mat-icon>
</button>
</mat-sidenav>
<mat-sidenav-content class="content">
Expand Down Expand Up @@ -149,6 +150,7 @@ export class MasterListComponent extends JsonFormsArrayControl {
removeItems: (path: string, toDelete: number[]) => () => void;
propsPath: string;
highlightedIdx: number;
translations: ArrayTranslations;

constructor(jsonformsService: JsonFormsAngularService, private changeDetectorRef: ChangeDetectorRef) {
super(jsonformsService);
Expand Down Expand Up @@ -188,6 +190,8 @@ export class MasterListComponent extends JsonFormsArrayControl {
setReadonly(detailUISchema);
}

this.translations=props.translations;

const masterItems = (data || []).map((d: any, index: number) => {
const labelRefInstancePath = controlElement.options?.labelRef && removeSchemaKeywords(
controlElement.options.labelRef
Expand Down
11 changes: 7 additions & 4 deletions packages/angular-material/src/other/table.renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
} from '@jsonforms/angular';
import {
ArrayControlProps,
ArrayTranslations,
ControlElement, createDefaultValue,
deriveTypes,
encode,
Expand Down Expand Up @@ -57,7 +58,7 @@ import {
<ng-container matColumnDef="action">
<tr>
<th mat-header-cell *matHeaderCellDef>
<button mat-button color="primary" (click)="add()" [disabled]="!isEnabled()" matTooltip="Add"><mat-icon>add</mat-icon></button>
<button mat-button color="primary" (click)="add()" [disabled]="!isEnabled()" [matTooltip]="translations.addTooltip"><mat-icon>add</mat-icon></button>
</th>
</tr>
<tr>
Expand All @@ -68,7 +69,7 @@ import {
mat-button
[disabled]="first"
(click)="up(i)"
matTooltip="Move item up"
[matTooltip]="translations.upAriaLabel"
matTooltipPosition="right"
>
<mat-icon>arrow_upward</mat-icon>
Expand All @@ -79,7 +80,7 @@ import {
mat-button
[disabled]="last"
(click)="down(i)"
matTooltip="Move item down"
[matTooltip]="translations.downAriaLabel"
matTooltipPosition="right"
>
<mat-icon>arrow_downward</mat-icon>
Expand All @@ -90,7 +91,7 @@ import {
(click)="remove(i)"
[disabled]="!isEnabled()"
matTooltipPosition="right"
matTooltip="Delete"
[matTooltip]="translations.removeTooltip"
>
<mat-icon>delete</mat-icon>
</button>
Expand Down Expand Up @@ -126,6 +127,7 @@ export class TableRenderer extends JsonFormsArrayControl {
moveItemUp: (path: string, index: number) => () => void;
moveItemDown: (path: string, index: number) => () => void;
removeItems: (path: string, toDelete: number[]) => () => void;
translations: ArrayTranslations;

constructor(jsonformsService: JsonFormsAngularService) {
super(jsonformsService);
Expand All @@ -139,6 +141,7 @@ export class TableRenderer extends JsonFormsArrayControl {
if (this.isEnabled()) {
this.displayedColumns.push('action');
}
this.translations = props.translations;
}
getProps(index: number, props: OwnPropsOfRenderer): OwnPropsOfRenderer {
const rowPath = Paths.compose(props.path, `${index}`);
Expand Down
4 changes: 3 additions & 1 deletion packages/angular-material/test/master-detail.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { MasterListComponent } from '../src/other/master-detail/master';
import { JsonFormsDetailComponent } from '../src/other/master-detail/detail';
import { getJsonFormsService, setupMockStore } from '@jsonforms/angular-test';
import { Actions } from '@jsonforms/core';
import { MatTooltipModule } from '@angular/material/tooltip';

describe('Master detail', () => {
let fixture: ComponentFixture<MasterListComponent>;
Expand Down Expand Up @@ -114,7 +115,8 @@ describe('Master detail', () => {
MatIconModule,
MatButtonModule,
FlexLayoutModule,
NoopAnimationsModule
NoopAnimationsModule,
MatTooltipModule
],
providers: [JsonFormsAngularService]
})
Expand Down
4 changes: 3 additions & 1 deletion packages/angular-material/test/table-control.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
import { FlexLayoutModule } from '@angular/flex-layout';
import { setupMockStore } from '@jsonforms/angular-test';
import { createTesterContext } from './util';
import { MatTooltipModule } from '@angular/material/tooltip';

const uischema1: ControlElement = { type: 'Control', scope: '#' };
const uischema2: ControlElement = {
Expand Down Expand Up @@ -127,7 +128,8 @@ describe('Table', () => {
MatInputModule,
ReactiveFormsModule,
FlexLayoutModule,
MatTableModule
MatTableModule,
MatTooltipModule,
],
providers: [JsonFormsAngularService]
})
Expand Down
16 changes: 10 additions & 6 deletions packages/core/src/i18n/arrayTranslations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ export enum ArrayTranslationEnum{
deleteDialogTitle = 'deleteDialogTitle',
deleteDialogMessage = 'deleteDialogMessage',
deleteDialogAccept = 'deleteDialogAccept',
deleteDialogDecline = 'deleteDialogDecline'
deleteDialogDecline = 'deleteDialogDecline',
up = 'up',
down = 'down'
}

export type ArrayTranslations = {
Expand All @@ -24,13 +26,15 @@ export type ArrayTranslations = {

export const arrayDefaultTranslations: ArrayDefaultTranslation[] = [
{key: ArrayTranslationEnum.addTooltip, default: (input) => input?`Add to ${input}`:'Add'},
{key: ArrayTranslationEnum.addAriaLabel, default: (input) => input?`Add to ${input}`:'Add'},
{key: ArrayTranslationEnum.addAriaLabel, default: (input) => input?`Add to ${input} button`:'Add button'},
{key: ArrayTranslationEnum.removeTooltip, default: () => 'Delete'},
{key: ArrayTranslationEnum.upAriaLabel, default: (input) => `Move ${input} up`},
{key: ArrayTranslationEnum.downAriaLabel, default: (input) => `Move ${input} down`},
{key: ArrayTranslationEnum.removeAriaLabel, default: () => 'Delete button'},
{key: ArrayTranslationEnum.noDataMessage, default: () => 'No Data'},
{key: ArrayTranslationEnum.noSelection, default: () => 'No Selection'},
{key: ArrayTranslationEnum.upAriaLabel, default: () => `Move item up`},
{key: ArrayTranslationEnum.up, default: () => 'Up'},
{key: ArrayTranslationEnum.down, default: () => 'Down'},
{key: ArrayTranslationEnum.downAriaLabel, default: () => `Move item down`},
{key: ArrayTranslationEnum.noDataMessage, default: () => 'No data'},
{key: ArrayTranslationEnum.noSelection, default: () => 'No selection'},
{key: ArrayTranslationEnum.deleteDialogTitle, default: () => 'Confirm Deletion'},
{key: ArrayTranslationEnum.deleteDialogMessage, default: () => 'Are you sure you want to delete the selected entry?'},
{key: ArrayTranslationEnum.deleteDialogAccept, default: () => 'Yes'},
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/util/renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ export interface OwnPropsOfMasterListItem {
schema: JsonSchema;
handleSelect(index: number): () => void;
removeItem(path: string, value: number): () => void;
translations: ArrayTranslations;
}

export interface StatePropsOfMasterItem extends OwnPropsOfMasterListItem {
Expand Down Expand Up @@ -686,6 +687,7 @@ export interface ControlWithDetailProps
*/
export interface StatePropsOfArrayControl
extends StatePropsOfControlWithDetail {
translations: ArrayTranslations;
childErrors?: ErrorObject[];
}

Expand All @@ -700,23 +702,25 @@ export const mapStateToArrayControlProps = (
state: JsonFormsState,
ownProps: OwnPropsOfControl
): StatePropsOfArrayControl => {
const { path, schema, uischema, ...props } = mapStateToControlWithDetailProps(
const { path, schema, uischema, i18nKeyPrefix, label, ...props } = mapStateToControlWithDetailProps(
state,
ownProps
);

const resolvedSchema = Resolve.schema(schema, 'items', props.rootSchema);
const childErrors = getSubErrorsAt(path, resolvedSchema)(state);

const t = getTranslator()(state);

return {
...props,
label,
path,
uischema,
schema: resolvedSchema,
childErrors,
renderers: ownProps.renderers || getRenderers(state),
cells: ownProps.cells || getCells(state),
translations: getArrayTranslations(t,arrayDefaultTranslations,i18nKeyPrefix, label)
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
import DeleteIcon from '@mui/icons-material/Delete';
import React from 'react';

const ListWithDetailMasterItem = ({ index, childLabel, selected, handleSelect, removeItem, path }: StatePropsOfMasterItem) => {
const ListWithDetailMasterItem = ({ index, childLabel, selected, handleSelect, removeItem, path, translations }: StatePropsOfMasterItem) => {
return (
<ListItem
button
Expand All @@ -47,7 +47,7 @@ const ListWithDetailMasterItem = ({ index, childLabel, selected, handleSelect, r
</ListItemAvatar>
<ListItemText primary={childLabel} />
<ListItemSecondaryAction>
<IconButton aria-label='Delete' onClick={removeItem(path, index)} size='large'>
<IconButton aria-label={translations.removeAriaLabel} onClick={removeItem(path, index)} size='large'>
<DeleteIcon />
</IconButton>
</ListItemSecondaryAction>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ export const MaterialListWithDetailRenderer = ({
removeItem={handleRemoveItem}
selected={selectedIndex === index}
key={index}
translations={translations}
/>
))
) : (
Expand Down
13 changes: 8 additions & 5 deletions packages/material-renderers/src/complex/MaterialTableControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,10 @@ interface NonEmptyRowProps {
enabled: boolean;
cells?: JsonFormsCellRendererRegistryEntry[];
path: string;
translations: ArrayTranslations
}

const NonEmptyRowComponent =
const NonEmptyRowComponent =
({
childPath,
schema,
Expand All @@ -275,7 +276,8 @@ const NonEmptyRowComponent =
showSortButtons,
enabled,
cells,
path
path,
translations
}: NonEmptyRowProps & WithDeleteDialogSupport) => {
const moveUp = useMemo(() => moveUpCreator(path, rowIndex),[moveUpCreator, path, rowIndex]);
const moveDown = useMemo(() => moveDownCreator(path, rowIndex),[moveDownCreator, path, rowIndex]);
Expand All @@ -295,13 +297,13 @@ const NonEmptyRowComponent =
{showSortButtons ? (
<Fragment>
<Grid item>
<IconButton aria-label={`Move up`} onClick={moveUp} disabled={!enableUp} size='large'>
<IconButton aria-label={translations.upAriaLabel} onClick={moveUp} disabled={!enableUp} size='large'>
<ArrowUpward />
</IconButton>
</Grid>
<Grid item>
<IconButton
aria-label={`Move down`}
aria-label={translations.downAriaLabel}
onClick={moveDown}
disabled={!enableDown}
size='large'>
Expand All @@ -312,7 +314,7 @@ const NonEmptyRowComponent =
) : null}
<Grid item>
<IconButton
aria-label={`Delete`}
aria-label={translations.removeAriaLabel}
onClick={() => openDeleteDialog(childPath, rowIndex)}
size='large'>
<DeleteIcon />
Expand Down Expand Up @@ -378,6 +380,7 @@ const TableRows = ({
enabled={enabled}
cells={cells}
path={path}
translations={translations}
/>
);
})}
Expand Down
2 changes: 1 addition & 1 deletion packages/material-renderers/src/complex/TableToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ const TableToolbar = React.memo(
placement='bottom'
>
<IconButton
aria-label={translations.addTooltip}
aria-label={translations.addAriaLabel}
onClick={addItem(path, createDefaultValue(schema))}
size='large'>
<AddIcon />
Expand Down
Loading

0 comments on commit 8b6c9d2

Please sign in to comment.