Skip to content

Commit 9d6bec6

Browse files
committed
SHARED(Frontend): Introduce NativeSelect to replace use of ComboBox on mobile phones.
Change LanguageSelect to use NativeSelect when on mobile phone.
1 parent 450adf6 commit 9d6bec6

File tree

6 files changed

+123
-3
lines changed

6 files changed

+123
-3
lines changed

frontend/packages/shared/CHANGELOG.MD

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
## [Released]
1111

12+
## [1.10.0] - 2023-10-19
13+
14+
### Added
15+
16+
- New `NativeSelect` and `NativeSelectWithLabel` components for mobile phone use
17+
18+
### Changed
19+
20+
- `LanguageSelect` to use `NativeSelect` when rendered on mobile phone
21+
- `LanguageSelect` now requires `onLanguageChange` prop
22+
1223
## [1.9.29] - 2023-10-10
1324

1425
### Added

frontend/packages/shared/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@opetushallitus/kieli-ja-kaantajatutkinnot.shared",
3-
"version": "1.9.29",
3+
"version": "1.10.0",
44
"description": "Shared Frontend Package",
55
"exports": {
66
"./components": "./src/components/index.tsx",

frontend/packages/shared/src/components/LanguageSelect/LanguageSelect.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('LanguageSelect', () => {
1717
excludedLanguage="FI"
1818
primaryLanguages={['SV']}
1919
translateLanguage={jest.fn((l: string) => l)}
20+
onLanguageChange={jest.fn()}
2021
/>
2122
)
2223
.toJSON();

frontend/packages/shared/src/components/LanguageSelect/LanguageSelect.tsx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { useWindowProperties } from '../../hooks/useWindowProperties/useWindowProperties';
12
import {
23
AutoCompleteComboBox,
34
ComboBoxOption,
45
ComboBoxProps,
56
} from '../../interfaces/comboBox';
67
import { ComboBox, sortOptionsByLabels } from '../ComboBox/ComboBox';
8+
import { NativeSelect } from '../NativeSelect/NativeSelect';
79

810
export const languageToComboBoxOption = (
911
translate: (l: string) => string,
@@ -18,6 +20,7 @@ interface LanguageSelectProps {
1820
primaryLanguages?: Array<string>;
1921
excludedLanguage?: string;
2022
translateLanguage: (l: string) => string;
23+
onLanguageChange: (l?: string) => void;
2124
}
2225

2326
/**
@@ -39,10 +42,14 @@ export const LanguageSelect = ({
3942
primaryLanguages,
4043
excludedLanguage,
4144
translateLanguage,
45+
onLanguageChange,
46+
helperText,
47+
showError,
48+
value,
4249
...rest
4350
}: LanguageSelectProps &
4451
Omit<ComboBoxProps, 'values'> &
45-
AutoCompleteComboBox) => {
52+
Omit<AutoCompleteComboBox, 'onChange'>) => {
4653
const includedLanguages = excludedLanguage
4754
? languages.filter((language) => language !== excludedLanguage)
4855
: languages;
@@ -63,5 +70,28 @@ export const LanguageSelect = ({
6370
...sortOptionsByLabels(secondaryOptions),
6471
];
6572

66-
return <ComboBox {...rest} values={sortedOptions} />;
73+
const { isPhone } = useWindowProperties();
74+
if (isPhone) {
75+
return (
76+
<NativeSelect
77+
placeholder={rest.label || ''}
78+
values={sortedOptions}
79+
value={value}
80+
onChange={(e) => onLanguageChange(e.target.value as string)}
81+
helperText={helperText}
82+
showError={showError}
83+
/>
84+
);
85+
}
86+
87+
return (
88+
<ComboBox
89+
{...rest}
90+
onChange={(_, v) => onLanguageChange(v?.value)}
91+
values={sortedOptions}
92+
value={value}
93+
helperText={helperText}
94+
showError={showError}
95+
/>
96+
);
6797
};
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import {
2+
FormControl,
3+
FormHelperText,
4+
Select,
5+
SelectProps,
6+
} from '@mui/material';
7+
import { FC } from 'react';
8+
9+
import { Variant } from '../../enums';
10+
import { ComboBoxOption } from '../../interfaces';
11+
import { Text } from '../Text/Text';
12+
13+
interface CustomNativeSelectProps extends SelectProps {
14+
helperText?: string;
15+
showError?: boolean;
16+
placeholder: string;
17+
value: ComboBoxOption | null;
18+
values: Array<ComboBoxOption>;
19+
}
20+
21+
const CustomSelect = ({
22+
value,
23+
values,
24+
placeholder,
25+
...rest
26+
}: CustomNativeSelectProps) => {
27+
const options = [{ label: placeholder, value: '' }, ...values];
28+
29+
return (
30+
<Select
31+
variant={Variant.Outlined}
32+
value={value?.value || ''}
33+
{...rest}
34+
native
35+
>
36+
{options.map(({ label, value }) => (
37+
<option key={value} value={value}>
38+
{label}
39+
</option>
40+
))}
41+
</Select>
42+
);
43+
};
44+
45+
export const NativeSelect: FC<CustomNativeSelectProps> = ({
46+
showError,
47+
helperText,
48+
...rest
49+
}) => {
50+
return (
51+
<FormControl fullWidth error={showError}>
52+
<CustomSelect {...rest} />
53+
{showError && <FormHelperText>{helperText}</FormHelperText>}
54+
</FormControl>
55+
);
56+
};
57+
58+
export const NativeSelectWithLabel: FC<
59+
CustomNativeSelectProps & { label: string }
60+
> = ({ id, showError, helperText, label, ...rest }) => {
61+
const errorStyles = showError ? { color: 'error.main' } : {};
62+
63+
return (
64+
<FormControl fullWidth error={showError}>
65+
<label htmlFor={id}>
66+
<Text sx={errorStyles}>
67+
<b>{label}</b>
68+
</Text>
69+
</label>
70+
<CustomSelect {...rest} />
71+
{showError && <FormHelperText>{helperText}</FormHelperText>}
72+
</FormControl>
73+
);
74+
};

frontend/packages/shared/src/components/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,7 @@ export { StyleCacheProvider } from './StyleCacheProvider/StyleCacheProvider';
4646
export { ScrollToTop } from './ScrollToTop/ScrollToTop';
4747
export { StackableMobileAppBar } from './StackableMobileAppBar/StackableMobileAppBar';
4848
export { WebLink } from './WebLink/WebLink';
49+
export {
50+
NativeSelect,
51+
NativeSelectWithLabel,
52+
} from './NativeSelect/NativeSelect';

0 commit comments

Comments
 (0)