feat(xo-web): ActionButton accept data-* props instead of handlerParam (#2713)
This commit is contained in:
parent
1947a066e0
commit
8ad02d2d51
@ -1,5 +1,5 @@
|
|||||||
import isFunction from 'lodash/isFunction'
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
import { isFunction, startsWith } from 'lodash'
|
||||||
|
|
||||||
import Button from './button'
|
import Button from './button'
|
||||||
import Component from './base-component'
|
import Component from './base-component'
|
||||||
@ -27,6 +27,9 @@ import { error as _error } from './notification'
|
|||||||
handler: propTypes.func.isRequired,
|
handler: propTypes.func.isRequired,
|
||||||
|
|
||||||
// optional value which will be passed as first param to the handler
|
// optional value which will be passed as first param to the handler
|
||||||
|
//
|
||||||
|
// if you need multiple values, you can provide `data-*` props instead of
|
||||||
|
// `handlerParam`
|
||||||
handlerParam: propTypes.any,
|
handlerParam: propTypes.any,
|
||||||
|
|
||||||
// XO icon to use for this button
|
// XO icon to use for this button
|
||||||
@ -50,11 +53,30 @@ export default class ActionButton extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _execute () {
|
async _execute () {
|
||||||
if (this.props.pending || this.state.working) {
|
const { props } = this
|
||||||
|
|
||||||
|
if (props.pending || this.state.working) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const { children, handler, handlerParam, tooltip } = this.props
|
const { children, handler, tooltip } = props
|
||||||
|
|
||||||
|
let handlerParam
|
||||||
|
if ('handlerParam' in props) {
|
||||||
|
handlerParam = props.handlerParam
|
||||||
|
} else {
|
||||||
|
let empty = true
|
||||||
|
handlerParam = {}
|
||||||
|
Object.keys(props).forEach(key => {
|
||||||
|
if (startsWith(key, 'data-')) {
|
||||||
|
empty = false
|
||||||
|
handlerParam[key.slice(5)] = props[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (empty) {
|
||||||
|
handlerParam = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.setState({
|
this.setState({
|
||||||
@ -64,7 +86,7 @@ export default class ActionButton extends Component {
|
|||||||
|
|
||||||
const result = await handler(handlerParam)
|
const result = await handler(handlerParam)
|
||||||
|
|
||||||
const { redirectOnSuccess } = this.props
|
const { redirectOnSuccess } = props
|
||||||
if (redirectOnSuccess) {
|
if (redirectOnSuccess) {
|
||||||
return this.context.router.push(
|
return this.context.router.push(
|
||||||
isFunction(redirectOnSuccess)
|
isFunction(redirectOnSuccess)
|
||||||
|
Loading…
Reference in New Issue
Block a user