12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import "./TextInput.scss";
- import React, { Component } from "react";
- import { selectNode, removeSelection } from "../utils";
- type Props = {
- value: string;
- onChange: (value: string) => void;
- label: string;
- isNameEditable: boolean;
- };
- export class ProjectName extends Component<Props> {
- private handleFocus = (event: React.FocusEvent<HTMLElement>) => {
- selectNode(event.currentTarget);
- };
- private handleBlur = (event: React.FocusEvent<HTMLElement>) => {
- const value = event.currentTarget.innerText.trim();
- if (value !== this.props.value) {
- this.props.onChange(value);
- }
- removeSelection();
- };
- private handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {
- if (event.key === "Enter") {
- event.preventDefault();
- if (event.nativeEvent.isComposing || event.keyCode === 229) {
- return;
- }
- event.currentTarget.blur();
- }
- };
- private makeEditable = (editable: HTMLSpanElement | null) => {
- if (!editable) {
- return;
- }
- try {
- editable.contentEditable = "plaintext-only";
- } catch {
- editable.contentEditable = "true";
- }
- };
- public render() {
- return this.props.isNameEditable ? (
- <span
- suppressContentEditableWarning
- ref={this.makeEditable}
- data-type="wysiwyg"
- className="TextInput"
- role="textbox"
- aria-label={this.props.label}
- onBlur={this.handleBlur}
- onKeyDown={this.handleKeyDown}
- onFocus={this.handleFocus}
- >
- {this.props.value}
- </span>
- ) : (
- <span
- className="TextInput TextInput--readonly"
- aria-label={this.props.label}
- >
- {this.props.value}
- </span>
- );
- }
- }
|