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

components.buttons.ToggleColumn.ToggleColumn.jsx Maven / Gradle / Ivy

The newest version!
import React, { useEffect } from 'react'
import { useStore } from 'react-redux'
import PropTypes from 'prop-types'
import { UncontrolledButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'
import classNames from 'classnames'

import { useTableWidget } from '../../widgets/AdvancedTable'
import { getTableParam } from '../../../ducks/table/selectors'
import { VISIBLE_STATE, IS_DEFAULT_COLUMNS } from '../../../ducks/table/constants'
import { useReduxButton } from '../useReduxButton'

/**
 * Дропдаун для скрытия/показа колонок в таблице
 * @reactProps {string} entityKey - id виджета, размер которого меняется
 * @reactProps {array} columns - кологки(приходит из редакса)
 * @reactProps {string} defaultColumns - изначально видимые колонки (visibleState) (прим. 'id1,id2'), остальные скрываются
 * @example
 * 
 */

export const ToggleColumn = (props) => {
    const { icon, label, entityKey: widgetId, defaultColumns = '', nested = false } = props
    const { columnsState, changeColumnParam, switchTableParam } = useTableWidget()

    const { getState } = useStore()

    useEffect(() => {
        if (!defaultColumns || !columnsState.length) { return }

        const state = getState()
        const isDefaultColumns = getTableParam(widgetId, IS_DEFAULT_COLUMNS)(state)

        if (isDefaultColumns) { return }

        const defaultIds = defaultColumns.replace(/\s/g, '').split(',')

        for (const column of columnsState) {
            const { columnId } = column
            const visible = defaultIds.includes(columnId)

            changeColumnParam(widgetId, columnId, VISIBLE_STATE, visible)
        }

        switchTableParam(widgetId, IS_DEFAULT_COLUMNS)
    }, [columnsState.length])

    useReduxButton(props)

    function getLabel(label, icon, columnId) {
        if (!label && !icon) { return columnId }
        if (!label) { return null }

        return label
    }

    return (
        
            
{icon && } {label} {columnsState.map((column) => { const { columnId, label, icon, visible, visibleState } = column if (!visible) { return null } const currentLabel = getLabel(label, icon, columnId) const toggleVisibility = () => { /* visibleState - локальная видимость колонки, переключаемая в ToggleColumn visible - влияет на общую видимость колонки и соответствующей кнопки переключения в ToggleColumn */ changeColumnParam(widgetId, columnId, 'visibleState', !visibleState) } return ( {visibleState &&