@cashub/ui 0.37.0 → 0.38.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cashub/ui",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "private": false,
5
5
  "author": "CasHUB Team",
6
6
  "description": "CasHUB UI components library",
@@ -40,6 +40,7 @@
40
40
  "react-router-dom": "^5.2.0",
41
41
  "react-toastify": "^7.0.4",
42
42
  "react-transition-group": "^4.4.2",
43
+ "react-window": "^1.8.11",
43
44
  "styled-components": "^5.3.0",
44
45
  "treeflex": "^2.0.1",
45
46
  "xml-formatter": "^3.6.3"
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
9
+ var _hooks = require("./hooks");
10
+ var _scrollbar = _interopRequireDefault(require("../styles/mixin/scrollbar"));
11
+ var _GridTableHeadCell = _interopRequireDefault(require("./subComponent/GridTableHeadCell"));
12
+ var _Resizer = _interopRequireDefault(require("./subComponent/Resizer"));
13
+ var _Popover = _interopRequireDefault(require("../popover/Popover"));
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
16
+ const _excluded = ["title", "fieldName", "render", "custom"];
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
19
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
20
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
21
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
22
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
24
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
25
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
26
+ const ROW_HEIGHT = 48;
27
+ const OVER_SCAN_COUNT = 5;
28
+ const InfiniteGridTable = _ref => {
29
+ let {
30
+ containerHeight,
31
+ scrollTop,
32
+ columns,
33
+ data,
34
+ sortColumn,
35
+ sortType,
36
+ onSortChange,
37
+ backgroundReverse,
38
+ translation
39
+ } = _ref;
40
+ const wrapperRef = (0, _react.useRef)(null);
41
+ const tableRef = (0, _react.useRef)(null);
42
+ const tableHeadRef = (0, _react.useRef)(null);
43
+ const [wrapperTop, setWrapperTop] = (0, _react.useState)(0);
44
+ const [tableColumns, setTableColumns] = (0, _react.useState)(columns);
45
+ const [tableWidth, setTableWidth] = (0, _react.useState)(0);
46
+ const [restWidth, setRestWidth] = (0, _react.useState)(0);
47
+ const texts = (0, _react.useMemo)(() => {
48
+ const defaultTexts = {
49
+ info: 'Showing _START_ to _END_ of _TOTAL_ entries',
50
+ empty: 'No data available in table'
51
+ };
52
+ return _objectSpread(_objectSpread({}, defaultTexts), translation);
53
+ }, [translation]);
54
+ const tableHeight = (0, _react.useMemo)(() => {
55
+ var _tableHeadRef$current;
56
+ const theadHeight = ((_tableHeadRef$current = tableHeadRef.current) === null || _tableHeadRef$current === void 0 ? void 0 : _tableHeadRef$current.offsetHeight) || 0;
57
+ // when data is empty, table will generate a row to show a message
58
+ const rowCounts = data.length || 1;
59
+ return theadHeight + rowCounts * ROW_HEIGHT;
60
+ }, [data.length]);
61
+ const visibleRowCounts = (0, _react.useMemo)(() => {
62
+ return Math.ceil(containerHeight / ROW_HEIGHT);
63
+ }, [containerHeight]);
64
+ const startIndex = (0, _react.useMemo)(() => {
65
+ const top = wrapperTop + scrollTop;
66
+ return Math.max(0, Math.floor(top / ROW_HEIGHT) - OVER_SCAN_COUNT);
67
+ }, [wrapperTop, scrollTop]);
68
+ const endIndex = (0, _react.useMemo)(() => {
69
+ return Math.min(data.length, startIndex + visibleRowCounts + OVER_SCAN_COUNT * 2);
70
+ }, [data.length, startIndex, visibleRowCounts]);
71
+ const visibleData = (0, _react.useMemo)(() => {
72
+ return data.slice(startIndex, endIndex);
73
+ }, [data, startIndex, endIndex]);
74
+ const handleSortChange = (0, _react.useCallback)(columnName => {
75
+ if (onSortChange) {
76
+ onSortChange(columnName);
77
+ }
78
+ }, [onSortChange]);
79
+ const calculateWrapperTop = (0, _react.useCallback)(() => {
80
+ const {
81
+ top
82
+ } = wrapperRef.current.getBoundingClientRect();
83
+ setWrapperTop(top + window.scrollY);
84
+ }, []);
85
+ const calculateTableWidth = (0, _react.useCallback)(() => {
86
+ setTableWidth(tableRef.current.offsetWidth);
87
+ setRestWidth(previousWidth => {
88
+ const containerWidth = wrapperRef.current.offsetWidth;
89
+ const tableWidth = tableRef.current.offsetWidth - previousWidth;
90
+ if (containerWidth > tableWidth) {
91
+ return containerWidth - tableWidth;
92
+ }
93
+ return 0;
94
+ });
95
+ }, []);
96
+ const handleResize = (0, _react.useCallback)(() => {
97
+ calculateWrapperTop();
98
+ calculateTableWidth();
99
+ }, [calculateWrapperTop, calculateTableWidth]);
100
+ const handleResizeColumn = (0, _react.useCallback)((targetIndex, width) => {
101
+ setTableColumns(previous => {
102
+ return previous.map((column, index) => {
103
+ if (index === targetIndex) {
104
+ return _objectSpread(_objectSpread({}, column), {}, {
105
+ width
106
+ });
107
+ }
108
+ return _objectSpread({}, column);
109
+ });
110
+ });
111
+ }, []);
112
+ const handleScroll = (0, _react.useCallback)(event => {
113
+ const {
114
+ target
115
+ } = event;
116
+ wrapperRef.current.scrollLeft = target.scrollLeft;
117
+ }, []);
118
+ const showFullValue = (0, _react.useCallback)(event => {
119
+ let {
120
+ id
121
+ } = event.target;
122
+ if (!id) {
123
+ ({
124
+ id
125
+ } = event.currentTarget);
126
+ event.target.id = id;
127
+ }
128
+ const {
129
+ offsetWidth,
130
+ scrollWidth,
131
+ innerText
132
+ } = event.target;
133
+ if (scrollWidth >= offsetWidth && innerText) {
134
+ event.stopPropagation();
135
+ (0, _Popover.default)({
136
+ id,
137
+ target: event.target,
138
+ content: innerText,
139
+ boundary: tableRef.current
140
+ });
141
+ }
142
+ }, []);
143
+
144
+ // generate sort icon area
145
+ const generateSort = (0, _hooks.useGenerateSort)(sortColumn, sortType);
146
+ const tableHeads = (0, _react.useMemo)(() => {
147
+ const tableHeads = tableColumns.map((column, index) => {
148
+ const {
149
+ title,
150
+ fieldName,
151
+ width,
152
+ sortable,
153
+ align
154
+ } = column;
155
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridTableHeadCell.default, {
156
+ width: width,
157
+ align: align,
158
+ backgroundReverse: backgroundReverse,
159
+ sortable: sortable,
160
+ onClick: () => {
161
+ sortable && handleSortChange(fieldName);
162
+ },
163
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
164
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
165
+ id: fieldName,
166
+ onClick: showFullValue,
167
+ children: title
168
+ }), sortable && generateSort(fieldName)]
169
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Resizer.default, {
170
+ index: index,
171
+ onResize: handleResizeColumn
172
+ })]
173
+ }, "TH".concat(index));
174
+ });
175
+ tableHeads.push(/*#__PURE__*/(0, _jsxRuntime.jsx)(_GridTableHeadCell.default, {
176
+ role: "presentation",
177
+ width: restWidth,
178
+ backgroundReverse: backgroundReverse
179
+ }, 'rest'));
180
+ return tableHeads;
181
+ }, [backgroundReverse, tableColumns, handleSortChange, generateSort, showFullValue, handleResizeColumn, restWidth]);
182
+ const tableRows = (0, _react.useMemo)(() => {
183
+ if (visibleData.length === 0) {
184
+ return null;
185
+ }
186
+ return visibleData.map((row, rowIndex) => {
187
+ const tds = tableColumns.map((column, columnIndex) => {
188
+ const {
189
+ title,
190
+ fieldName,
191
+ render,
192
+ custom
193
+ } = column,
194
+ props = _objectWithoutProperties(column, _excluded);
195
+ const key = rowIndex + columnIndex.toString();
196
+ let renderedData = null;
197
+ if (custom && render) {
198
+ // call render function to get custom data(fully)
199
+ renderedData = render(row);
200
+ } else {
201
+ // call render function to get custom data(part)
202
+ renderedData = /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
203
+ id: key,
204
+ onClick: showFullValue,
205
+ children: render ? render(row[fieldName], row) : String(row[fieldName])
206
+ });
207
+ }
208
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(TD, _objectSpread(_objectSpread({
209
+ "data-label": title,
210
+ backgroundReverse: backgroundReverse
211
+ }, props), {}, {
212
+ children: renderedData
213
+ }), columnIndex);
214
+ });
215
+ tds.push(/*#__PURE__*/(0, _jsxRuntime.jsx)(TD, {
216
+ role: "presentation",
217
+ width: restWidth,
218
+ backgroundReverse: backgroundReverse
219
+ }, 'rest'));
220
+ const index = rowIndex + startIndex;
221
+ const top = index * ROW_HEIGHT + tableHeadRef.current.offsetHeight;
222
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("tr", {
223
+ "data-index": index,
224
+ style: {
225
+ position: 'absolute',
226
+ left: 0,
227
+ top: "".concat(top, "px")
228
+ },
229
+ children: tds
230
+ }, index);
231
+ });
232
+ }, [backgroundReverse, tableColumns, visibleData, showFullValue, restWidth, startIndex]);
233
+ const generateEmptyMessage = (0, _react.useCallback)(() => {
234
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("tr", {
235
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(TD, {
236
+ center: true,
237
+ colSpan: tableColumns.length,
238
+ backgroundReverse: backgroundReverse,
239
+ children: texts.empty
240
+ })
241
+ });
242
+ }, [backgroundReverse, tableColumns, texts]);
243
+ (0, _react.useEffect)(() => {
244
+ setTableColumns(columns);
245
+ }, [columns]);
246
+ (0, _react.useEffect)(() => {
247
+ handleResize();
248
+ }, [tableColumns, handleResize]);
249
+ (0, _react.useEffect)(() => {
250
+ window.addEventListener('resize', handleResize);
251
+ return () => {
252
+ window.removeEventListener('resize', handleResize);
253
+ };
254
+ }, [handleResize]);
255
+ (0, _react.useEffect)(() => {
256
+ if (tableRef.current) {
257
+ setTableWidth(tableRef.current.offsetWidth);
258
+ }
259
+ }, [columns]);
260
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
261
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(TableWrapper, {
262
+ style: {
263
+ height: "".concat(tableHeight, "px")
264
+ },
265
+ ref: wrapperRef,
266
+ backgroundReverse: backgroundReverse,
267
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(ResponsiveTable, {
268
+ ref: tableRef,
269
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("thead", {
270
+ ref: tableHeadRef,
271
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("tr", {
272
+ children: tableHeads
273
+ })
274
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("tbody", {
275
+ children: data.length === 0 ? generateEmptyMessage() : tableRows
276
+ })]
277
+ })
278
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(Scrollbar, {
279
+ backgroundReverse: backgroundReverse,
280
+ width: tableWidth,
281
+ onScroll: handleScroll
282
+ })]
283
+ });
284
+ };
285
+ const TableWrapper = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n background: ", ";\n"])), _ref2 => {
286
+ let {
287
+ backgroundReverse
288
+ } = _ref2;
289
+ return backgroundReverse ? 'var(--color-background1)' : 'var(--color-background2)';
290
+ });
291
+ const ResponsiveTable = _styledComponents.default.table(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n /* make fixed width work */\n position: relative;\n width: 0px;\n color: var(--font-on-background);\n table-layout: fixed;\n border-collapse: collapse;\n"])));
292
+ const TD = _styledComponents.default.td(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n height: 48px;\n padding: 0 var(--spacing-xs);\n border-top: 1px solid var(--border-color);\n border-right: 1px solid var(--border-color);\n border-bottom: 1px solid var(--border-color);\n text-align: ", ";\n background: ", ";\n\n &:last-child {\n border-right: none;\n padding: 0;\n }\n\n > span {\n display: inline-block;\n width: 100%;\n padding: 0 2px;\n overflow: hidden;\n white-space: pre;\n text-overflow: ellipsis;\n }\n"])), _ref3 => {
293
+ let {
294
+ center
295
+ } = _ref3;
296
+ return center ? 'center' : 'left';
297
+ }, _ref4 => {
298
+ let {
299
+ backgroundReverse
300
+ } = _ref4;
301
+ return backgroundReverse ? 'var(--color-background1)' : 'var(--color-background2)';
302
+ });
303
+ const Scrollbar = _styledComponents.default.div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: sticky;\n bottom: 0;\n width: 100%;\n overflow: auto;\n background: ", ";\n\n ::before {\n display: block;\n content: '';\n width: ", ";\n height: 1px;\n }\n\n ", "\n"])), _ref5 => {
304
+ let {
305
+ backgroundReverse
306
+ } = _ref5;
307
+ return backgroundReverse ? 'var(--color-background1)' : 'var(--color-background2)';
308
+ }, _ref6 => {
309
+ let {
310
+ width
311
+ } = _ref6;
312
+ return "".concat(width, "px");
313
+ }, (0, _scrollbar.default)({
314
+ size: 'large'
315
+ }));
316
+ var _default = exports.default = InfiniteGridTable;
package/table/index.js CHANGED
@@ -15,6 +15,12 @@ Object.defineProperty(exports, "ImageBox", {
15
15
  return _ImageBox.default;
16
16
  }
17
17
  });
