Skip to content

Commit 7194ebf

Browse files
authored
Merge branch 'master' into preserve-edit-data
2 parents 66e5c00 + 2d4eee9 commit 7194ebf

32 files changed

Lines changed: 1063 additions & 451 deletions

File tree

.devcontainer/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.191.1/containers/javascript-node/.devcontainer/base.Dockerfile
22

3-
# [Choice] Node.js version: 22
4-
ARG VARIANT="22"
3+
# [Choice] Node.js version: 24
4+
ARG VARIANT="24"
55
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:1-${VARIANT}
66

77
# Install chromium and point the CHROME_BIN environment variable to it

.github/workflows/ci.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ jobs:
2121
- windows-latest
2222
name: Run on ${{ matrix.os }}
2323
steps:
24-
- uses: actions/checkout@v4
24+
- uses: actions/checkout@v6
2525

2626
- name: Setup node
27-
uses: actions/setup-node@v4
27+
uses: actions/setup-node@v6
2828
with:
29-
node-version: 22
29+
node-version: 24
3030

31-
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
31+
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
3232
name: Install pnpm
3333
id: pnpm-install
3434
with:

.github/workflows/publish.yaml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
id-token: 'write' # Required for npm OIDC
2828
runs-on: 'ubuntu-latest'
2929
steps:
30-
- uses: 'actions/checkout@v4'
30+
- uses: 'actions/checkout@v6'
3131
with:
3232
token: '${{ secrets.JSONFORMS_PUBLISH_PAT }}'
3333

@@ -36,22 +36,18 @@ jobs:
3636
git config user.name "jsonforms-publish[bot]"
3737
git config user.email "jsonforms-publish@eclipsesource.com"
3838
39-
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
39+
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
4040
name: Install pnpm
4141
id: pnpm-install
4242
with:
4343
run_install: false
4444

4545
- name: 'Setup node'
46-
uses: 'actions/setup-node@v4'
46+
uses: 'actions/setup-node@v6'
4747
with:
48-
node-version: '22'
48+
node-version: '24'
4949
registry-url: 'https://registry.npmjs.org'
5050

51-
# Ensure npm 11.5.1 or later for trusted publishing
52-
- name: Update npm
53-
run: npm install -g npm@latest
54-
5551
- name: 'Install Packages'
5652
run: 'pnpm i --frozen-lockfile'
5753

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
22
1+
24

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ Independently of the assigned milestone, contributions are always accepted and a
4343

4444
### First time setup
4545

