Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 497x 497x 497x 497x 497x 497x 497x | /* * Copyright 2021 Harness Inc. All rights reserved. * Use of this source code is governed by the PolyForm Shield 1.0.0 license * that can be found in the licenses directory at the root of this repository, also available at * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt. */ import React, { useState } from 'react' import cx from 'classnames' import ContentEditable from 'react-contenteditable' import { Icon } from '@wings-software/uicore' import css from './EditableText.module.scss' interface EditableTextProps { value?: string editable?: boolean onChange?: (value: string) => void } const EditableText: React.FC<EditableTextProps> = props => { const { value, onChange, editable = true } = props const [val, setVal] = useState(value || '') const [editing, setEditing] = useState(false) return ( <> <ContentEditable html={val} disabled={!editable || !editing} className={cx(css.editableText, { [css.editing]: editing })} tagName="span" onChange={ev => { setVal(ev.target.value) onChange?.(ev.target.value) }} onBlur={_ => { setEditing(false) }} /> {editable && !editing ? ( <Icon name="edit" style={{ paddingBottom: '4px' }} size={8} onClick={() => { setEditing(true) }} /> ) : null} </> ) } export default EditableText |