18
+ Object.defineProperty(exports, "InfiniteGridTable", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _InfiniteGridTable.default;
22
+ }
23
+ });
18
24
  Object.defineProperty(exports, "PermissionTable", {
19
25
  enumerable: true,
20
26
  get: function () {
@@ -28,6 +34,7 @@ Object.defineProperty(exports, "Table", {
28
34
  }
29
35
  });
30
36
  var _GridTable = _interopRequireDefault(require("./GridTable"));
37
+ var _InfiniteGridTable = _interopRequireDefault(require("./InfiniteGridTable"));
31
38
  var _Table = _interopRequireDefault(require("./Table"));
32
39
  var _PermissionTable = _interopRequireDefault(require("./PermissionTable"));
33
40
  var _ImageBox = _interopRequireDefault(require("./ImageBox"));
@@ -12,6 +12,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
12
12
  function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
13
13
  const Resizer = _ref => {
14
14
  let {
15
+ index,
15
16
  onResize
16
17
  } = _ref;
17
18
  const [parentNode, setParentNode] = (0, _react.useState)(null);
@@ -21,9 +22,9 @@ const Resizer = _ref => {
21
22
  const targetWidth = event.clientX - parentNode.getBoundingClientRect().left;
22
23
  parentNode.style.width = "".concat(targetWidth, "px");
23
24
  if (typeof onResize === 'function') {
24
- onResize(targetWidth);
25
+ onResize(index, targetWidth);
25
26
  }
26
- }, [parentNode, onResize]);
27
+ }, [parentNode, index, onResize]);
27
28
  const handleMouseUp = (0, _react.useCallback)(event => {
28
29
  event.stopPropagation();
29
30
  event.preventDefault();