46-
- Install [node.js](https://nodejs.org/) (only Node v22+ < 23 is currently supported)
47-
- Install pnpm: <https://pnpm.io/installation> (use pnpm 10.4.1+) or use [corepack](https://nodejs.org/docs/latest-v18.x/api/corepack.html) to enable the recommended version
46+
- Install [node.js](https://nodejs.org/) (only Node v24+ < 25 is currently supported)
47+
- Install pnpm: <https://pnpm.io/installation> (use pnpm 10.33.0+) or use [corepack](https://nodejs.org/docs/latest-v18.x/api/corepack.html) to enable the recommended version
4848
- Clone this repository
4949
- Install dependencies: `pnpm i --frozen-lockfile`
5050

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "3.8.0-alpha.0",
2+
"version": "3.8.0-alpha.1",
33
"npmClient": "pnpm",
44
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
55
}

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "jsonforms-monorepo",
33
"engines": {
4-
"node": "^22",
5-
"pnpm": "^10.4.1"
4+
"node": "^24",
5+
"pnpm": "^10.33.0"
66
},
7-
"packageManager": "pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c",
7+
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
88
"scripts": {
99
"lerna": "lerna",
1010
"preparePublish": "git clean -dfx && pnpm i --frozen-lockfile && pnpm run clean && pnpm run build && pnpm run doc && pnpm run test",

packages/angular-material/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@jsonforms/angular-material",
3-
"version": "3.8.0-alpha.0",
3+
"version": "3.8.0-alpha.1",
44
"description": "Material Renderer Set for Angular module of JSON Forms",
55
"repository": {
66
"type": "git",
@@ -72,8 +72,8 @@
7272
"@angular/material": "^19.0.0 || ^20.0.0 || ^21.0.0",
7373
"@angular/platform-browser": "^19.0.0 || ^20.0.0 || ^21.0.0",
7474
"@angular/router": "^19.0.0 || ^20.0.0 || ^21.0.0",
75-
"@jsonforms/angular": "3.8.0-alpha.0",
76-
"@jsonforms/core": "3.8.0-alpha.0",
75+
"@jsonforms/angular": "3.8.0-alpha.1",
76+
"@jsonforms/core": "3.8.0-alpha.1",
7777
"dayjs": "^1.11.10",
7878
"rxjs": "^6.6.0 || ^7.4.0"
7979
},
@@ -107,7 +107,7 @@
107107
"@ngtools/webpack": "^19.0.0",
108108
"@types/jasmine": "~3.8.0",
109109
"@types/lodash": "4.14.149",
110-
"@types/node": "^22.13.8",
110+
"@types/node": "^24.12.2",
111111
"@typescript-eslint/eslint-plugin": "^5.54.1",
112112
"@typescript-eslint/parser": "^5.54.1",
113113
"babel-loader": "^8.0.6",

packages/angular-material/src/library/controls/autocomplete.renderer.ts renamed to packages/angular-material/src/library/controls/enum.renderer.ts

Lines changed: 91 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ import {
3636
ControlElement,
3737
EnumOption,
3838
isEnumControl,
39+
isOneOfEnumControl,
3940
JsonFormsState,
4041
mapStateToEnumControlProps,
42+
mapStateToOneOfEnumControlProps,
4143
OwnPropsOfControl,
4244
OwnPropsOfEnum,
4345
RankedTester,
@@ -52,51 +54,53 @@ import { MatFormFieldModule } from '@angular/material/form-field';
5254
import { MatInputModule } from '@angular/material/input';
5355
import { MatAutocompleteModule } from '@angular/material/autocomplete';
5456

55-
@Component({
56-
selector: 'AutocompleteControlRenderer',
57-
template: `
58-
<mat-form-field [ngStyle]="{ display: hidden ? 'none' : '' }">
59-
<mat-label>{{ label }}</mat-label>
60-
<input
61-
matInput
62-
type="text"
63-
(change)="onChange($event)"
64-
[id]="id"
65-
[formControl]="form"
66-
[matAutocomplete]="auto"
67-
(keydown)="updateFilter($event)"
68-
(focus)="focused = true"
69-
(focusout)="focused = false"
70-
/>
71-
<mat-autocomplete
72-
autoActiveFirstOption
73-
#auto="matAutocomplete"
74-
(optionSelected)="onSelect($event)"
75-
[displayWith]="displayFn"
76-
>
77-
@for (option of filteredOptions | async; track option.value) {
78-
<mat-option [value]="option">
79-
{{ option.label }}
80-
</mat-option>
81-
}
82-
</mat-autocomplete>
83-
<mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{
84-
description
85-
}}</mat-hint>
86-
<mat-error>{{ error }}</mat-error>
87-
</mat-form-field>
88-
`,
89-
styles: [
90-
`
91-
:host {
92-
display: flex;
93-
flex-direction: row;
94-
}
95-
mat-form-field {
96-
flex: 1 1 auto;
57+
const template = `
58+
<mat-form-field [ngStyle]="{ display: hidden ? 'none' : '' }">
59+
<mat-label>{{ label }}</mat-label>
60+
<input
61+
matInput
62+
type="text"
63+
(change)="onChange($event)"
64+
[id]="id"
65+
[formControl]="form"
66+
[matAutocomplete]="auto"
67+
(keydown)="updateFilter($event)"
68+
(focus)="focused = true"
69+
(focusout)="focused = false"
70+
/>
71+
<mat-autocomplete
72+
autoActiveFirstOption
73+
#auto="matAutocomplete"
74+
(optionSelected)="onSelect($event)"
75+
[displayWith]="displayFn"
76+
>
77+
@for (option of filteredOptions | async; track option.value) {
78+
<mat-option [value]="option">
79+
{{ option.label }}
80+
</mat-option>
9781
}
98-
`,
99-
],
82+
</mat-autocomplete>
83+
<mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{
84+
description
85+
}}</mat-hint>
86+
<mat-error>{{ error }}</mat-error>
87+
</mat-form-field>
88+
`;
89+
90+
const style = `
91+
:host {
92+
display: flex;
93+
flex-direction: row;
94+
}
95+
mat-form-field {
96+
flex: 1 1 auto;
97+
}
98+
`;
99+
100+
@Component({
101+
selector: 'OneOfEnumControlRenderer',
102+
template,
103+
styles: [style],
100104
changeDetection: ChangeDetectionStrategy.OnPush,
101105
imports: [
102106
CommonModule,
@@ -106,11 +110,11 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete';
106110
MatAutocompleteModule,
107111
],
108112
})
109-
export class AutocompleteControlRenderer
113+
export class OneOfEnumControlRenderer
110114
extends JsonFormsControl
111115
implements OnInit
112116
{
113-
@Input() options?: EnumOption[] | string[];
117+
@Input() options?: EnumOption[];
114118
valuesToTranslatedOptions?: Map<string, EnumOption>;
115119
filteredOptions: Observable<EnumOption[]>;
116120
shouldFilter: boolean;
@@ -123,7 +127,7 @@ export class AutocompleteControlRenderer
123127
protected override mapToProps(
124128
state: JsonFormsState
125129
): StatePropsOfControl & OwnPropsOfEnum {
126-
return mapStateToEnumControlProps(state, this.getOwnProps());
130+
return mapStateToOneOfEnumControlProps(state, this.getOwnProps());
127131
}
128132

129133
getEventValue = (event: any) => event.target.value;
@@ -209,29 +213,51 @@ export class AutocompleteControlRenderer
209213
protected getOwnProps(): OwnPropsOfControl & OwnPropsOfEnum {
210214
return {
211215
...super.getOwnProps(),
212-
options: this.stringOptionsToEnumOptions(this.options),
216+
options: this.options,
213217
};
214218
}
219+
}
215220

216-
/**
217-
* For {@link options} input backwards compatibility
218-
*/
219-
protected stringOptionsToEnumOptions(
220-
options: typeof this.options
221-
): EnumOption[] | undefined {
222-
if (!options) {
223-
return undefined;
224-
}
221+
export const oneOfEnumControlTester: RankedTester = rankWith(
222+
5,
223+
isOneOfEnumControl
224+
);
225+
226+
@Component({
227+
selector: 'EnumControlRenderer, AutocompleteControlRenderer',
228+
template,
229+
styles: [style],
230+
changeDetection: ChangeDetectionStrategy.OnPush,
231+
imports: [
232+
CommonModule,
233+
ReactiveFormsModule,
234+
MatFormFieldModule,
235+
MatInputModule,
236+
MatAutocompleteModule,
237+
],
238+
})
239+
export class EnumControlRenderer extends OneOfEnumControlRenderer {
240+
// eslint-disable-next-line @angular-eslint/no-input-rename
241+
@Input('options')
242+
set stringOptions(strOptions: string[]) {
243+
this.options = strOptions.map((str) => {
244+
return {
245+
label: str,
246+
value: str,
247+
};
248+
});
249+
}
225250

226-
return options.every((item) => typeof item === 'string')
227-
? options.map((str) => {
228-
return {
229-
label: str,
230-
value: str,
231-
} satisfies EnumOption;
232-
})
233-
: options;
251+
protected override mapToProps(
252+
state: JsonFormsState
253+
): StatePropsOfControl & OwnPropsOfEnum {
254+
return mapStateToEnumControlProps(state, this.getOwnProps());
234255
}
235256
}
236257

258+
/**
259+
* For {@link AutocompleteControlRenderer} class name backwards compatibility
260+
*/
261+
export { EnumControlRenderer as AutocompleteControlRenderer };
262+
237263
export const enumControlTester: RankedTester = rankWith(2, isEnumControl);

packages/angular-material/src/library/controls/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ export * from './number.renderer';
2929
export * from './range.renderer';
3030
export * from './date.renderer';
3131
export * from './toggle.renderer';
32-
export * from './autocomplete.renderer';
32+
export * from './enum.renderer';

0 commit comments

Comments
 (0)