@ceed/ads 1.26.0 → 1.27.0

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.
@@ -5,7 +5,7 @@ export declare function useColumnWidths<T>(columnsByField: {
5
5
  headerRef: React.RefObject<HTMLTableCellElement>;
6
6
  };
7
7
  }): Record<string, number>;
8
- export declare function useDataTableRenderer<T extends Record<PropertyKey, unknown>, GetId extends ((row: T) => any) | undefined = undefined>({ rows: _rows, columns: columnsProp, pinnedColumns, rowCount: totalRowsProp, initialState, pagination, paginationMode, paginationModel, onPaginationModelChange, sortModel: controlledSortModel, sortOrder: _sortOrder, selectionModel, onSortModelChange, onSelectionModelChange, editMode, getId: _getId, isTotalSelected: _isTotalSelected, isRowSelectable, columnGroupingModel, }: DataTableProps<T, GetId>): {
8
+ export declare function useDataTableRenderer<T extends Record<PropertyKey, unknown>, GetId extends ((row: T) => any) | undefined = undefined>({ rows: _rows, columns: columnsProp, pinnedColumns, rowCount: totalRowsProp, initialState, pagination, paginationMode, paginationModel, onPaginationModelChange, sortModel: controlledSortModel, sortOrder: _sortOrder, selectionModel, onSortModelChange, onSelectionModelChange, editMode, getId: _getId, isTotalSelected: _isTotalSelected, isRowSelectable, columnGroupingModel, columnVisibilityModel, onColumnVisibilityModelChange, }: DataTableProps<T, GetId>): {
9
9
  rowCount: number;
10
10
  selectableRowCount: number;
11
11
  page: number;
@@ -148,6 +148,7 @@ export type ActionsColumnDef<T extends Record<PropertyKey, string>, ID> = BaseCo
148
148
  }) => ReactNode[];
149
149
  };
150
150
  export type ColumnDef<T extends Record<PropertyKey, any>, ID = unknown> = AutocompleteColumnDef<T, ID> | CurrencyColumnDef<T, ID> | DateColumnDef<T, ID> | NumberColumnDef<T, ID> | TextColumnDef<T, ID> | LongTextColumnDef<T, ID> | LinkColumnDef<T, ID> | SelectColumnDef<T, ID> | ActionsColumnDef<T, ID>;
151
+ export type ColumnVisibilityModel = Record<string, boolean>;
151
152
  export type Sort = 'asc' | 'desc' | null;
