Skip to content

Commit d24360e

Browse files
committed
feat: add buttonsAlign prop to let users change the buttons location
1 parent 25e228c commit d24360e

File tree

5 files changed

+90
-13
lines changed

5 files changed

+90
-13
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ viewContainerClassName|string|No||Custom class name for the container in `view`
7171
editContainerClassName|string|No||Custom class name for the container in edit mode. Will be set to `viewContainerClassName` if you set it and omit this. See [here](https://alioguzhan.github.io/react-editext/#custom-classes-for-containers)
7272
mainContainerClassName|string|No||Custom class name for the top-level main container. See [here](https://alioguzhan.github.io/react-editext/#custom-classes-for-containers)
7373
hideIcons|bool|No|`false`|Set it to `true` if you don't want to see default icons on action buttons. See Examples page for more details.
74+
buttonsAlign|string|No|`after`|Set this to `before` if you want to locate action buttons before the input instead of after it. See [here](https://alioguzhan.github.io/react-editext/#change-buttons-location).
7475

7576
## Browser Support
7677

example/src/App.js

+51
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,26 @@ const example13Style = `
211211
align-items: center;
212212
margin-top: 5px;
213213
}`
214+
const example14 = `import React, { Component } from 'react'
215+
import EdiText from 'react-editext'
216+
217+
export default class App extends Component {
218+
onSave = val => {
219+
console.log('Edited Value -> ', val)
220+
}
221+
222+
render () {
223+
return (
224+
<EdiText
225+
type='text'
226+
buttonsAlign='before'
227+
value='What is real? How do you define real?'
228+
onSave={this.onSave}
229+
/>
230+
)
231+
}
232+
}
233+
`
214234

215235
export default class App extends Component {
216236
onSave = val => {
@@ -651,6 +671,37 @@ export default class App extends Component {
651671
</div>
652672
</div>
653673
</div>
674+
<div
675+
className='tile is-parent is-vertical is-10'
676+
id='change-buttons-location'
677+
>
678+
<div className='subtitle'>
679+
<a href='#change-buttons-location'>
680+
Change the location of action buttons
681+
</a>
682+
</div>
683+
<p className='content'>
684+
You may want locate action buttons before the input element instead of after it.
685+
Just pass the <code>buttonsAlign='before'</code> prop. You should be fine. Default value is already `after`.
686+
So don't pass anything if you don't want to change this.
687+
</p>
688+
<div className='columns'>
689+
<div className='column is-half'>
690+
<SyntaxHighlighter language='javascript' style={light}>
691+
{example14}
692+
</SyntaxHighlighter>
693+
</div>
694+
<div className='column'>
695+
<div className='subtitle'>Output</div>
696+
<EdiText
697+
type='text'
698+
buttonsAlign='before'
699+
value='What is real? How do you define real?'
700+
onSave={this.onSave}
701+
/>
702+
</div>
703+
</div>
704+
</div>
654705
<div className='tile is-parent is-vertical is-10' id='validation'>
655706
<div className='subtitle'>
656707
<a href='#validation'>Validate the Content</a>

index.d.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ declare module 'react-editext' {
22
import * as React from 'react';
33

44
export type EdiTextType = "text" | "textarea" | "email" | "number" | "date" | "datetime-local" | "time" | "month" | "url" | "week" | "tel";
5+
export type ButtonsAlignment = "after" | "before";
56

67
export interface EdiTextProps {
78
/**
@@ -39,7 +40,7 @@ declare module 'react-editext' {
3940
onValidationFail?: (...args: string[]) => any;
4041
/**
4142
* Input type. Possible options are:
42-
* `text`, `number`, `email`, `textarea`, `date`,
43+
* `text`, `number`, `email`, `textarea`, `date`,
4344
* `datetime-local`, `time`, `month`, `url`, `week`, `tel`
4445
*/
4546
type: EdiTextType;
@@ -73,15 +74,18 @@ declare module 'react-editext' {
7374
* Content for EDIT button. Any valid element and node are allowed. */
7475
editButtonContent?: any;
7576
/**
76-
* Set it to `true` if you don't want to see default icons
77+
* Set it to `true` if you don't want to see default icons
7778
* on action buttons.See Examples page for more details.
7879
*/
7980
hideIcons?: boolean;
80-
}
81+
/**
82+
* Decides whether buttons will be located _BEFORE_ or _AFTER_
83+
* the input element. Default is `after`.
84+
*/
85+
buttonsAlign?: ButtonsAlignment;
86+
}
8187

8288
export default class EdiText extends React.Component<EdiTextProps, any> {
8389
render(): JSX.Element;
84-
8590
}
86-
8791
}

src/index.js

+24-8
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ export default class EdiText extends Component {
9696
onValidationFail,
9797
validationMessage,
9898
hint,
99-
hideIcons
99+
hideIcons,
100+
buttonsAlign
100101
} = this.props
101102
const inputElem = this._renderInput()
102103
// calculate save button classes
@@ -117,11 +118,16 @@ export default class EdiText extends Component {
117118
let editContainerClass = styles.Editext__editing_container
118119
if (editContainerClassName) editContainerClass = editContainerClassName
119120
if (viewContainerClassName) editContainerClass = viewContainerClassName
121+
const buttonsContainerClass = classnames(
122+
styles.Editext__buttons_container,
123+
buttonsAlign === 'before' && `${styles.Editext__buttons_before_aligned}`,
124+
buttonsAlign === 'after' && `${styles.Editext__buttons_after_aligned}`
125+
)
120126
return (
121127
<div>
122128
<div className={editContainerClass}>
123-
{inputElem}
124-
<div className={styles.Editext__buttons_container}>
129+
{ buttonsAlign === 'after' && inputElem }
130+
<div className={buttonsContainerClass}>
125131
<button
126132
ref={this.saveButton}
127133
type='button'
@@ -139,6 +145,7 @@ export default class EdiText extends Component {
139145
{cancelButtonContent}
140146
</button>
141147
</div>
148+
{ buttonsAlign === 'before' && inputElem }
142149
</div>
143150
{!this.state.valid && !onValidationFail && (
144151
<div className={styles.Editext__validation_message}>
@@ -155,7 +162,8 @@ export default class EdiText extends Component {
155162
editButtonClassName,
156163
editButtonContent,
157164
viewContainerClassName,
158-
hideIcons
165+
hideIcons,
166+
buttonsAlign
159167
} = this.props
160168
// calculate edit button classes
161169
const editButtonDefaultClasses = classnames(
@@ -166,10 +174,15 @@ export default class EdiText extends Component {
166174
const editButtonClass = editButtonClassName || editButtonDefaultClasses
167175
const viewContainerClass =
168176
viewContainerClassName || styles.Editext__view_container
177+
const buttonsContainerClass = classnames(
178+
styles.Editext__buttons_container,
179+
buttonsAlign === 'before' && `${styles.Editext__buttons_before_aligned}`,
180+
buttonsAlign === 'after' && `${styles.Editext__buttons_after_aligned}`
181+
)
169182
return (
170183
<div className={viewContainerClass}>
171-
<div {...viewProps}>{this.state.value}</div>
172-
<div className={styles.Editext__buttons_container}>
184+
{ buttonsAlign === 'after' && <div {...viewProps}>{this.state.value}</div> }
185+
<div className={buttonsContainerClass}>
173186
<button
174187
ref={this.editButton}
175188
type='button'
@@ -179,6 +192,7 @@ export default class EdiText extends Component {
179192
{editButtonContent}
180193
</button>
181194
</div>
195+
{ buttonsAlign === 'before' && <div {...viewProps}>{this.state.value}</div> }
182196
</div>
183197
)
184198
}
@@ -201,7 +215,8 @@ EdiText.defaultProps = {
201215
cancelButtonContent: '',
202216
saveButtonContent: '',
203217
editButtonContent: '',
204-
hideIcons: false
218+
hideIcons: false,
219+
buttonsAlign: 'after'
205220
}
206221

207222
EdiText.propTypes = {
@@ -239,5 +254,6 @@ EdiText.propTypes = {
239254
cancelButtonContent: PropTypes.any,
240255
saveButtonContent: PropTypes.any,
241256
editButtonContent: PropTypes.any,
242-
hideIcons: PropTypes.bool
257+
hideIcons: PropTypes.bool,
258+
buttonsAlign: PropTypes.oneOf(['after', 'before'])
243259
}

src/styles.css

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
}
3434
.Editext__buttons_container {
3535
display: flex;
36+
}
37+
.Editext__buttons_before_aligned {
38+
margin-right: 5px;
39+
}
40+
.Editext__buttons_after_aligned {
3641
margin-left: 5px;
3742
}
3843
.Editext__validation_message {

0 commit comments

Comments
 (0)