@ncds/ui-admin 1.8.11 → 1.8.13

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.
Files changed (26) hide show
  1. package/dist/cjs/src/components/data-display/data-grid/DataGrid.js +9 -5
  2. package/dist/cjs/src/components/data-display/table/Table.js +326 -75
  3. package/dist/cjs/src/components/data-display/table/dnd-context.js +15 -0
  4. package/dist/cjs/src/components/data-display/table/dnd-preview.js +127 -0
  5. package/dist/esm/src/components/data-display/data-grid/DataGrid.js +9 -5
  6. package/dist/esm/src/components/data-display/table/Table.js +328 -77
  7. package/dist/esm/src/components/data-display/table/dnd-context.js +10 -0
  8. package/dist/esm/src/components/data-display/table/dnd-preview.js +121 -0
  9. package/dist/temp/src/components/data-display/data-grid/DataGrid.d.ts +1 -0
  10. package/dist/temp/src/components/data-display/data-grid/DataGrid.js +8 -7
  11. package/dist/temp/src/components/data-display/data-grid/DataGrid.types.d.ts +6 -0
  12. package/dist/temp/src/components/data-display/table/Table.d.ts +14 -4
  13. package/dist/temp/src/components/data-display/table/Table.js +172 -14
  14. package/dist/temp/src/components/data-display/table/dnd-context.d.ts +12 -0
  15. package/dist/temp/src/components/data-display/table/dnd-context.js +10 -0
  16. package/dist/temp/src/components/data-display/table/dnd-preview.d.ts +6 -0
  17. package/dist/temp/src/components/data-display/table/dnd-preview.js +120 -0
  18. package/dist/temp/src/components/data-display/table/types.d.ts +24 -1
  19. package/dist/types/src/components/data-display/data-grid/DataGrid.d.ts +1 -0
  20. package/dist/types/src/components/data-display/data-grid/DataGrid.types.d.ts +6 -0
  21. package/dist/types/src/components/data-display/table/Table.d.ts +14 -4
  22. package/dist/types/src/components/data-display/table/dnd-context.d.ts +12 -0
  23. package/dist/types/src/components/data-display/table/dnd-preview.d.ts +6 -0
  24. package/dist/types/src/components/data-display/table/types.d.ts +24 -1
  25. package/dist/ui-admin/assets/styles/style.css +177 -2
  26. package/package.json +2 -2
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildDragPreview = exports.TABLE_DND_ID_SLICE_START = exports.TABLE_DND_ID_SLICE_END = exports.TABLE_DND_ID_RADIX = exports.PREVIEW_BADGE_SIZE = void 0;
7
+ const TABLE_DND_ID_RADIX = exports.TABLE_DND_ID_RADIX = 36;
8
+ const TABLE_DND_ID_SLICE_START = exports.TABLE_DND_ID_SLICE_START = 2;
9
+ const TABLE_DND_ID_SLICE_END = exports.TABLE_DND_ID_SLICE_END = 9;
10
+ const PREVIEW_MAX_ROWS = 3;
11
+ const PREVIEW_STACK_OFFSET = 5;
12
+ const PREVIEW_MAX_STACK_OFFSET = PREVIEW_STACK_OFFSET * PREVIEW_MAX_ROWS;
13
+ const PREVIEW_BADGE_SIZE = exports.PREVIEW_BADGE_SIZE = 24;
14
+ const PREVIEW_BADGE_HALF = PREVIEW_BADGE_SIZE / 2;
15
+ // hover의 color-mix 반투명 배경을 우회해 불투명 RGB 배경색을 클래스 기반으로 직접 결정
16
+ const getRowBackground = rowEl => {
17
+ const resolveCssVar = name => getComputedStyle(document.documentElement).getPropertyValue(name).trim();
18
+ const isSelected = rowEl.classList.contains('ncua-table__row--selected');
19
+ const isError = rowEl.classList.contains('ncua-table__row--error');
20
+ const isWarning = rowEl.classList.contains('ncua-table__row--warning');
21
+ if (isSelected && isError) return resolveCssVar('--primary-red-50');
22
+ if (isSelected && isWarning) return resolveCssVar('--orange-50');
23
+ if (isSelected) return resolveCssVar('--gray-50');
24
+ return resolveCssVar('--base-white');
25
+ };
26
+ // cloneNode는 HTML attribute만 복사하므로 checkbox.checked를 직접 동기화
27
+ const cloneRowWithState = sourceRow => {
28
+ const clone = sourceRow.cloneNode(true);
29
+ const srcInputs = sourceRow.querySelectorAll('input[type="checkbox"]');
30
+ const clnInputs = clone.querySelectorAll('input[type="checkbox"]');
31
+ srcInputs.forEach((src, i) => {
32
+ const cln = clnInputs[i];
33
+ if (cln) cln.checked = src.checked;
34
+ });
35
+ clone.style.backgroundColor = getRowBackground(sourceRow);
36
+ // 열 너비는 테이블 레이아웃 컨텍스트에서 결정되므로 직접 복사 — ceil로 올림해 프리뷰 셀이 실제보다 좁아지지 않게 함
37
+ const srcCells = Array.from(sourceRow.querySelectorAll('td, th'));
38
+ const clnCells = Array.from(clone.querySelectorAll('td, th'));
39
+ srcCells.forEach((src, i) => {
40
+ const cln = clnCells[i];
41
+ if (!cln) return;
42
+ const w = `${Math.ceil(src.getBoundingClientRect().width)}px`;
43
+ cln.style.width = w;
44
+ cln.style.minWidth = w;
45
+ cln.style.maxWidth = w;
46
+ });
47
+ return clone;
48
+ };
49
+ const buildCountBadge = count => {
50
+ const badge = document.createElement('div');
51
+ badge.className = 'ncua-table-dnd-preview__badge';
52
+ badge.textContent = String(count);
53
+ return badge;
54
+ };
55
+ const buildSummaryCard = rowRect => {
56
+ const wrapper = document.createElement('div');
57
+ wrapper.className = 'ncua-table-dnd-preview__summary';
58
+ Object.assign(wrapper.style, {
59
+ top: `${Math.round(PREVIEW_BADGE_HALF + PREVIEW_MAX_STACK_OFFSET)}px`,
60
+ left: `${Math.round(PREVIEW_BADGE_HALF + PREVIEW_MAX_STACK_OFFSET)}px`,
61
+ width: `${Math.round(rowRect.width) - PREVIEW_MAX_STACK_OFFSET}px`,
62
+ height: `${Math.round(rowRect.height)}px`
63
+ });
64
+ return wrapper;
65
+ };
66
+ const buildRowCard = _ref => {
67
+ let {
68
+ row,
69
+ cardLeft,
70
+ cardTop,
71
+ cardWidth,
72
+ rowHeight,
73
+ zIndex,
74
+ parentTable
75
+ } = _ref;
76
+ const wrapper = document.createElement('div');
77
+ wrapper.className = 'ncua-table-dnd-preview__card';
78
+ Object.assign(wrapper.style, {
79
+ zIndex: String(zIndex),
80
+ top: `${cardTop}px`,
81
+ left: `${cardLeft}px`,
82
+ width: `${cardWidth}px`,
83
+ height: `${rowHeight}px`,
84
+ backgroundColor: getRowBackground(row)
85
+ });
86
+ const table = document.createElement('table');
87
+ if (parentTable) table.className = parentTable.className;
88
+ table.style.width = `${cardWidth}px`;
89
+ const tbody = document.createElement('tbody');
90
+ tbody.className = 'ncua-table__body';
91
+ tbody.appendChild(cloneRowWithState(row));
92
+ table.appendChild(tbody);
93
+ wrapper.appendChild(table);
94
+ return wrapper;
95
+ };
96
+ const buildDragPreview = (rows, rowRect) => {
97
+ const visibleCount = Math.min(rows.length, PREVIEW_MAX_ROWS);
98
+ const hasSummary = rows.length > visibleCount;
99
+ const totalCards = visibleCount + (hasSummary ? 1 : 0);
100
+ const isMulti = rows.length > 1;
101
+ const parentTable = rows[0]?.closest('table') ?? null;
102
+ const rowWidth = Math.round(rowRect.width);
103
+ const rowHeight = Math.round(rowRect.height);
104
+ const container = document.createElement('div');
105
+ container.className = 'ncua-table-dnd-preview';
106
+ Object.assign(container.style, {
107
+ width: `${PREVIEW_BADGE_HALF + rowWidth}px`,
108
+ height: `${PREVIEW_BADGE_HALF + rowHeight + PREVIEW_STACK_OFFSET * (totalCards - 1)}px`
109
+ });
110
+ if (isMulti) container.appendChild(buildCountBadge(rows.length));
111
+ if (hasSummary) container.appendChild(buildSummaryCard(rowRect));
112
+ // 뒤쪽 행 카드부터 렌더해서 앞쪽이 위로 올라오게
113
+ for (let i = visibleCount - 1; i >= 0; i--) {
114
+ const stackShift = isMulti ? i * PREVIEW_STACK_OFFSET : 0;
115
+ container.appendChild(buildRowCard({
116
+ row: rows[i],
117
+ cardLeft: Math.round(PREVIEW_BADGE_HALF + stackShift),
118
+ cardTop: Math.round(PREVIEW_BADGE_HALF + stackShift),
119
+ cardWidth: rowWidth - stackShift,
120
+ rowHeight,
121
+ zIndex: visibleCount - i,
122
+ parentTable
123
+ }));
124
+ }
125
+ return container;
126
+ };
127
+ exports.buildDragPreview = buildDragPreview;
@@ -75,7 +75,8 @@ const DataGridTable = /*#__PURE__*/forwardRef((_ref5, ref) => {
75
75
  hoverable,
76
76
  selectable,
77
77
  horizontalScroll,
78
- minWidth
78
+ minWidth,
79
+ draggable
79
80
  } = _ref5;
80
81
  return _jsx("div", {
81
82
  ref: ref,
@@ -89,6 +90,7 @@ const DataGridTable = /*#__PURE__*/forwardRef((_ref5, ref) => {
89
90
  selectable: selectable,
90
91
  horizontalScroll: horizontalScroll,
91
92
  minWidth: minWidth,
93
+ draggable: draggable,
92
94
  children: children
93
95
  })
94
96
  });
@@ -139,7 +141,7 @@ const sortChildren = children => {
139
141
  });