152
153
  export type SortModel<T extends Record<PropertyKey, any>> = {
153
154
  [K in keyof T]: {
@@ -165,6 +166,12 @@ export type DataTableProps<T extends Record<PropertyKey, any>, GetId extends ((r
165
166
  columns: ColumnDef<T, InferredIdType<T, GetId>>[];
166
167
  pinnedColumns?: PinnedColumns;
167
168
  columnGroupingModel?: ColumnGroupingModel<T, InferredIdType<T, GetId>>;
169
+ /**
170
+ * 컬럼의 표시/숨김 상태를 제어한다. field를 key로, boolean을 value로 사용한다.
171
+ * false로 설정된 컬럼만 숨겨지며, 모델에 포함되지 않은 컬럼은 기본적으로 표시된다.
172
+ */
173
+ columnVisibilityModel?: ColumnVisibilityModel;
174
+ onColumnVisibilityModelChange?: (model: ColumnVisibilityModel) => void;
168
175
  editMode?: boolean;
169
176
  /**
170
177
  * 체크박스가 있는 경우, 체크박스를 클릭했을 때 선택된 row의 index를 지정한다.
@@ -188,6 +195,9 @@ export type DataTableProps<T extends Record<PropertyKey, any>, GetId extends ((r
188
195
  sorting: Partial<{
189
196
  sortModel: SortModel<T>[];
190
197
  }>;
198
+ columns: Partial<{
199
+ columnVisibilityModel: ColumnVisibilityModel;
200
+ }>;
191
201
  }>;
192
202
  pagination?: boolean;
193
203
  paginationMode?: 'client' | 'server';
@@ -3,8 +3,8 @@ export declare function extractFieldsFromGroupingModel<T extends Record<Property
3
3
  export declare function reorderColumnsByGroupingModel<T extends Record<PropertyKey, any>, ID>(columns: ColumnDef<T, ID>[], columnGroupingModel: ColumnGroupingModel<T, ID>): ColumnDef<T, ID>[];
4
4
  export declare function flattenColumnGroups<T extends Record<PropertyKey, any>, ID>(items: ColumnGroupingModel<T, ID> | ColumnDef<T, ID>[], groupPath?: string[], columnIndex?: {
5
5
  current: number;
6
- }): FlattenedColumn<T, ID>[];
7
- export declare function calculateColumnGroups<T extends Record<PropertyKey, any>, ID>(columnGroupingModel: ColumnGroupingModel<T, ID>, columns: ColumnDef<T, ID>[]): {
6
+ }, visibleFields?: Set<string>): FlattenedColumn<T, ID>[];
7
+ export declare function calculateColumnGroups<T extends Record<PropertyKey, any>, ID>(columnGroupingModel: ColumnGroupingModel<T, ID>, columns: ColumnDef<T, ID>[], visibleFields?: Set<string>): {
8
8
  groups: ProcessedColumnGroup[][];
9
9
  maxLevel: number;
10
10
  fieldsInGroupingModel: Set<keyof T>;
@@ -865,6 +865,106 @@ const columnGroupingModel = [
865
865
  <DataTable rows={rows} columns={columns} columnGroupingModel={columnGroupingModel} />;
866
866
  ```
867
867
 
868
+ ### Column Visibility
869
+
870
+ You can control which columns are visible using `columnVisibilityModel`.
871
+ Columns set to `false` are hidden. Columns not in the model are visible by default.
872
+ Hidden columns are completely removed from the DOM for optimal rendering performance.
873
+
874
+ ```tsx
875
+ <Stack spacing={2}>
876
+ <Stack direction="row" spacing={1} sx={{
877
+ flexWrap: 'wrap'
878
+ }}>
879
+ {allColumns.map(col => <label key={col.field as string} style={{
880
+ display: 'flex',
881
+ alignItems: 'center',
882
+ gap: 4
883
+ }}>
884
+ <input type="checkbox" checked={visibilityModel[col.field as string] !== false} onChange={e => setVisibilityModel(prev => ({
885
+ ...prev,
886
+ [col.field as string]: e.target.checked
887
+ }))} />
888
+ {col.headerName}
889
+ </label>)}
890
+ </Stack>
891
+ <DataTable rows={rows2} columns={allColumns} columnVisibilityModel={visibilityModel} onColumnVisibilityModelChange={setVisibilityModel} noWrap />
892
+ </Stack>
893
+ ```
894
+
895
+ #### Controlled Mode
896
+
897
+ ```tsx
898
+ const [visibilityModel, setVisibilityModel] = useState({ fat: false });
899
+
900
+ <DataTable
901
+ rows={rows}
902
+ columns={columns}
903
+ columnVisibilityModel={visibilityModel}
904
+ onColumnVisibilityModelChange={setVisibilityModel}
905
+ />
906
+ ```
907
+
908
+ #### Uncontrolled Mode (initialState)
909
+
910
+ ```tsx
911
+ <DataTable
912
+ rows={rows}
913
+ columns={columns}
914
+ initialState={{
915
+ columns: { columnVisibilityModel: { fat: false, carbs: false } },
916
+ }}
917
+ />
918
+ ```
919
+
920
+ #### Column Visibility with Column Groups
921
+
922
+ ```tsx
923
+ <Stack spacing={2}>
924
+ <Stack direction="row" spacing={1} sx={{
925
+ flexWrap: 'wrap'
926
+ }}>
927
+ {columns.map(col => <label key={col.field as string} style={{
928
+ display: 'flex',
929
+ alignItems: 'center',
930
+ gap: 4
931
+ }}>
932
+ <input type="checkbox" checked={visibilityModel[col.field as string] !== false} onChange={e => setVisibilityModel(prev => ({
933
+ ...prev,
934
+ [col.field as string]: e.target.checked
935
+ }))} />
936
+ {col.headerName}
937
+ </label>)}
938
+ </Stack>
939
+ <DataTable rows={rows4} columns={columns} columnGroupingModel={[{
940
+ groupId: 'group1',
941
+ headerName: 'Group 1',
942
+ children: [{
943
+ field: 'id'
944
+ }, {
945
+ field: 'number'
946
+ }, {
947
+ field: 'string'
948
+ }]
949
+ }, {
950
+ groupId: 'group2',
951
+ headerName: 'Group 2',
952
+ children: [{
953
+ field: 'date'
954
+ }, {
955
+ field: 'object'
956
+ }]
957
+ }]} columnVisibilityModel={visibilityModel} onColumnVisibilityModelChange={setVisibilityModel} noWrap />
958
+ </Stack>
959
+ ```
960
+
961
+ #### Notes
962
+
963
+ - Hidden columns are completely removed from the DOM for optimal performance.
964
+ - Sorting on hidden columns is preserved — row order is maintained even if the sort column is hidden.
965
+ - Works with column grouping: hidden columns reduce group colspan, and fully hidden groups disappear.
966
+ - Works with pinned columns: hidden pinned columns are excluded from sticky position calculations.
967
+
868
968
  ### Column Resizing
869
969
 
870
970
  Setting `resizable: true` on a column allows you to adjust the column width by dragging.