devextreme-planit-treegrid-react 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,597 @@
1
+ import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
2
+
3
+ import { LoadPanel } from 'devextreme-react/load-panel';
4
+
5
+ import PivotGrid, { FieldChooser } from 'devextreme-react/pivot-grid';
6
+ import { StateStoring } from 'devextreme-react/data-grid';
7
+ import DevExpress from 'devextreme';
8
+ import { IColorInfo, IGroupField } from './type';
9
+ import { exportPivotGrid } from 'devextreme/excel_exporter';
10
+ import { Workbook } from 'exceljs';
11
+ import saveAs from 'file-saver';
12
+ import PivotGridDataSource from 'devextreme/ui/pivot_grid/data_source';
13
+
14
+ interface ColumnField {
15
+ colspan: number;
16
+ text: string;
17
+ type: string;
18
+ }
19
+
20
+ interface Props extends DevExpress.ui.dxPivotGrid.Properties {
21
+ id?: string;
22
+ dataSource?: any;
23
+ groupField?: IGroupField[];
24
+ dataColor?: IColorInfo[];
25
+ convertNullToHipen?: boolean;
26
+ convertZeroToHipen?: boolean;
27
+ stateStoringKey?: string;
28
+ customExcelButton?: boolean;
29
+ }
30
+
31
+ /**
32
+ * devextreme pivotgrid Configrations 중 사용 불가 항목 : id, width, height, showColumnGrandTotals, showColumnTotals, showRowGrandTotals, FieldChooser
33
+ * devextreme pivotgrid Configrations 중 사용 방법 변경 항목 : stateStoring, Export
34
+ * onExported, onFileSaving 이벤트 사용하지 않음.
35
+ */
36
+ /**
37
+ * todoList:
38
+ * 2) columIndex 초기화 기능이 있어야 함(column 개수 변할 때)
39
+ * 3) 헤더에 테이블 삽입되면서 그리드 크기가 늘어남. height에 그리드 크기 늘어난 만큼 반영되어야 함.
40
+ */
41
+
42
+ const grandTotalCssNm = 'data-grand-total';
43
+
44
+ const DxPlanitTreeGrid = forwardRef(
45
+ (props: Props, ref: any): JSX.Element => {
46
+ const {
47
+ id = 'dx-planit-vera-pivotgrid-id',
48
+ groupField,
49
+ dataColor,
50
+ convertNullToHipen = true,
51
+ convertZeroToHipen = true,
52
+ stateStoringKey = '',
53
+ allowExpandAll = false,
54
+ allowFiltering = false,
55
+ allowSorting = false,
56
+ allowSortingBySummary = false,
57
+ dataFieldArea = 'column',
58
+ dataSource,
59
+ disabled = false,
60
+ elementAttr,
61
+ encodeHtml,
62
+ hideEmptySummaryCells = false,
63
+ hint,
64
+ rowHeaderLayout = 'standard',
65
+ rtlEnabled = false,
66
+ showBorders = true,
67
+ showRowTotals = true,
68
+ showTotalsPrior = 'none',
69
+ tabIndex = 0,
70
+ visible = true,
71
+ wordWrapEnabled = false,
72
+ customExcelButton = false,
73
+ onCellClick,
74
+ onCellPrepared,
75
+ onContentReady,
76
+ onContextMenuPreparing,
77
+ onDisposing,
78
+ onExporting,
79
+ onInitialized,
80
+ onOptionChanged,
81
+ } = props;
82
+
83
+ const [width, setWidth] = useState(0);
84
+ const [height, setHeight] = useState(0);
85
+ const [columnIndex, setColumnIndex] = useState(0);
86
+ const [gridDataSource, setGridDataSource] = useState<PivotGridDataSource>(dataSource);
87
+
88
+ const $tableRef = useRef<PivotGrid>(null);
89
+ const excelBorder = { style: 'thin', color: { argb: 'FF7E7E7E' } };
90
+
91
+ useImperativeHandle(ref, () => ({
92
+ exportToExcel,
93
+ }));
94
+
95
+ /**
96
+ * 그리드 사이즈 재조정
97
+ * @returns 그리드 사이즈
98
+ */
99
+ const getGridSize = (): { width: number; height: number } => {
100
+ const wrapper = document.querySelector('.diag-table-wrapper');
101
+ const gap = 10;
102
+ setWidth(wrapper?.clientWidth ?? 0);
103
+ setHeight(wrapper ? wrapper.clientHeight - gap : 0);
104
+
105
+ window.addEventListener('resize', () => {
106
+ setWidth(wrapper?.clientWidth ?? 0);
107
+ setHeight(wrapper ? wrapper.clientHeight - gap : 0);
108
+ });
109
+ return { width, height };
110
+ };
111
+
112
+ /**
113
+ * 'Total' 을 한글로 변경
114
+ * @param e devextreme CellPreparedEvent
115
+ */
116
+ const changeTotalText = (e: DevExpress.ui.dxPivotGrid.CellPreparedEvent): void => {
117
+ if (!e.cellElement) {
118
+ return;
119
+ }
120
+ if (e.cell?.type === 'T') {
121
+ const text = e.cell.text?.replace('Total', '합계');
122
+ e.cellElement.innerHTML = `<span>${text}</span>`;
123
+ }
124
+ };
125
+
126
+ /**
127
+ * null값을 하이픈으로 모두 변경
128
+ * @param e devextreme CellPreparedEvent
129
+ */
130
+ const changeNullToHipen = (e: DevExpress.ui.dxPivotGrid.CellPreparedEvent): void => {
131
+ if (!convertNullToHipen) {
132
+ return;
133
+ }
134
+ if (e.area === 'data' && e.cell?.text === null && e.cellElement) {
135
+ e.cellElement.innerHTML = '<span class="text-color">-</span>';
136
+ }
137
+ };
138
+
139
+ /**
140
+ * '0', '0.0%' 를 하이픈으로 모두 변경
141
+ * @param e devextreme CellPreparedEvent
142
+ */
143
+ const changeZeroToHipen = (e: DevExpress.ui.dxPivotGrid.CellPreparedEvent): void => {
144
+ if (!convertZeroToHipen) {
145
+ return;
146
+ }
147
+ if (e.area === 'data' && (e.cell?.text === '0' || e.cell?.text === '0.0%' || e.cell?.text === '') && e.cellElement) {
148
+ e.cellElement.innerHTML = '<span class="text-color">-</span>';
149
+ }
150
+ };
151
+
152
+ /**
153
+ * 테이블 헤더에 colspan, rowspan 한 HTMLElement 정보 반환
154
+ * @param groupField 사용자가 작성한 그룹 정보
155
+ * @return
156
+ */
157
+ const makeColspan = (group: IGroupField, index: number, isLast: boolean): HTMLElement => {
158
+ const td = document.createElement('td');
159
+ let text = group.groupCaption;
160
+
161
+ if (group.depth === 1) {
162
+ text = `${group.groupCaption}`;
163
+ }
164
+
165
+ td.setAttribute('colspan', group.colspan.toString());
166
+ td.setAttribute('class', 'dx-row-total dx-grand-total dx-planit-colspan');
167
+
168
+ if (isLast && index === 0) {
169
+ td.setAttribute('style', 'border-bottom: 0; border-right: 0');
170
+ } else if (isLast && index !== 0) {
171
+ td.setAttribute('style', 'border-right: 0');
172
+ } else if (!isLast && index === 0) {
173
+ td.setAttribute('style', 'border-bottom: 0');
174
+ }
175
+ td.innerHTML = `<div>${text}</div>`;
176
+
177
+ return td;
178
+ };
179
+
180
+ /**
181
+ * 그룹 필드 데이터 유효성 검증용 데이터 생성
182
+ * @param groupField
183
+ * @returns
184
+ */
185
+ const makeCheckGroupData = (groupField: IGroupField[]): any => {
186
+ const data: any = {};
187
+
188
+ groupField?.forEach((group: IGroupField) => {
189
+ if (data[group.depth]) {
190
+ data[group.depth] += group.colspan;
191
+ } else {
192
+ data[group.depth] = group.colspan;
193
+ }
194
+ });
195
+
196
+ return data;
197
+ };
198
+
199
+ /**
200
+ * GroupField 데이터 검증
201
+ * @param 사용자가 설정한 그룹 필드 정보
202
+ * @returns 데이터 검증 결과
203
+ */
204
+ const isCheckGroupField = (groupField: IGroupField[]): boolean => {
205
+ const map = makeCheckGroupData(groupField);
206
+
207
+ for (const depth of Object.keys(map)) {
208
+ if (map[depth] !== columnIndex + 1) {
209
+ console.error('그룹 데이터의 children 숫자가 columnIndex와 맞지 않습니다. 다시 한 번 확인 바랍니다.');
210
+ }
211
+ }
212
+
213
+ return true;
214
+ };
215
+
216
+ /**
217
+ * Grand Total 셀 정보 저장
218
+ * @param e
219
+ */
220
+ const setTotalElementInfo = (e: DevExpress.ui.dxPivotGrid.CellPreparedEvent): void => {
221
+ if (!groupField?.length || e.cell?.type !== 'GT' || e.cell?.text !== 'Grand Total') {
222
+ return;
223
+ }
224
+
225
+ e.cellElement?.classList.add(grandTotalCssNm);
226
+ };
227
+
228
+ /**
229
+ * cell의 columnIndex 최대값 저장
230
+ * @param e
231
+ */
232
+ const setMaxColumIndex = (e: DevExpress.ui.dxPivotGrid.CellPreparedEvent): void => {
233
+ if (!e.columnIndex) {
234
+ return;
235
+ }
236
+ if (e.columnIndex > columnIndex) {
237
+ setColumnIndex(e.columnIndex);
238
+ }
239
+ };
240
+
241
+ /**
242
+ * groupField depth의 유니크한 배열 구하기
243
+ * @param group
244
+ * @param arr
245
+ * @returns
246
+ */
247
+ const getGroupDepth = (group: IGroupField[], arr: 'asc' | 'desc'): number[] => {
248
+ const groupData = group.slice();
249
+ const set = new Set(groupData.map((group: IGroupField) => group.depth));
250
+ return Array.from(set).sort(function compare(a: number, b: number) {
251
+ if (a > b) {
252
+ return arr === 'asc' ? -1 : 1;
253
+ }
254
+ if (a < b) {
255
+ return arr === 'asc' ? 1 : -1;
256
+ }
257
+ return 0;
258
+ });
259
+ };
260
+
261
+ /**
262
+ * 현재 depth에 맞는 그룹 필드 정보 반환
263
+ * @param group
264
+ * @param depth
265
+ * @returns
266
+ */
267
+ const getCurrentGroup = (group: IGroupField[], depth: number): IGroupField[] => {
268
+ return group.filter((gr: IGroupField) => gr.depth === depth);
269
+ };
270
+
271
+ /**
272
+ * 테이블 헤더(DOM)에 colspan 적용된 테이블 삽입
273
+ */
274
+ const insertRowHeaderGroup = (): void => {
275
+ if (!groupField?.length) {
276
+ return;
277
+ }
278
+
279
+ isCheckGroupField(groupField);
280
+
281
+ const totalElement = document.querySelector('.' + grandTotalCssNm);
282
+ const targetElement = totalElement?.parentNode;
283
+ const thead = targetElement?.parentNode;
284
+
285
+ if (!targetElement || !thead) {
286
+ return;
287
+ }
288
+
289
+ const firstChild = thead?.firstChild;
290
+ if (!firstChild) {
291
+ return;
292
+ }
293
+ totalElement.innerHTML = '';
294
+ totalElement.setAttribute('style', 'padding: 0; border: 0');
295
+ const colgroup = thead.previousSibling?.cloneNode(true);
296
+
297
+ const groupData = groupField.slice();
298
+ const depth = getGroupDepth(groupData, 'asc');
299
+
300
+ const table = document.createElement('table');
301
+
302
+ depth.forEach((dep: number, index: number) => {
303
+ const groupInfo = getCurrentGroup(groupData, dep);
304
+
305
+ const tr = document.createElement('tr');
306
+
307
+ groupInfo.forEach((group: IGroupField, cellIndex: number) => {
308
+ const isLast = cellIndex === groupInfo.length - 1 ? true : false;
309
+ tr.appendChild(makeColspan(group, index, isLast));
310
+ });
311
+ (table as HTMLElement).prepend(tr);
312
+ });
313
+
314
+ table.prepend(colgroup as Node);
315
+ totalElement.appendChild(table);
316
+ };
317
+
318
+ /**
319
+ * Devextreme의 dateController columnInfo에 그룹 정보 삽입
320
+ * @param group
321
+ * @returns
322
+ */
323
+ const makeDataControllerColumnGroup = (group: IGroupField[]): ColumnField[][] => {
324
+ const groupData = group.slice();
325
+ const depth = getGroupDepth(groupData, 'desc');
326
+
327
+ return depth.map((dep: number) => {
328
+ const groupInfo = getCurrentGroup(groupData, dep);
329
+ return groupInfo.map((group: IGroupField) => ({ colspan: group.colspan, text: group.groupCaption, type: 'GT' }));
330
+ });
331
+ };
332
+
333
+ /**
334
+ * 사용자가 입력한 컬러 조건을 { standard: string; condition: string } 형식으로 변경 반환
335
+ * @param condition 사용자 입력 컬러 조건식 ex) '>= 100'
336
+ * @returns
337
+ */
338
+ const makeSplitCondtion = (condition: string): { standard: string; condition: string } => {
339
+ const newCondition = { standard: '', condition: '' };
340
+ [...condition].forEach((cond: string) => {
341
+ if (Number.isNaN(parseFloat(cond))) {
342
+ newCondition.condition += cond;
343
+ } else {
344
+ newCondition.standard += cond;
345
+ }
346
+ });
347
+
348
+ return newCondition;
349
+ };
350
+
351
+ /**
352
+ * 데이터에 색상 적용
353
+ * @param e onCellPrepared 이벤트
354
+ * @returns
355
+ */
356
+ const makeColorAtPercent = (e: any): void => {
357
+ if (!dataColor || !e.cellElement) {
358
+ return;
359
+ }
360
+
361
+ dataColor.forEach((color: IColorInfo) => {
362
+ if (e.cell.value === null) {
363
+ return;
364
+ }
365
+ if (e.cell?.format?.type === color.format && !Number.isNaN(e.cell.value)) {
366
+ const standardData = makeSplitCondtion(color.condition.replace(/(\s*)/g, ''));
367
+ const rate = color.format === 'percent' ? 0.01 : 1;
368
+ let condition = false;
369
+
370
+ switch (standardData.condition) {
371
+ case '>':
372
+ condition = e.cell.value > parseFloat(standardData.standard) * rate;
373
+ break;
374
+ case '>=':
375
+ condition = e.cell.value >= parseFloat(standardData.standard) * rate;
376
+ break;
377
+ case '<':
378
+ condition = e.cell.value < parseFloat(standardData.standard) * rate;
379
+ break;
380
+ case '<=':
381
+ condition = e.cell.value <= parseFloat(standardData.standard) * rate;
382
+ break;
383
+ }
384
+
385
+ if (condition && !(e.cell.value === 0 && convertZeroToHipen)) {
386
+ e.cellElement.style.color = color.color;
387
+ }
388
+ }
389
+ });
390
+ };
391
+
392
+ /**
393
+ * 그리드 데이터 정합성 체크. 데이터 잘못되어 있으면 에러 발생
394
+ * @param dataSource
395
+ */
396
+ const checkDataSource = (dataSource: any): void => {
397
+ const isColumns = dataSource._fields.findIndex((field: any) => field.area === 'column');
398
+ const isRows = dataSource._fields.findIndex((field: any) => field.area === 'row');
399
+ const isDatas = dataSource._fields.findIndex((field: any) => field.area === 'data');
400
+
401
+ if (isColumns > -1) {
402
+ throw Error('DxPlanitTreeGrid는 column이 존재하는 형식의 pivot grid에는 사용할 수 없습니다.');
403
+ }
404
+
405
+ if (isRows === -1 || isDatas === -1) {
406
+ throw Error('DxPlanitTreeGrid 데이터는 row와 data가 반드시 존재해야 합니다.');
407
+ }
408
+ };
409
+
410
+ /**
411
+ * 그리드 펼침 정보 세션스토리지 리셋
412
+ */
413
+ const resetSession = (): void => {
414
+ sessionStorage.removeItem('dx-vera-pivotgrid-storing');
415
+ };
416
+
417
+ /**
418
+ * 엑셀 export 명령
419
+ * @param fileName 저장하고자 하는 엑셀파일명
420
+ */
421
+ const exportToExcel = (fileName: string): void => {
422
+ setTimeout(() => exportToExcelAction($tableRef.current?.instance, fileName));
423
+ };
424
+
425
+ /**
426
+ * devextreme component 정보의 dataController의 columnInfo에 사용자가 설정한 groupFIled 정보 병합
427
+ * @param component devextreme component
428
+ * @returns devextreme component
429
+ */
430
+ const convertDataControllerColumnsInfo = (component: any): any => {
431
+ let arr: ColumnField[][] = [];
432
+ const columnInfo = component._dataController._columnsInfo.forEach((column: ColumnField[]) => {
433
+ let newColumn = column.slice();
434
+ if (groupField && newColumn.length === 1 && newColumn[0].type === 'GT' && newColumn[0].text === 'Grand Total') {
435
+ arr.push(...makeDataControllerColumnGroup(groupField));
436
+ } else {
437
+ arr.push(newColumn);
438
+ }
439
+ });
440
+ component._dataController._columnsInfo = arr;
441
+ return component;
442
+ };
443
+
444
+ /**
445
+ * 엑셀 export
446
+ * @param e
447
+ */
448
+ const exportToExcelAction = (e: any, fileName: string): void => {
449
+ const newComponent = convertDataControllerColumnsInfo(e);
450
+
451
+ const workbook = new Workbook();
452
+ const worksheet = workbook.addWorksheet(fileName);
453
+
454
+ exportPivotGrid({
455
+ component: newComponent,
456
+ worksheet,
457
+ customizeCell: ({ excelCell }) => {
458
+ const borderStyle = excelBorder;
459
+ excelCell.border = {
460
+ bottom: borderStyle,
461
+ left: borderStyle,
462
+ right: borderStyle,
463
+ top: borderStyle,
464
+ };
465
+ },
466
+ }).then(() => {
467
+ workbook.xlsx.writeBuffer().then(buffer => {
468
+ saveAs(new Blob([buffer], { type: 'application/octet-stream' }), fileName + '.xlsx');
469
+ });
470
+ });
471
+ e.cancel = true;
472
+ };
473
+
474
+ /**
475
+ * devextreme CellPreparedEvent 이벤트 실행
476
+ * @param e
477
+ */
478
+ const onCellPreparedChild = (
479
+ e: DevExpress.ui.dxPivotGrid.CellPreparedEvent
480
+ ): ((e: DevExpress.ui.dxPivotGrid.CellPreparedEvent) => void) | void => {
481
+ makeColorAtPercent(e);
482
+ setTotalElementInfo(e);
483
+ setMaxColumIndex(e);
484
+ changeTotalText(e);
485
+ changeNullToHipen(e);
486
+ changeZeroToHipen(e);
487
+
488
+ return onCellPrepared ? onCellPrepared(e) : undefined;
489
+ };
490
+
491
+ /**
492
+ * devextreme Raise Event
493
+ */
494
+ const onContentReadyChild = (
495
+ e: DevExpress.ui.dxPivotGrid.ContentReadyEvent
496
+ ): ((e: DevExpress.ui.dxPivotGrid.ContentReadyEvent) => void) | void => {
497
+ setTimeout(() => insertRowHeaderGroup(), 0);
498
+ getGridSize();
499
+
500
+ return onContentReady ? onContentReady(e) : undefined;
501
+ };
502
+
503
+ const onCellClickChild = (
504
+ e: DevExpress.ui.dxPivotGrid.CellClickEvent
505
+ ): ((e: DevExpress.ui.dxPivotGrid.CellClickEvent) => void) | void => {
506
+ return onCellClick ? onCellClick(e) : undefined;
507
+ };
508
+
509
+ const onContextMenuPreparingChild = (
510
+ e: DevExpress.ui.dxPivotGrid.ContextMenuPreparingEvent
511
+ ): ((e: DevExpress.ui.dxPivotGrid.ContextMenuPreparingEvent) => void) | void => {
512
+ return onContextMenuPreparing ? onContextMenuPreparing(e) : undefined;
513
+ };
514
+
515
+ const onDisposingChild = (
516
+ e: DevExpress.ui.dxPivotGrid.DisposingEvent
517
+ ): ((e: DevExpress.ui.dxPivotGrid.DisposingEvent) => void) | void => {
518
+ return onDisposing ? onDisposing(e) : undefined;
519
+ };
520
+
521
+ const onExportingChild = (
522
+ e: DevExpress.ui.dxPivotGrid.ExportingEvent
523
+ ): ((e: DevExpress.ui.dxPivotGrid.ExportingEvent) => void) | void => {
524
+ return onExporting ? onExporting(e) : undefined;
525
+ };
526
+
527
+ const onInitializedChild = (
528
+ e: DevExpress.ui.dxPivotGrid.InitializedEvent
529
+ ): ((e: DevExpress.ui.dxPivotGrid.InitializedEvent) => void) | void => {
530
+ return onInitialized ? onInitialized(e) : undefined;
531
+ };
532
+
533
+ const onOptionChangedChild = (
534
+ e: DevExpress.ui.dxPivotGrid.OptionChangedEvent
535
+ ): ((e: DevExpress.ui.dxPivotGrid.OptionChangedEvent) => void) | void => {
536
+ return onOptionChanged ? onOptionChanged(e) : undefined;
537
+ };
538
+
539
+ useEffect(() => {
540
+ if (customExcelButton) {
541
+ }
542
+ }, [customExcelButton]);
543
+
544
+ useEffect(() => {
545
+ setGridDataSource(dataSource);
546
+ checkDataSource(dataSource);
547
+ resetSession();
548
+ }, [dataSource]);
549
+
550
+ return (
551
+ <div>
552
+ <LoadPanel position={{ of: id }} />
553
+ <PivotGrid
554
+ id={id}
555
+ ref={$tableRef}
556
+ dataSource={gridDataSource}
557
+ showColumnTotals={false}
558
+ showColumnGrandTotals={true}
559
+ showRowGrandTotals={false}
560
+ width={width}
561
+ height={height}
562
+ allowExpandAll={allowExpandAll}
563
+ allowFiltering={allowFiltering}
564
+ allowSorting={allowSorting}
565
+ allowSortingBySummary={allowSortingBySummary}
566
+ dataFieldArea={dataFieldArea}
567
+ disabled={disabled}
568
+ elementAttr={elementAttr}
569
+ encodeHtml={encodeHtml}
570
+ hideEmptySummaryCells={hideEmptySummaryCells}
571
+ hint={hint}
572
+ rowHeaderLayout={rowHeaderLayout}
573
+ rtlEnabled={rtlEnabled}
574
+ showBorders={showBorders}
575
+ showRowTotals={showRowTotals}
576
+ showTotalsPrior={showTotalsPrior}
577
+ tabIndex={tabIndex}
578
+ visible={visible}
579
+ wordWrapEnabled={wordWrapEnabled}
580
+ onCellClick={onCellClickChild}
581
+ onContentReady={onContentReadyChild}
582
+ onCellPrepared={onCellPreparedChild}
583
+ onContextMenuPreparing={onContextMenuPreparingChild}
584
+ onDisposing={onDisposingChild}
585
+ onExporting={onExportingChild}
586
+ onInitialized={onInitializedChild}
587
+ onOptionChanged={onOptionChangedChild}
588
+ >
589
+ <StateStoring enabled={stateStoringKey?.length} type="sessionStorage" storageKey={stateStoringKey} />
590
+ <FieldChooser enabled={false} />
591
+ </PivotGrid>
592
+ </div>
593
+ );
594
+ }
595
+ );
596
+
597
+ export default DxPlanitTreeGrid;
package/dist/type.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Format } from 'devextreme/localization';
2
+
3
+ export interface IGroupField {
4
+ groupCaption: string;
5
+ groupName?: string;
6
+ depth: number;
7
+ colspan: number;
8
+ }
9
+
10
+ export interface IColorInfo {
11
+ format: Format;
12
+ color: string;
13
+ condition: string;
14
+ }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "devextreme-planit-treegrid-react",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Devextreme의 DxPivotGrid를 Tree Grid처럼 보여주는 Wrapper입니다.",
5
5
  "main": "dist/DxPlanitTreeGrid.js",
6
6
  "types": "dist/type.d.ts",
7
7
  "files": [
8
- "dist/index.tsx",
8
+ "dist",
9
9
  "README.md"
10
10
  ],
11
11
  "repository": "https://github.com/hsquare-analytics/ui-tree-grid.git",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "devextreme": "^22.1.6",
50
- "devextreme-planit-tree-grid-react": "^0.0.2",
50
+ "devextreme-planit-treegrid-react": "^0.0.1",
51
51
  "devextreme-react": "^22.1.6",
52
52
  "exceljs": "^4.3.0",
53
53
  "file-saver": "^2.0.5",