Skip to content

[usePinColumns] Ability to pin columns #1509

@gargroh

Description

@gargroh

Using v7?

Hi @tannerlinsley, wanted to check is there any plan to implement a react table hook for pinning(freezing) of columns to left/right of table.

I have a following rough structure of usePinColumns hook, any advise on architecture or implementation(which you have thought of) for the implementation of this functionality will be helpful to complete this.

usePinColumns.js

import PropTypes from 'prop-types';

import { mergeProps, applyPropHooks, ensurePluginOrder } from '../utils';
import { addActions, actions } from '../actions';
import { defaultState } from '../hooks/useTableState';

defaultState.pinnedColumns = {
  left: [],
  center: [],
  right: []
};

addActions('setColumnPin');

const propTypes = {};

export const usePinColumns = (hooks) => {
  hooks.useMain.push(useMain);
};

usePinColumns.pluginName = 'usePinColumns';

function useMain(instance) {
  PropTypes.checkPropTypes(propTypes, instance, 'property', 'usePinColumns');

  const {
    hooks,
    plugins,
    flatColumns,
    state: [{ pinnedColumns }, setState]
  } = instance;

  ensurePluginOrder(plugins, [], 'usePinColumns', []);

  const setColumnPin = (columnID, pinType) => {
    // debugger;
    const column = flatColumns.find((d) => d.id === columnID);
    console.log(column.pinned);
    column.pinned = pinType;
    console.log(column.pinned);

    // -1 = LEFT
    // 0 = CENTER
    // 1 = RIGHT

    let newPinnedColumns = {};
    newPinnedColumns.left = [];
    newPinnedColumns.right = [];
    newPinnedColumns.center = [];

    flatColumns.forEach((column) => {
      if (column.pinned === -1) {
        newPinnedColumns.left.push(column);
      } else if (column.pinned === 1) {
        newPinnedColumns.right.push(column);
      } else {
        newPinnedColumns.center.push(column);
      }
    });

    return setState((old) => {
      return {
        ...old,
        flatColumns: flatColumns,
        pinnedColumns: newPinnedColumns
      };
    }, actions.setColumnPin);
  };

  flatColumns.forEach((column) => {
    column.canPin = true;
    // column.pinned = 0;
    column.setColumnPin = (pinType) => setColumnPin(column.id, pinType);
  });

  return {
    ...instance,
    setColumnPin
  };
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions