Skip to content

Commit 8f8aa21

Browse files
authored
Merge pull request #1552 from data-driven-forms/migrate-pf
Migrate pf mapper to TS
2 parents 2f26036 + e22ef36 commit 8f8aa21

File tree

140 files changed

+1879
-1247
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+1879
-1247
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"start-demo": "nx run @data-driven-forms/react-renderer-demo:start",
2121
"lint": "npm run lint:js && npm run lint:typescript",
2222
"lint:js": "npx eslint ./packages/*/src --ext .js",
23-
"lint:typescript": "eslint packages/react-form-renderer/src/**/* packages/react-form-renderer/demo/**/* --ext .ts,.tsx,.js,.jsx",
23+
"lint:typescript": "eslint packages/react-form-renderer/src/**/* packages/react-form-renderer/demo/**/* packages/pf4-component-mapper/src/**/* packages/pf4-component-mapper/demo/**/* --ext .ts,.tsx,.js,.jsx",
2424
"generate-template": "node ./scripts/generate-mapper.js",
2525
"clean-build": "node ./scripts/clean-build.js",
2626
"prebuild": "node ./scripts/clean-build.js"

packages/common/src/dual-list-select/dual-list-select.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ interface DualListSelectComponentProps<T = OptionValue> {
1515
handleMoveLeft: () => void;
1616
handleClearLeftValues: () => void;
1717
handleClearRightValues: () => void;
18-
filterOptions?: (options: SelectOption<T>[], filterValue: string) => SelectOption<T>[];
18+
filterOptions?: (options: SelectOption<T>[], filterValue: string) => SelectOption<T>[] | ((value: string) => void);
1919
filterValue?: string;
2020
filterValueText?: string;
2121
filterPlaceholder?: string;
2222
filterOptionsText?: string;
2323
filterValuePlaceholder?: string;
2424
noOptionsText?: string;
2525
noValueText?: string;
26+
// Missing props that are actually used in implementation
27+
sortOptions: () => void;
28+
sortValues: () => void;
29+
filterValues: (value: string) => void;
30+
state: DualListSelectState<T>;
2631
[key: string]: unknown;
2732
}
2833

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
import { ReactNode } from "react";
2+
import { FlatSelectOption, OptionValue } from '../types/shared-types';
23

