All Downloads are FREE. Search and download functionalities are using the official Maven repository.

components.widgets.Table.withCell.jsx Maven / Gradle / Ivy

The newest version!
import React, { useCallback, useContext, useRef } from 'react'
import { isEmpty, isEqual } from 'lodash'
import PropTypes from 'prop-types'

import { useDispatch } from '../../../core/Redux/useDispatch'
import { DataSourceContext } from '../../../core/widget/context'
import { useTableActions } from '../../Table'

/**
 * HOC для оборачивания Cell
 * Переопределяет свойство onClick в компонентах для посылки экшена
 * @param WrappedComponent
 * @returns {*}
 */
export default function WithCell(WrappedComponent) {
    function WithCellComponent({
        action: defaultAction,
        datasource,
        rowIndex,
        model,
        ...rest
    }) {
        const dispatch = useDispatch()
        const { onUpdateModel } = useTableActions()
        const { setResolve } = useContext(DataSourceContext)
        /**
         * FIXME:
         *  ref и проверка на равенство моделей является костылем т.к. Событие callAction стрелят например на клик
         *  по кнопки тулбара. Вероятно это ошибка и требуется разобраться с тем, когда должен стрелять метод callAction
         */
        const modelRef = useRef(model)

        modelRef.current = model

        const callAction = useCallback((actionModel) => {
            setResolve(actionModel)

            if (isEmpty(defaultAction) && !isEqual(actionModel, modelRef.current)) {
                onUpdateModel(actionModel, rowIndex)
            } else {
                dispatch(defaultAction)
            }
        }, [setResolve, defaultAction, onUpdateModel, rowIndex, dispatch])

        return (
            
        )
    }

    WithCellComponent.displayName = `withCellComponent(${WrappedComponent?.displayName || 'UnknownCellComponent'})`

    WithCellComponent.propTypes = {
        action: PropTypes.object,
        model: PropTypes.object,
        datasource: PropTypes.string.isRequired,
        dispatch: PropTypes.func,
        url: PropTypes.string,
        target: PropTypes.string,
    }

    WithCellComponent.displayName = 'WithCellComponent'

    return WithCellComponent
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy