Reset custom power selector when blurred on empty (#9508)

This commit is contained in:
Michael Telatynski 2022-10-26 17:14:33 +01:00 committed by GitHub
parent 7692533e18
commit ee61994c05
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 5 deletions

View file

@ -16,7 +16,7 @@ limitations under the License.
import { _t } from './languageHandler';
export function levelRoleMap(usersDefault: number) {
export function levelRoleMap(usersDefault: number): Record<number | "undefined", string> {
return {
undefined: _t('Default'),
0: _t('Restricted'),

View file

@ -44,14 +44,13 @@ interface IProps {
}
interface IState {
levelRoleMap: {};
levelRoleMap: Partial<Record<number | "undefined", string>>;
// List of power levels to show in the drop-down
options: number[];
customValue: number;
selectValue: number | string;
custom?: boolean;
customLevel?: number;
}
export default class PowerSelector extends React.Component<IProps, IState> {
@ -101,7 +100,7 @@ export default class PowerSelector extends React.Component<IProps, IState> {
levelRoleMap,
options,
custom: isCustom,
customLevel: newProps.value,
customValue: newProps.value,
selectValue: isCustom ? CUSTOM_VALUE : newProps.value,
});
}
@ -125,7 +124,11 @@ export default class PowerSelector extends React.Component<IProps, IState> {
event.preventDefault();
event.stopPropagation();
this.props.onChange(this.state.customValue, this.props.powerLevelKey);
if (Number.isFinite(this.state.customValue)) {
this.props.onChange(this.state.customValue, this.props.powerLevelKey);
} else {
this.initStateFromProps(this.props); // reset, invalid input
}
};
private onCustomKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {

View file

@ -0,0 +1,62 @@
/*
Copyright 2022 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import { fireEvent, render, screen } from "@testing-library/react";
import PowerSelector from "../../../../src/components/views/elements/PowerSelector";
describe('<PowerSelector />', () => {
it("should reset back to custom value when custom input is blurred blank", async () => {
const fn = jest.fn();
render(<PowerSelector value={25} maxValue={100} usersDefault={0} onChange={fn} />);
const input = screen.getByLabelText("Power level");
fireEvent.change(input, { target: { value: "" } });
fireEvent.blur(input);
await screen.findByDisplayValue(25);
expect(fn).not.toHaveBeenCalled();
});
it("should reset back to preset value when custom input is blurred blank", async () => {
const fn = jest.fn();
render(<PowerSelector value={50} maxValue={100} usersDefault={0} onChange={fn} />);
const select = screen.getByLabelText("Power level");
fireEvent.change(select, { target: { value: "SELECT_VALUE_CUSTOM" } });
const input = screen.getByLabelText("Power level");
fireEvent.change(input, { target: { value: "" } });
fireEvent.blur(input);
const option = await screen.findByText<HTMLOptionElement>("Moderator");
expect(option.selected).toBeTruthy();
expect(fn).not.toHaveBeenCalled();
});
it("should call onChange when custom input is blurred with a number in it", async () => {
const fn = jest.fn();
render(<PowerSelector value={25} maxValue={100} usersDefault={0} onChange={fn} powerLevelKey="key" />);
const input = screen.getByLabelText("Power level");
fireEvent.change(input, { target: { value: 40 } });
fireEvent.blur(input);
await screen.findByDisplayValue(40);
expect(fn).toHaveBeenCalledWith(40, "key");
});
});