• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@mui/x-data-grid 에 사용자정의 컬럼 타입을 추가해서 사용하려고 합니다.

22.11.02 13:49 작성 조회수 1.94k

0

 

@mui/x-data-grid 패키지를 사용해서 type= "time" 을 추가 해 보려고 합니다.

 

검색을 해보니 공식문서에서는 커스터마이징 해서 사용할수있다고 하는 글을 보았습니다.

제가 필요한 time picker 부분을 추가하는 부분은 찾지 못했습니다. ㅠ.ㅠ

https://mui.com/x/react-data-grid/column-definition/#custom-column-types

 

@mui/x-data-grid 에서 기본 제공하는 타입들은 아래와 같습니다.

  • 'string' (default)

  • 'number'

  • 'date'

  • 'dateTime'

  • 'boolean'

  • 'singleSelect'

  • 'actions'

 

위에 보시다 시피 'time' 이 없습니다... ㅠ.ㅠ

 

구글링 해보니 아래 부분에

https://github.com/mui/mui-x/issues/5421 글에서

스크린샷 2022-11-02 오전 11.33.35.png7월12일에 time 열이 추가 되었다고 하는것 같은데..

관련된 파일이 아래 gridDateColDef.ts, gridDateOperators.ts 두가지 파일로 보이며

커스터마이징이 필요할것을 보여집니다.

https://github.com/mui/mui-x/blob/master/packages/grid/x-data-grid/src/colDef/gridDateColDef.ts

import { gridDateComparator } from '../hooks/features/sorting/gridSortingUtils';
import { getGridDateOperators } from './gridDateOperators';
import { GRID_STRING_COL_DEF } from './gridStringColDef';
import { GridColTypeDef } from '../models/colDef/gridColDef';
import { renderEditDateCell } from '../components/cell/GridEditDateCell';
import { GridValueFormatterParams } from '../models/params/gridCellParams';

export function gridDateFormatter({ value }: GridValueFormatterParams<Date | string>) {
  if (value instanceof Date) {
    return value.toLocaleDateString();
  }
  return value ?? '';
}

export function gridDateTimeFormatter({ value }: GridValueFormatterParams<Date | string>) {
  if (value instanceof Date) {
    return value.toLocaleString();
  }
  return value ?? '';
}

export const GRID_DATE_COL_DEF: GridColTypeDef<Date | string, string> = {
  ...GRID_STRING_COL_DEF,
  type: 'date',
  sortComparator: gridDateComparator,
  valueFormatter: gridDateFormatter,
  filterOperators: getGridDateOperators(),
  renderEditCell: renderEditDateCell,
  getApplyQuickFilterFn: undefined,
};

export const GRID_DATETIME_COL_DEF: GridColTypeDef<Date | string, string> = {
  ...GRID_STRING_COL_DEF,
  type: 'dateTime',  <======= 이 타이블 수정
  sortComparator: gridDateComparator,
  valueFormatter: gridDateTimeFormatter,
  filterOperators: getGridDateOperators(true),
  renderEditCell: renderEditDateCell,
  getApplyQuickFilterFn: undefined,
};

 

colDef 폴더에 gridDateColDef.ts 파일에서는 type 이 time 인 컬럼 속성은 보이지 않습니다.

 

mui x data grid 예시 파일을 열어서 아래

https://codesandbox.io/s/d13q7i?file=/demo.tsx

 

import * as React from "react";
import Box from "@mui/material/Box";
import { DataGrid, GridColTypeDef } from "@mui/x-data-grid";
import {
  randomStatusOptions,
  randomPrice,
  randomCreatedDate
} from "@mui/x-data-grid-generator";

const rows = [
  {
    id: 1,
    status: randomStatusOptions(),
    subTotal: randomPrice(),
    total: randomPrice(),
    date: randomCreatedDate(),
    time: "05:45"
  },
  {
    id: 2,
    status: randomStatusOptions(),
    subTotal: randomPrice(),
    total: randomPrice(),
    date: randomCreatedDate(),
    time: "05:45"
  },
  {
    id: 3,
    status: randomStatusOptions(),
    subTotal: randomPrice(),
    total: randomPrice(),
    date: randomCreatedDate(),
    time: "05:45"
  }
];

const currencyFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD"
});

const usdPrice: GridColTypeDef = {
  type: "number",
  width: 200,

  valueFormatter: ({ value }) => currencyFormatter.format(value),
  cellClassName: "font-tabular-nums"
};


export default function CustomColumnTypesGrid() {
  return (
    <Box
      sx={{
        height: 300,
        width: "100%",
        "& .font-tabular-nums": {
          fontVariantNumeric: "tabular-nums"
        }
      }}
    >
      <DataGrid
        columns={[
          { field: "status", width: 130 },
          { field: "subTotal", ...usdPrice, editable: true },
          { field: "total", ...usdPrice },
          { field: "time", editable: true },
          { field: "date", type: "dateTime", width: 200, editable: true }
        ]}
        rows={rows}
      />
    </Box>
  );
}

 

      <DataGrid
        columns={[
          { field: "status", width: 130 },
          { field: "subTotal", ...usdPrice, editable: true },
          { field: "total", ...usdPrice },
          { field: "time", editable: true },
          { field: "date", type: "dateTime", width: 200, editable: true }
        ]}
        rows={rows}
      />

스크린샷 2022-11-02 오후 1.38.41.png

스크린샷 2022-11-02 오후 12.10.29.png스크린샷 2022-11-02 오후 12.10.48.png

 

 

스크린샷 2022-11-02 오후 1.33.03.png

위에 일자와 시간을 선택할수 있는 셀렉터를

 

아래 time picker 만 나오도록 custumizing 할수 있는 팁을 주실수 있을까요?

스크린샷 2022-11-02 오후 1.41.00.png

 

 

 

답변 1

답변을 작성해보세요.

0

상준님의 프로필

상준

2023.01.06

어쩌다보니 구글링해서 여기를 오게되어서 댓글 남깁니다.

js에서는 time이라는 오브젝트는 없다보니 Date로 하는 것이 일반적인 표준인 것 같습니다.

https://codesandbox.io/s/upbeat-liskov-kq6bnq?file=/demo.tsx

문제를 해결해본 코드샌드박스입니다.

공식 문서를 참조하시면 좋을 것 같습니다.

https://mui.com/x/react-data-grid/editing/

 

팁 감사합니다.^^
커스텀으로 만들어 주어야 하는군요..

상준님의 프로필

상준

2023.01.06

네, 꽤 오래지났는데 확인하시네요 ㅎ 코드샌드박스 디펜던시 오류났길래 고쳐놨습니다.

감사합니다.^^