3-
interface Option {
4+
export interface Option {
45
label: string | ReactNode;
56
value: any;
67
selectAll?: boolean;
78
selectNone?: boolean;
89
}
910

10-
interface ResultedOption {
11-
label?: string | ReactNode;
12-
value?: any;
13-
selectAll?: boolean;
14-
selectNone?: boolean;
15-
group?: string | ReactNode;
16-
divider?: boolean;
17-
}
18-
19-
interface Options {
11+
export interface Options {
2012
label?: string | ReactNode;
2113
value?: any;
2214
divider?: boolean;
@@ -25,8 +17,8 @@ interface Options {
2517
options?: Option[];
2618
}
2719

28-
const flatOptions = (options: Options[]): ResultedOption[] =>
29-
options.flatMap((option) => (option.options ? [{ group: option.label }, ...option.options.map(opt => opt as ResultedOption)] : [option as ResultedOption]));
20+
const flatOptions = <T extends OptionValue = OptionValue>(options: Options[]): FlatSelectOption<T>[] =>
21+
options.flatMap((option) => (option.options ? [{ group: option.label } as FlatSelectOption<T>, ...option.options.map(opt => opt as FlatSelectOption<T>)] : [option as FlatSelectOption<T>]));
3022

3123
export default flatOptions;
32-
export type { Option, ResultedOption, Options };
24+
export type ResultedOption = FlatSelectOption;

packages/common/src/select/select.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { AnyObject } from "@data-driven-forms/react-form-renderer";
55
import clsx from 'clsx';
66
import useSelect from '../use-select/use-select';
77
import deepEqual from './deep-equal';
8-
import { SelectOption, OptionValue, SelectValue } from '../types/shared-types';
8+
import { SelectOption, OptionValue, SelectValue, FlatSelectOption } from '../types/shared-types';
99

1010
export interface SelectProps<T = OptionValue> {
1111
options?: SelectOption<T>[];
@@ -26,12 +26,17 @@ export interface SelectProps<T = OptionValue> {
2626
selectVariant?: string;
2727
updatingMessage?: React.ReactNode;
2828
noOptionsMessage?: React.ReactNode;
29+
noResultsMessage?: React.ReactNode;
2930
isSearchable?: boolean;
3031
isClearable?: boolean;
3132
SelectComponent?: React.ComponentType<AnyObject>;
3233
noValueUpdates?: boolean;
33-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
34+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
3435
compareValues?: (valueA: T, valueB: T) => boolean;
36+
menuIsPortal?: boolean;
37+
menuPortalTarget?: Element;
38+
showMoreLabel?: string;
39+
showLessLabel?: string;
3540
}
3641

3742
const Select = <T extends OptionValue = OptionValue>({

packages/common/src/use-select/reducer.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import { AnyObject } from '@data-driven-forms/react-form-renderer';
2-
import { SelectOption, OptionValue } from '../types/shared-types';
2+
import { SelectOption, OptionValue, FlatSelectOption } from '../types/shared-types';
33

44
export interface SelectState<T = OptionValue> {
55
isLoading: boolean;
6-
options: SelectOption<T>[];
6+
options: (SelectOption<T> | FlatSelectOption<T>)[];
77
promises: AnyObject;
88
isInitialLoaded: boolean;
9-
originalOptions?: SelectOption<T>[];
9+
originalOptions?: (SelectOption<T> | FlatSelectOption<T>)[];
1010
}
1111

1212
interface InitProps<T = OptionValue> {
1313
propsOptions: SelectOption<T>[];
14-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
14+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
1515
}
1616

1717
type ReducerAction<T = OptionValue> =
18-
| { type: 'updateOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[] }
18+
| { type: 'updateOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[] }
1919
| { type: 'startLoading' }
20-
| { type: 'setOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[] }
20+
| { type: 'setOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[] }
2121
| { type: 'initialLoaded' }
2222
| {
2323
type: 'setPromises';
2424
payload: AnyObject;
2525
options?: SelectOption<T>[];
26-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
26+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
2727
compareValues?: (value1: T, value2: T) => boolean;
2828
};
2929

packages/common/src/use-select/use-select.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import { AnyObject } from '@data-driven-forms/react-form-renderer';
66
import useIsMounted from '../hooks/use-is-mounted';
77
import reducer, { init, SelectState } from './reducer';
88
import fnToString from '../utils/fn-to-string';
9-
import { SelectOption, OptionValue, SelectValue } from '../types/shared-types';
9+
import { SelectOption, OptionValue, SelectValue, FlatSelectOption } from '../types/shared-types';
1010

1111
interface UseSelectProps<T = OptionValue> {
1212
loadOptions?: (inputValue?: string) => Promise<SelectOption<T>[]>;
13-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
13+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
1414
options?: SelectOption<T>[];
1515
noValueUpdates?: boolean;
1616
onChange?: (value?: SelectValue<T>) => void;
@@ -27,8 +27,8 @@ const getSelectValue = <T extends OptionValue>(
2727
stateValue: SelectValue<T>,
2828
simpleValue: boolean,
2929
isMulti: boolean,
30-
allOptions: SelectOption<T>[]
31-
): SelectOption<T>[] | SelectValue<T> => {
30+
allOptions: (SelectOption<T> | FlatSelectOption<T>)[]
31+
): (SelectOption<T> | FlatSelectOption<T>)[] | SelectValue<T> => {
3232
let enhancedValue = stateValue;
3333

3434
let hasSelectAll = isMulti && allOptions.find(({ selectAll }) => selectAll);
@@ -62,7 +62,7 @@ const handleSelectChange = <T extends OptionValue>(
6262
simpleValue: boolean,
6363
isMulti: boolean,
6464
onChange: (value?: SelectValue<T>) => void,
65-
allOptions: SelectOption<T>[],
65+
allOptions: (SelectOption<T> | FlatSelectOption<T>)[],
6666
removeSelectAll: boolean,
6767
removeSelectNone: boolean
6868
): void => {

packages/pf4-component-mapper/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ vendor
7777
!src/*
7878
!demo/*
7979
!config
80+
!config/rspack.config.js
8081
!.npmignore
8182
!.gitignore
8283
!.nxignore
@@ -87,7 +88,10 @@ vendor
8788
!project.json
8889
!README.md
8990
!tsconfig.json
91+
!tsconfig.cjs.json
92+
!tsconfig.esm.json
9093
!tsconfig.spec.json
94+
!tsconfig.demo.json
9195
!jest.config.ts
9296
!generate-typings.js
9397
!rollup.config.js
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//@ts-check
2+
3+
const { defineConfig } = require('@rspack/cli');
4+
const { HtmlRspackPlugin, DefinePlugin, ProvidePlugin } = require('@rspack/core');
5+
const resolve = require('path').resolve;
6+
7+
module.exports = defineConfig({
8+
mode: 'development',
9+
entry: { app: resolve('./demo/index.tsx') },
10+
output: {
11+
path: resolve('../dist'),
12+
filename: '[name].[hash].js'
13+
},
14+
devtool: 'eval-source-map',
15+
resolve: {
16+
extensions: ['.ts', '.tsx', '.js', '.jsx'],
17+
},
18+
plugins: [
19+
new HtmlRspackPlugin({
20+
template: './demo/index.html',
21+
filename: './index.html'
22+
}),
23+
new DefinePlugin({
24+
'process.env.NODE_ENV': '"development"',
25+
}),
26+
new ProvidePlugin({
27+
process: 'process/browser.js'
28+
})
29+
],
30+
devServer: {
31+
port: 3001, // Different port from renderer to avoid conflicts
32+
hot: true,
33+
open: true,
34+
},
35+
module: {
36+
rules: [
37+
// TypeScript files with ts-loader for proper config support
38+
{
39+
test: /\.(ts|tsx)$/,
40+
exclude: /node_modules/,
41+
use: {
42+
loader: 'ts-loader',
43+
options: {
44+
configFile: 'tsconfig.demo.json'
45+
}
46+
},
47+
},
48+
// JavaScript files (if any remain)
49+
{
50+
test: /\.js$/,
51+
exclude: /(node_modules)/,
52+
use: {
53+
loader: 'builtin:swc-loader',
54+
options: {
55+
sourceMap: true,
56+
jsc: {
57+
parser: {
58+
syntax: 'ecmascript',
59+
jsx: true,
60+
},
61+
transform: {
62+
react: {
63+
runtime: 'automatic',
64+
},
65+
},
66+
},
67+
},
68+
},
69+
},
70+
// CSS/SCSS - using RSpack built-in support
71+
{
72+
test: /\.css$/,
73+
type: 'css'
74+
},
75+
{
76+
test: /\.(sa|sc)ss$/,
77+
use: ['sass-loader'],
78+
type: 'css'
79+
},
80+
// Assets
81+
{
82+
test: /\.(png|jpg|gif|svg|woff|ttf|eot)$/,
83+
type: 'asset/resource'
84+
},
85+
]
86+
},
87+
experiments: {
88+
css: true,
89+
}
90+
});

packages/pf4-component-mapper/config/webpack.config.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/pf4-component-mapper/demo/demo-schemas/dual-list-schema.js renamed to packages/pf4-component-mapper/demo/demo-schemas/dual-list-schema.tsx

File renamed without changes.

0 commit comments

Comments
 (0)