140
142
  return result;
141
143
  };
142
- const hasTableWrapperContent = sorted => sorted.filterBar.length > 0 || sorted.topActionBar.length > 0 || sorted.dataTable.length > 0 || sorted.bottomActionBar.length > 0;
144
+ const hasTableWrapperContent = (sorted, actionBarVisible) => sorted.filterBar.length > 0 || actionBarVisible && sorted.topActionBar.length > 0 || sorted.dataTable.length > 0 || actionBarVisible && sorted.bottomActionBar.length > 0;
143
145
  const isTableSelectable = dataTable => dataTable.some(child => /*#__PURE__*/isValidElement(child) && child.props.selectable === true);
144
146
  // ──────────────────────────────────────────────
145
147
  // Main DataGrid component
@@ -149,17 +151,19 @@ const DataGridComponent = /*#__PURE__*/forwardRef((_ref7, ref) => {
149
151
  variant = 'search-result',
150
152
  children,
151
153
  className,
154
+ showActionBar,
152
155
  ...rest
153
156
  } = _ref7;
154
157
  const sorted = sortChildren(children);
155
- const needsEmptyBottomBar = sorted.bottomActionBar.length === 0 && isTableSelectable(sorted.dataTable);
158
+ const actionBarVisible = showActionBar !== false;
159
+ const needsEmptyBottomBar = actionBarVisible && sorted.bottomActionBar.length === 0 && isTableSelectable(sorted.dataTable);
156
160
  return _jsxs("div", {
157
161
  ref: ref,
158
162
  className: classNames('ncua-data-grid', className, `ncua-data-grid--${variant}`),
159
163
  ...rest,
160
- children: [sorted.searchFilter, sorted.summary, hasTableWrapperContent(sorted) && _jsxs("div", {
164
+ children: [sorted.searchFilter, sorted.summary, hasTableWrapperContent(sorted, actionBarVisible) && _jsxs("div", {
161
165
  className: "ncua-data-grid__table-wrapper",
162
- children: [sorted.filterBar, sorted.topActionBar, sorted.dataTable, sorted.bottomActionBar, needsEmptyBottomBar && _jsx("div", {
166
+ children: [sorted.filterBar, actionBarVisible && sorted.topActionBar, sorted.dataTable, actionBarVisible && sorted.bottomActionBar, needsEmptyBottomBar && _jsx("div", {
163
167
  className: "ncua-data-grid__action-bar ncua-data-grid__action-bar--bottom"
164
168
  })]
165
169
  }), sorted.pagination]