Unverified Commit edc1d199 authored by Daniel's avatar Daniel Committed by GitHub

Changed editable-text interaction (#10)

* Changed editable-text interaction
- Use "edit" link instead of icon
- "edit" is visible for empty text values and on hover
- textarea appears flush with blackground
- textarea gets light gradient on de-focus
-  Change 'edit' to 'Add Description' when text is empty
parent 2fb05b50
...@@ -30,3 +30,37 @@ ...@@ -30,3 +30,37 @@
.popover.left .arrow:after { .popover.left .arrow:after {
border-left-color: $gray-darker; border-left-color: $gray-darker;
} }
.tooltip-inner {
padding: 0px;
border-radius: 3px;
background-color: $gray-darker;
}
.tooltip-inner button {
height: 36px;
width: 96px;
font-size: 14px;
border-radius: 3px;
border: none;
background-color: $gray-darker;
color: $body-bg;
font-family: $font-family-sans-serif-bold;
font-weight: $font-weight-sans-serif-bold;
outline: none;
}
.tooltip-inner button:hover {
color: $gray-light;
}
.error-tooltip {
display: flex;
padding: 5px;
}
.error-tooltip button {
height: 24px;
width: 24px;
font-size: 16px;
margin: auto;
font-family: 'Glyphicons Halflings';
}
...@@ -32,7 +32,7 @@ interface EditableTextState { ...@@ -32,7 +32,7 @@ interface EditableTextState {
class EditableText extends React.Component<EditableTextProps, EditableTextState> { class EditableText extends React.Component<EditableTextProps, EditableTextState> {
private textAreaTarget: HTMLTextAreaElement; private textAreaTarget: HTMLTextAreaElement;
private editButtonTarget: HTMLButtonElement; private editAnchorTarget: HTMLAnchorElement;
public static defaultProps: EditableTextProps = { public static defaultProps: EditableTextProps = {
editable: true, editable: true,
...@@ -77,7 +77,7 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState> ...@@ -77,7 +77,7 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState>
exitEditMode = () => { exitEditMode = () => {
this.setState({ isDisabled: false, inEditMode: false, refreshValue: '' }); this.setState({ isDisabled: false, inEditMode: false, refreshValue: '' });
} };
enterEditMode = () => { enterEditMode = () => {
if (this.props.getLatestValue) { if (this.props.getLatestValue) {
...@@ -86,23 +86,23 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState> ...@@ -86,23 +86,23 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState>
} else { } else {
this.setState({ inEditMode: true }); this.setState({ inEditMode: true });
} }
} };
refreshText = () => { refreshText = () => {
this.setState({value: this.state.refreshValue, isDisabled: false, inEditMode: false, refreshValue: undefined }); this.setState({value: this.state.refreshValue, isDisabled: false, inEditMode: false, refreshValue: undefined });
} };
updateText = () => { updateText = () => {
const newValue = ReactDOM.findDOMNode(this.textAreaTarget).value; const newValue = ReactDOM.findDOMNode(this.textAreaTarget).value;
const onSuccessCallback = () => { this.setState({value: newValue, inEditMode: false, refreshValue: undefined }); }; const onSuccessCallback = () => { this.setState({value: newValue, inEditMode: false, refreshValue: undefined }); };
const onFailureCallback = () => { this.exitEditMode(); } const onFailureCallback = () => { this.exitEditMode(); };
this.props.onSubmitValue(newValue, onSuccessCallback, onFailureCallback); this.props.onSubmitValue(newValue, onSuccessCallback, onFailureCallback);
} };
getTarget(type) { getTarget(type) {
if (type === 'editButton') { if (type === 'editAnchor') {
return ReactDOM.findDOMNode(this.editButtonTarget); return ReactDOM.findDOMNode(this.editAnchorTarget);
} }
if (type === 'textArea') { if (type === 'textArea') {
return ReactDOM.findDOMNode(this.textAreaTarget) return ReactDOM.findDOMNode(this.textAreaTarget)
...@@ -110,35 +110,42 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState> ...@@ -110,35 +110,42 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState>
} }
render() { render() {
if (!this.state.inEditMode || (this.state.inEditMode && this.state.isDisabled)){ if (!this.state.editable) {
return ( return (
<div className='editable-container'> <div className='editable-container'>
{ <div className='editable-text'>{ this.state.value }</div>
this.state.editable && </div>
<div> );
<button }
className='btn icon edit-button' if (!this.state.inEditMode || (this.state.inEditMode && this.state.isDisabled)) {
disabled= { this.state.isDisabled } return (
onClick={ this.enterEditMode } <div className='editable-container'>
ref={button => { <Overlay
this.editButtonTarget = button; placement='top'
show={this.state.isDisabled}
target={this.getTarget.bind(this,'editAnchor')}
>
<Tooltip id='error-tooltip'>
<div className="error-tooltip">
<text>This text is out of date, please refresh the component</text>
<button onClick={this.refreshText}>&#xe031;</button>
</div>
</Tooltip>
</Overlay>
<div className={"editable-text"}>
{ this.state.value }
<a className={ "edit-link " + (this.state.value ? "" : "no-value") }
href="JavaScript:void(0)"
onClick={ this.enterEditMode }
ref={ anchor => {
this.editAnchorTarget = anchor;
}} }}
/> >
<Overlay {
placement='top' this.state.value ? "edit" : "Add Description"
show={this.state.isDisabled} }
target={this.getTarget.bind(this,'editButton')} </a>
> </div>
<Tooltip id='error-tooltip'>
<div className="error-tooltip">
<text>This text is out of date, please refresh the component</text>
<button onClick={this.refreshText}>&#xe031;</button>
</div>
</Tooltip>
</Overlay>
</div>
}
<div className='editable-text'>{ this.state.value }</div>
</div> </div>
); );
} }
...@@ -167,7 +174,6 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState> ...@@ -167,7 +174,6 @@ class EditableText extends React.Component<EditableTextProps, EditableTextState>
<button id='save' onClick={this.updateText}>Save</button> <button id='save' onClick={this.updateText}>Save</button>
</Tooltip> </Tooltip>
</Overlay> </Overlay>
</div> </div>
); );
} }
......
...@@ -4,64 +4,44 @@ ...@@ -4,64 +4,44 @@
display: flex; display: flex;
font-size: 16px; font-size: 16px;
color: $gray-light; color: $gray-light;
}
.editable-text {
flex-grow: 0.1;
word-break: break-word;
}
.editable-textarea {
padding: 2px 5px;
outline: none;
}
.editable-textarea:focus-within {
border: 2px solid $gradient-2;
outline: none;
}
.tooltip-inner {
padding: 0px;
border-radius: 3px;
background-color: $gray-darker;
}
.tooltip-inner button { &:hover {
height: 36px; .edit-link {
width: 96px; opacity: 1;
font-size:14px; }
border-radius: 3px; }
border: none;
background-color: $gray-darker; .edit-link {
color: $body-bg; opacity: 0;
font-family: $font-family-sans-serif-bold; margin-left: 4px;
font-weight: $font-weight-sans-serif-bold; color: $gradient-3;
outline: none; text-decoration: none;
}
.tooltip-inner button:hover { &:hover {
color: $gray-light; color: $gradient-4;
} }
.edit-button { &.no-value {
height: 24px; opacity: 1;
width: 24px; margin-left: 0;
border: none; }
border-radius: 1px; }
margin-right: 4px;
background-color: $gray-light; .editable-text {
-webkit-mask-image: url('/static/images/icons/Edit.svg'); flex-grow: 0.1;
mask-image: url('/static/images/icons/Edit.svg'); word-break: break-word;
} }
.error-tooltip { .editable-textarea {
display: flex; padding: 0;
padding: 5px; outline: none;
} border: 0;
.error-tooltip button { background: $gradient-1;
height: 24px; caret-color: $gradient-4;
width: 24px; }
font-size: 16px;
margin: auto; .editable-textarea:focus-within {
font-family: 'Glyphicons Halflings'; outline: none;
background: white;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment