aio-table 8.0.0 → 9.0.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.
Files changed (5) hide show
  1. package/index.css +0 -216
  2. package/index.d.ts +139 -0
  3. package/index.js +523 -2870
  4. package/package.json +26 -28
  5. package/README.md +0 -792
package/index.js CHANGED
@@ -1,2870 +1,523 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.convertFlatModel = convertFlatModel;
7
- exports.default = void 0;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _react2 = require("@mdi/react");
10
- var _js = require("@mdi/js");
11
- var _aioButton = _interopRequireDefault(require("aio-button"));
12
- var _reactVirtualDom = _interopRequireDefault(require("react-virtual-dom"));
13
- var _jquery = _interopRequireDefault(require("jquery"));
14
- require("./index.css");
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
- let TableContext = /*#__PURE__*/(0, _react.createContext)();
21
- let TableCLS = {
22
- row: 'row',
23
- header: 'table-header',
24
- title: 'table-title',
25
- resizeHandle: 'title-resize-handle',
26
- rows: 'rows',
27
- table: 'table',
28
- toolbarIconButton: 'toolbar-icon',
29
- searchBox: 'aio-table-search',
30
- toolbar: 'table-toolbar',
31
- rowToggle: 'table-toggle',
32
- cellBefore: 'cell-before',
33
- cellAfter: 'cell-after',
34
- cellContent: 'cell-content',
35
- cellSubtext: 'cell-subtext',
36
- cell: 'cell',
37
- filterPopup: 'table-filter-popup',
38
- loading: 'table-loading',
39
- addFilter: 'table-filter-add',
40
- filterOperator: 'table-filter-operator',
41
- filterItem: 'table-filter-item',
42
- filterValue: 'table-filter-value',
43
- filterRemove: 'table-filter-remove',
44
- groupRow: 'table-group-row',
45
- inlineEditInput: 'table-inline-edit-input',
46
- freezeContainer: 'table-freeze-container',
47
- unfreezeContainer: 'table-unfreeze-container',
48
- splitter: 'table-splitter',
49
- paging: 'table-paging',
50
- toolbarPopupHeader: 'toolbar-popup-header',
51
- rowTemplate: 'row-template',
52
- toolbarItem: 'table-toolbar-item'
53
- };
54
- class Table extends _react.Component {
55
- constructor(props) {
56
- super(props);
57
- this.dom = /*#__PURE__*/(0, _react.createRef)();
58
- (0, _jquery.default)('body').on('focus', '.' + TableCLS.inlineEditInput, e => {
59
- (0, _jquery.default)(e.target).select();
60
- });
61
- this.getSearchs = functions.getSearchs.bind(this);
62
- this.getFilterResult = functions.getFilterResult.bind(this);
63
- this.isRowOpen = functions.isRowOpen.bind(this);
64
- this.onScroll = functions.onScroll.bind(this);
65
- let openDictionary = {};
66
- if (props.getRowId && props.tableId) {
67
- openDictionary = localStorage.getItem('tableopendic' + props.tableId);
68
- if (!openDictionary || openDictionary === null) {
69
- localStorage.setItem('tableopendic' + props.tableId, '{}');
70
- } else {
71
- openDictionary = JSON.parse(openDictionary);
72
- }
73
- }
74
- this.state = {
75
- openDictionary,
76
- filters: [],
77
- searchText: '',
78
- touch: 'ontouchstart' in document.documentElement,
79
- groupsOpen: {},
80
- rowHeight: props.rowHeight,
81
- freezeSize: 240,
82
- paging: props.paging,
83
- getValueByField: functions.getValueByField,
84
- Excel: Excel(() => this.props),
85
- Sort: Sort(() => this.props, () => this.state, this.setColumns.bind(this)),
86
- Group: Group(() => this.props, () => this.state, this.setColumns.bind(this)),
87
- columns: (props.columns || []).map(c => {
88
- return {
89
- ...c
90
- };
91
- }),
92
- prevColumns: JSON.stringify(props.columns),
93
- saveColumnInStorage: this.saveColumnInStorage.bind(this),
94
- setColumn: this.setColumn.bind(this)
95
- };
96
- this.updateColumnsByStorageKey();
97
- }
98
- translate(text) {
99
- let {
100
- translate = o => o,
101
- lang
102
- } = this.props;
103
- if (lang) {
104
- if (lang === 'farsi') {
105
- text = {
106
- 'Search': 'جستجو',
107
- 'Contain': 'شامل',
108
- 'Not Contain': 'غیر شامل',
109
- 'Equal': 'برابر',
110
- 'Not Equal': 'مخالف',
111
- 'Greater Than': 'بزرگتر از',
112
- 'Less Than': 'کوچکتر از',
113
- 'and': 'و',
114
- 'or': 'یا',
115
- 'add': 'افزودن',
116
- 'Inter Excel File Name': 'نام فایل اکسل را وارد کنید',
117
- 'Sort By': 'مرتب سازی بر اساس',
118
- 'Show Columns': 'نمایش ستون ها',
119
- 'Group By': 'گروه بندی بر اساس'
120
- }[text];
121
- } else if (lang === 'english') {} else {
122
- console.error('aio-table => lang props should be "english" or "farsi"');
123
- }
124
- }
125
- return translate(text) || text;
126
- }
127
- updateColumnsByStorageKey() {
128
- let {
129
- columns = []
130
- } = this.state;
131
- for (let i = 0; i < columns.length; i++) {
132
- let column = columns[i];
133
- let {
134
- storageKey
135
- } = column;
136
- if (!storageKey) {
137
- continue;
138
- }
139
- let storageObj = localStorage.getItem('tablecolumnstorage' + storageKey) || '{}';
140
- storageObj = JSON.parse(storageObj);
141
- storageObj = {
142
- ...storageObj,
143
- group: column.group ? storageObj.group : undefined,
144
- sort: column.sort ? storageObj.sort : undefined,
145
- show: column.toggleShow ? storageObj.show : column.show,
146
- //اگر تاگل نداشت از استوریج نمی خونیم چون ممکنه تاگل حذف شده باشه و دیگه نشه ستون رو ویزیبل کرد
147
- width: column.resizable !== false ? storageObj.width : column.width //اگر ریسایزبل نبود از استوریج نمی خونیم چون ممکنه ریسایزبل فالس شده باشه و دیگه نشه اندازه ستون رو کنترل کرد
148
- };
149
-
150
- localStorage.setItem('tablecolumnstorage' + storageKey, JSON.stringify(storageObj));
151
- this.setColumn(column, {
152
- _storageObj: storageObj
153
- });
154
- for (let prop in storageObj) {
155
- column[prop] = storageObj[prop];
156
- }
157
- }
158
- }
159
- saveColumnInStorage(column, key, value) {
160
- if (!column.storageKey) {
161
- return;
162
- }
163
- let storageObj = {
164
- ...column._storageObj
165
- };
166
- storageObj[key] = value;
167
- this.setColumn(column, {
168
- _storageObj: storageObj
169
- });
170
- localStorage.setItem('tablecolumnstorage' + column.storageKey, JSON.stringify(column._storageObj));
171
- }
172
- setColumns(columns) {
173
- this.setState({
174
- columns
175
- });
176
- }
177
- setColumn(column, obj) {
178
- for (let prop in obj) {
179
- column[prop] = obj[prop];
180
- }
181
- }
182
- getRowById(id) {
183
- return {
184
- ...this.rows_object[id],
185
- _detail: this.details_object[id]
186
- };
187
- }
188
- getRowDetailById(id) {
189
- if (id === undefined) {
190
- return false;
191
- }
192
- return this.details_object[id];
193
- }
194
- getRowDetailsByColumns(row, id) {
195
- let {
196
- columns = [],
197
- getValueByField
198
- } = this.state;
199
- let cells = [];
200
- let freezeCells = [];
201
- let unfreezeCells = [];
202
- let values = {};
203
- let json = {};
204
- for (let j = 0; j < columns.length; j++) {
205
- let column = columns[j];
206
- if (column.show === false) {
207
- continue;
208
- }
209
- let value = getValueByField(row, column);
210
- values[column.dataColumnId] = value;
211
- json[column.title] = value === undefined ? '' : value;
212
- let cell = striped => {
213
- let {
214
- _show
215
- } = this.getRowDetailById(id);
216
- if (_show === false) {
217
- return null;
218
- }
219
- if (!this.isRowOpen(id)) {
220
- return null;
221
- }
222
- let {
223
- width,
224
- flex,
225
- minWidth = 36,
226
- dataColumnId
227
- } = column;
228
- if (width === undefined && flex === undefined) {
229
- flex = 1;
230
- }
231
- return {
232
- html: /*#__PURE__*/_react.default.createElement(Cell, {
233
- striped: striped,
234
- key: id + dataColumnId + column.freeze,
235
- colId: j,
236
- rowId: id,
237
- column: column,
238
- value: value
239
- }),
240
- size: width,
241
- flex,
242
- minWidth,
243
- attrs: {
244
- 'data-column-id': dataColumnId
245
- }
246
- };
247
- };
248
- if (column.freeze) {
249
- this.freezeMode = true;
250
- freezeCells.push(cell);
251
- } else {
252
- unfreezeCells.push(cell);
253
- }
254
- cells.push(cell);
255
- }
256
- return {
257
- cells,
258
- freezeCells,
259
- unfreezeCells,
260
- values,
261
- json
262
- };
263
- }
264
- getRowId(row) {
265
- if (row._id === undefined) {
266
- let {
267
- getRowId
268
- } = this.props;
269
- if (getRowId) {
270
- let {
271
- getValueByField
272
- } = this.state;
273
- return getValueByField(row, undefined, getRowId);
274
- } else {
275
- return 'row' + Math.random();
276
- }
277
- } else {
278
- return row._id;
279
- }
280
- }
281
- getModelDetails_req(model = [], parents) {
282
- let {
283
- rowChilds
284
- } = this.props;
285
- let {
286
- getValueByField
287
- } = this.state;
288
- for (let i = 0; i < model.length; i++) {
289
- let detail = {};
290
- let row = model[i];
291
- let id = this.getRowId(row);
292
- row._id = id;
293
- detail._id = id;
294
- let {
295
- cells,
296
- freezeCells,
297
- unfreezeCells,
298
- values,
299
- json
300
- } = this.getRowDetailsByColumns(row, id);
301
- detail._json = json;
302
- detail._cells = cells;
303
- detail._freezeCells = freezeCells;
304
- detail._unfreezeCells = unfreezeCells;
305
- detail._values = values;
306
- detail._show = this.getFilterResult(row, detail);
307
- this.rows_object[id] = row;
308
- this.rows_array.push(row);
309
- this.details_object[id] = detail;
310
- if (rowChilds) {
311
- let childs = getValueByField(row, undefined, rowChilds) || [];
312
- detail._childs = childs;
313
- detail._parentIds = parents.map(o => o._id);
314
- detail._parentId = detail._parentIds[detail._parentIds.length - 1];
315
- if (detail._show) {
316
- for (let j = 0; j < detail._parentIds.length; j++) {
317
- let parentId = detail._parentIds[j];
318
- let parentRowDetail = this.details_object[parentId];
319
- if (parentRowDetail._show === false) {
320
- parentRowDetail._show = 'relative';
321
- }
322
- }
323
- }
324
- if (childs.length) {
325
- this.getModelDetails_req(childs, parents.concat(row));
326
- }
327
- }
328
- }
329
- }
330
- getTreeDetails(model = [], level, parents, nestedIndex) {
331
- let childIndex = 0;
332
- let {
333
- openDictionary
334
- } = this.state;
335
- for (let i = 0; i < model.length; i++) {
336
- let row = model[i];
337
- let detail = this.details_object[row._id];
338
- let parentDetail = this.details_object[detail._parentId];
339
- detail._level = level;
340
- detail._open = openDictionary[row._id] === undefined ? true : openDictionary[row._id];
341
- detail._nestedIndex = nestedIndex.concat(i);
342
- detail._getParents = () => parents;
343
- detail._isLastChild = () => {
344
- let detail = this.details_object[row._id];
345
- let {
346
- _parentId,
347
- _id
348
- } = detail;
349
- let res = false;
350
- if (_parentId !== undefined) {
351
- let {
352
- _lastChildId
353
- } = this.details_object[_parentId];
354
- res = _lastChildId === _id;
355
- }
356
- return res;
357
- };
358
- if (detail._show !== false) {
359
- detail._childIndex = childIndex;
360
- detail._isFirstChild = () => detail._childIndex === 0;
361
- childIndex++;
362
- detail._renderIndex = this.rowRenderIndex;
363
- this.rowRenderIndex++;
364
- if (parentDetail) {
365
- parentDetail._lastChildId = detail._id;
366
- }
367
- }
368
- if (detail._childs.length) {
369
- this.getTreeDetails(detail._childs, level + 1, parents.concat(row), detail._nestedIndex);
370
- }
371
- }
372
- }
373
- getModelDetails(model) {
374
- let {
375
- paging,
376
- Group
377
- } = this.state;
378
- let {
379
- rowChilds
380
- } = this.props;
381
- if (paging) {
382
- let {
383
- number = 1,
384
- sizes = [1, 5, 10, 15, 20, 30, 40, 50, 70, 100, 150, 200],
385
- size = sizes[0],
386
- length = model.length,
387
- onChange
388
- } = paging;
389
- let pages = Math.ceil(length / size);
390
- paging.sizes = sizes;
391
- paging.pages = pages;
392
- paging.size = size;
393
- paging.number = number;
394
- if (!onChange) {
395
- let start = (paging.number - 1) * paging.size;
396
- let end = start + paging.size;
397
- if (end > length) {
398
- end = length;
399
- }
400
- model = model.slice(start, end);
401
- }
402
- }
403
- this.details_object = {};
404
- this.rows_object = {};
405
- this.rows_array = [];
406
- this.getModelDetails_req(model, []);
407
- this.rowRenderIndex = 0;
408
- if (rowChilds) {
409
- this.getTreeDetails(model, 0, [], []);
410
- }
411
- this.groups = Group.get();
412
- if (this.groups.length) {
413
- this.rows_array = Group.groupBy(this.rows_array.filter(o => this.details_object[o._id]._show), this.groups.filter(o => o.active));
414
- }
415
- }
416
- toggleRow(id) {
417
- let {
418
- getRowId,
419
- tableId
420
- } = this.props;
421
- let {
422
- openDictionary
423
- } = this.state;
424
- if (this.details_object[id]._show === 'relative') {
425
- return;
426
- }
427
- openDictionary[id] = openDictionary[id] === undefined ? true : openDictionary[id];
428
- openDictionary[id] = !openDictionary[id];
429
- this.setState({
430
- openDictionary
431
- });
432
- if (getRowId && tableId) {
433
- localStorage.setItem('tableopendic' + tableId, JSON.stringify(openDictionary));
434
- }
435
- }
436
- toggle_layout(id, gap) {
437
- let icon;
438
- let {
439
- getToggleIcon,
440
- rtl,
441
- indent
442
- } = this.props;
443
- let {
444
- _childs,
445
- _open,
446
- _show
447
- } = this.details_object[id];
448
- if (getToggleIcon) {
449
- icon = getToggleIcon(!!_open);
450
- } else if (!_childs.length) {
451
- icon = /*#__PURE__*/_react.default.createElement(_react2.Icon, {
452
- path: _js.mdiCircleMedium,
453
- size: 0.8
454
- });
455
- } else {
456
- icon = /*#__PURE__*/_react.default.createElement(_react2.Icon, {
457
- path: _open ? _js.mdiChevronDown : rtl ? _js.mdiChevronLeft : _js.mdiChevronRight,
458
- size: 0.8
459
- });
460
- }
461
- return {
462
- row: [{
463
- size: indent,
464
- className: TableCLS.rowToggle,
465
- html: icon,
466
- align: 'v',
467
- style: {
468
- cursor: _show === 'relative' ? 'not-allowed' : 'pointer',
469
- background: 'rgba(0,0,0,0.03)',
470
- height: '100%'
471
- },
472
- attrs: {
473
- onClick: () => {
474
- if (_show === 'relative') {
475
- return;
476
- }
477
- this.toggleRow(id);
478
- }
479
- }
480
- }, {
481
- size: 6
482
- }]
483
- };
484
- }
485
- indent_layout(rowId) {
486
- let {
487
- indent,
488
- rowGap,
489
- rowHeight,
490
- indentColor = 'lightblue'
491
- } = this.props;
492
- let detail = this.getRowDetailById(rowId);
493
- if (!detail._level) {
494
- return false;
495
- }
496
- let getPath = () => {
497
- let dasharray = [1, 3];
498
- let {
499
- _level: level,
500
- _parentIds,
501
- _isLastChild
502
- } = detail;
503
- let isLastChild = _isLastChild();
504
- let x0 = indent * (level - 1) + indent / 2,
505
- x1 = x0 + indent / 2,
506
- y0 = 0,
507
- y1 = rowHeight / 2 + rowGap,
508
- y2 = rowHeight + rowGap;
509
- let pathes = [];
510
- pathes.push( /*#__PURE__*/_react.default.createElement("path", {
511
- d: `M${x0} ${y0} L${x0} ${isLastChild ? y1 : y2} Z`,
512
- stroke: indentColor,
513
- strokeWidth: 1,
514
- strokeDasharray: dasharray
515
- }));
516
- pathes.push( /*#__PURE__*/_react.default.createElement("path", {
517
- d: `M${x0} ${y1} L${x1} ${y1} Z`,
518
- stroke: indentColor,
519
- strokeWidth: 1,
520
- strokeDasharray: dasharray
521
- }));
522
- for (let i = 1; i < _parentIds.length; i++) {
523
- let {
524
- _isLastChild
525
- } = this.getRowDetailById(_parentIds[i]);
526
- if (_isLastChild()) {
527
- continue;
528
- }
529
- let x = (i - 0.5) * indent;
530
- pathes.push( /*#__PURE__*/_react.default.createElement("path", {
531
- d: `M${x} ${y0} L${x} ${y2} Z`,
532
- stroke: indentColor,
533
- strokeWidth: 1,
534
- strokeDasharray: dasharray
535
- }));
536
- }
537
- return pathes;
538
- };
539
- return {
540
- size: detail._level * indent,
541
- style: {
542
- height: '100%',
543
- overflow: 'visible'
544
- },
545
- html: /*#__PURE__*/_react.default.createElement("div", {
546
- style: {
547
- width: detail._level * indent,
548
- height: '100%',
549
- position: 'relative'
550
- }
551
- }, /*#__PURE__*/_react.default.createElement("svg", {
552
- width: 20,
553
- height: 20,
554
- style: {
555
- height: `calc(100% + ${rowGap}px)`,
556
- width: '100%',
557
- position: 'absolute',
558
- top: -rowGap
559
- }
560
- }, getPath(indent, detail)))
561
- };
562
- }
563
- getContext() {
564
- let {
565
- details_object,
566
- rows_object,
567
- rows_array
568
- } = this;
569
- let {
570
- openDictionary
571
- } = this.state;
572
- return {
573
- ...this.props,
574
- openDictionary,
575
- state: this.state,
576
- details_object,
577
- rows_object,
578
- rows_array,
579
- getRowById: this.getRowById.bind(this),
580
- getRowDetailById: this.getRowDetailById.bind(this),
581
- isRowOpen: this.isRowOpen.bind(this),
582
- SetState: obj => this.setState(obj),
583
- setColumns: this.setColumns.bind(this),
584
- getSearchs: this.getSearchs.bind(this),
585
- toggleRow: this.toggleRow.bind(this),
586
- indent_layout: this.indent_layout.bind(this),
587
- toggle_layout: this.toggle_layout.bind(this),
588
- translate: this.translate.bind(this),
589
- groups: this.groups
590
- };
591
- }
592
- keyDown(e) {
593
- if (e.keyCode === 27) {
594
- (0, _jquery.default)('.' + TableCLS.inlineEditInput).blur();
595
- }
596
- //else if([37,38,39,40].indexOf(e.keyCode) !== -1){this.arrow(e);}
597
- }
598
-
599
- arrow(e) {
600
- var container = (0, _jquery.default)(this.dom.current);
601
- var {
602
- rtl
603
- } = this.context;
604
- let inputs = container.find('.' + TableCLS.inlineEditInput);
605
- if (inputs.length === 0) {
606
- return;
607
- }
608
- let focusedInput = inputs.filter(':focus');
609
- if (!focusedInput.length) {
610
- inputs.eq(1).focus().select();
611
- return;
612
- }
613
- let rowId = focusedInput.attr('data-row-id');
614
- let colId = focusedInput.attr('data-col-id');
615
- if (e.keyCode === 40 || e.keyCode === 38) {
616
- let sign = e.keyCode === 40 ? 'next' : 'prev';
617
- e.preventDefault();
618
- let next = inputs[sign](`[data-col-id='${colId}']`);
619
- if (next.length) {
620
- next.focus().select();
621
- }
622
- } else if (e.keyCode === 39 || e.keyCode === 37) {
623
- e.preventDefault();
624
- let sign = (e.keyCode === 37 ? -1 : 1) * (rtl ? -1 : 1) === 1 ? 'next' : 'prev';
625
- let next = focusedInput[sign](`[data-row-id='${rowId}']`);
626
- console.log(next.length);
627
- if (next.length) {
628
- next.focus().select();
629
- }
630
- }
631
- }
632
- toolbar_layout() {
633
- return {
634
- html: /*#__PURE__*/_react.default.createElement(Toolbar, null)
635
- };
636
- }
637
- async componentDidMount() {
638
- this.state.Sort.set();
639
- }
640
- units_layout() {
641
- let {
642
- columns
643
- } = this.state;
644
- if (this.freezeMode) {
645
- let {
646
- freezeSize
647
- } = this.state;
648
- return {
649
- flex: 1,
650
- gap: 8,
651
- row: [{
652
- gapAttrs: {
653
- className: TableCLS.splitter
654
- },
655
- size: freezeSize,
656
- onResize: freezeSize => this.setState({
657
- freezeSize
658
- }),
659
- html: /*#__PURE__*/_react.default.createElement(TableUnit, {
660
- onScroll: () => this.onScroll(0),
661
- cellsType: "freezeCells",
662
- columns: columns.filter(({
663
- freeze
664
- }) => freeze)
665
- })
666
- }, {
667
- flex: 1,
668
- html: /*#__PURE__*/_react.default.createElement(TableUnit, {
669
- cellsType: "unfreezeCells",
670
- columns: columns.filter(({
671
- freeze
672
- }) => !freeze),
673
- onScroll: () => this.onScroll(1)
674
- })
675
- }]
676
- };
677
- }
678
- return {
679
- flex: 1,
680
- html: /*#__PURE__*/_react.default.createElement(TableUnit, {
681
- cellsType: "cells",
682
- columns: columns,
683
- onScroll: e => this.onScroll()
684
- })
685
- };
686
- }
687
- async changePaging(type, value) {
688
- let {
689
- paging
690
- } = this.state;
691
- let {
692
- pages,
693
- number,
694
- size,
695
- onChange
696
- } = paging;
697
- let newNumber = number;
698
- let newSize = size;
699
- if (type === 'prev') {
700
- newNumber = number - 1;
701
- } else if (type === 'next') {
702
- newNumber = number + 1;
703
- } else if (type === 'first') {
704
- newNumber = 1;
705
- } else if (type === 'last') {
706
- newNumber = pages;
707
- } else if (type === 'size') {
708
- newSize = value;
709
- }
710
- if (newNumber < 1) {
711
- newNumber = 1;
712
- }
713
- if (newNumber > pages) {
714
- newNumber = pages;
715
- }
716
- let newPaging = {
717
- ...paging,
718
- number: newNumber,
719
- size: newSize
720
- };
721
- if (onChange) {
722
- let res = await onChange(newPaging);
723
- if (res !== false) {
724
- this.setState({
725
- paging: newPaging
726
- });
727
- }
728
- } else {
729
- this.setState({
730
- paging: newPaging
731
- });
732
- }
733
- }
734
- paging_layout() {
735
- let {
736
- paging
737
- } = this.state;
738
- if (!paging) {
739
- return false;
740
- }
741
- let {
742
- rtl,
743
- model
744
- } = this.props;
745
- let {
746
- number = 1,
747
- sizes = [1, 5, 10, 15, 20, 30, 40, 50, 70, 100, 150, 200],
748
- size = sizes[0],
749
- length = model.length
750
- } = paging;
751
- let pages = Math.ceil(length / size);
752
- paging.sizes = sizes;
753
- paging.pages = pages;
754
- paging.size = size;
755
- paging.number = number;
756
- return {
757
- className: TableCLS.paging,
758
- style: {
759
- direction: 'ltr'
760
- },
761
- row: [{
762
- flex: 1
763
- }, {
764
- html: /*#__PURE__*/_react.default.createElement("button", {
765
- className: TableCLS.toolbarIconButton
766
- }, /*#__PURE__*/_react.default.createElement(_react2.Icon, {
767
- path: _js.mdiChevronDoubleLeft,
768
- size: 0.8
769
- })),
770
- attrs: {
771
- onClick: () => this.changePaging(rtl ? 'last' : 'first')
772
- }
773
- }, {
774
- html: /*#__PURE__*/_react.default.createElement("button", {
775
- className: TableCLS.toolbarIconButton
776
- }, /*#__PURE__*/_react.default.createElement(_react2.Icon, {
777
- path: _js.mdiChevronLeft,
778
- size: 0.8
779
- })),
780
- attrs: {
781
- onClick: () => this.changePaging(rtl ? 'next' : 'prev')
782
- }
783
- }, {
784
- html: rtl ? pages + ' / ' + number : number + ' / ' + pages,
785
- style: {
786
- fontSize: 12,
787
- padding: '0 12px'
788
- },
789
- align: 'vh'
790
- }, {
791
- html: /*#__PURE__*/_react.default.createElement("button", {
792
- className: TableCLS.toolbarIconButton
793
- }, /*#__PURE__*/_react.default.createElement(_react2.Icon, {
794
- path: _js.mdiChevronRight,
795
- size: 0.8
796
- })),
797
- attrs: {
798
- onClick: () => this.changePaging(rtl ? 'prev' : 'next')
799
- }
800
- }, {
801
- html: /*#__PURE__*/_react.default.createElement("button", {
802
- className: TableCLS.toolbarIconButton
803
- }, /*#__PURE__*/_react.default.createElement(_react2.Icon, {
804
- path: _js.mdiChevronDoubleRight,
805
- size: 0.8
806
- })),
807
- attrs: {
808
- onClick: () => this.changePaging(rtl ? 'first' : 'last')
809
- }
810
- }, {
811
- html: /*#__PURE__*/_react.default.createElement(_aioButton.default, {
812
- className: TableCLS.toolbarIconButton,
813
- type: "select",
814
- options: sizes,
815
- optionValue: "option",
816
- optionText: "option",
817
- search: false,
818
- caret: false,
819
- text: size,
820
- optionStyle: "{height:24}",
821
- onChange: value => this.changePaging('size', value)
822
- })
823
- }, {
824
- flex: 1
825
- }]
826
- };
827
- }
828
- setColumnIds() {
829
- let {
830
- columns = []
831
- } = this.state;
832
- for (let i = 0; i < columns.length; i++) {
833
- if (!columns[i].dataColumnId) {
834
- columns[i].dataColumnId = 'col' + Math.random();
835
- }
836
- }
837
- }
838
- render() {
839
- let {
840
- model,
841
- columns,
842
- className,
843
- style
844
- } = this.props;
845
- let {
846
- prevColumns
847
- } = this.state;
848
- let columnsStr = JSON.stringify(columns);
849
- if (columnsStr !== prevColumns) {
850
- let newColumns = JSON.parse(columnsStr);
851
- setTimeout(() => this.setState({
852
- columns: newColumns,
853
- prevColumns: columnsStr
854
- }, () => this.updateColumnsByStorageKey()), 0);
855
- }
856
- this.setColumnIds();
857
- //پیجینگ را زود تر می سازیم که دیفالت هاش محاسبه بشه
858
- let pagingLayout = this.paging_layout();
859
- this.getModelDetails(model);
860
- let context = this.getContext();
861
- return /*#__PURE__*/_react.default.createElement(TableContext.Provider, {
862
- value: context
863
- }, /*#__PURE__*/_react.default.createElement(_reactVirtualDom.default, {
864
- layout: {
865
- className: TableCLS.table + (className ? ' ' + className : ''),
866
- attrs: {
867
- ref: this.dom,
868
- onKeyDown: e => this.keyDown(e)
869
- },
870
- style,
871
- column: [this.toolbar_layout(), this.units_layout(), pagingLayout]
872
- }
873
- }));
874
- }
875
- }
876
- exports.default = Table;
877
- Table.defaultProps = {
878
- indent: 16,
879
- columnGap: 1,
880
- rowGap: 1,
881
- headerHeight: 48
882
- };
883
- class TableUnit extends _react.Component {
884
- constructor(props) {
885
- super(props);
886
- this.rowsRef = /*#__PURE__*/(0, _react.createRef)();
887
- this.resizeDown = functions.resizeDown;
888
- this.resizeMove = functions.resizeMove;
889
- this.resizeUp = functions.resizeUp;
890
- this.getClient = functions.getClient;
891
- }
892
- title_layout(column, setFlex) {
893
- if (column.show === false) {
894
- return false;
895
- }
896
- let resizable = column.resizable !== false && column.width && !column.flex;
897
- let {
898
- rowHeight,
899
- headerHeight
900
- } = this.context;
901
- let {
902
- width,
903
- flex,
904
- minWidth = 36,
905
- titleAttrs = {}
906
- } = column;
907
- if (setFlex) {
908
- width = undefined;
909
- flex = 1;
910
- }
911
- if (width === undefined && flex === undefined) {
912
- flex = 1;
913
- }
914
- return {
915
- size: width,
916
- align: 'vh',
917
- flex,
918
- style: {
919
- minWidth,
920
- height: headerHeight || rowHeight,
921
- ...titleAttrs.style
922
- },
923
- attrs: {
924
- ...titleAttrs,
925
- 'data-column-id': column.dataColumnId,
926
- className: undefined,
927
- style: undefined,
928
- draggable: column.swap !== false,
929
- onDragStart: e => {
930
- if (this.downOnResizeHandle) {
931
- e.stopPropagation();
932
- e.preventDefault();
933
- }
934
- this.startColumnSwap = column;
935
- },
936
- onDragOver: e => {
937
- e.preventDefault();
938
- },
939
- onDrop: () => {
940
- this.endColumnSwap = column;
941
- let {
942
- setColumns,
943
- state
944
- } = this.context;
945
- let {
946
- columns
947
- } = state;
948
- if (column.swap === false) {
949
- return;
950
- }
951
- if (this.startColumnSwap === undefined || this.startColumnSwap.dataColumnId === this.endColumnSwap.dataColumnId) {
952
- return;
953
- }
954
- let newColumns = columns.map((c, j) => {
955
- if (c.dataColumnId === this.startColumnSwap.dataColumnId) {
956
- return this.endColumnSwap;
957
- }
958
- if (c.dataColumnId === this.endColumnSwap.dataColumnId) {
959
- return this.startColumnSwap;
960
- }
961
- return c;
962
- });
963
- setColumns(newColumns);
964
- }
965
- },
966
- className: TableCLS.title + (titleAttrs.className ? ' ' + titleAttrs.className : ''),
967
- row: [this.resize_layout(column, resizable, 'start'), {
968
- html: column.title || '',
969
- flex: 1,
970
- align: column.titleJustify !== false ? 'h' : undefined
971
- }, this.filter_layout(column), this.resize_layout(column, resizable, 'end')]
972
- };
973
- }
974
- resize_layout(column, resizable, type) {
975
- if (!resizable) {
976
- return {
977
- size: 12
978
- };
979
- }
980
- return {
981
- size: 12,
982
- className: TableCLS.resizeHandle,
983
- style: {
984
- cursor: 'col-resize',
985
- height: '100%'
986
- },
987
- attrs: {
988
- onMouseDown: e => this.resizeDown(e, column, type),
989
- onTouchStart: e => this.resizeDown(e, column, type),
990
- draggable: false
991
- }
992
- };
993
- }
994
- filter_layout(column) {
995
- let {
996
- translate,
997
- rtl,
998
- state,
999
- setColumns
1000
- } = this.context;
1001
- let {
1002
- setColumn
1003
- } = state;
1004
- let {
1005
- filter,
1006
- type = 'text'
1007
- } = column;
1008
- if (!filter) {
1009
- return false;
1010
- }
1011
- if (filter === true) {
1012
- filter = {};
1013
- setColumn(column, {
1014
- filter: {}
1015
- });
1016
- }
1017
- let {
1018
- items = [],
1019
- booleanType = 'or',
1020
- add,
1021
- operators,
1022
- valueOptions
1023
- } = filter;
1024
- return {
1025
- html: /*#__PURE__*/_react.default.createElement(_aioButton.default, {
1026
- style: {
1027
- background: 'none',
1028
- color: 'inherit'
1029
- },
1030
- type: "button",
1031
- rtl: rtl,
1032
- caret: false,
1033
- text: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1034
- path: items.length ? _js.mdiFilterMenu : _js.mdiFilter,
1035
- size: 0.6
1036
- }),
1037
- popOver: () => {
1038
- let {
1039
- columns
1040
- } = this.props;
1041
- return /*#__PURE__*/_react.default.createElement(AIOTableFilterPopup, {
1042
- translate: translate,
1043
- type: type,
1044
- items: items,
1045
- booleanType: booleanType,
1046
- add: add,
1047
- operators: operators,
1048
- valueOptions: valueOptions,
1049
- onChangeBooleanType: booleanType => {
1050
- let {
1051
- filter
1052
- } = column;
1053
- filter.booleanType = booleanType;
1054
- setColumn(column, {
1055
- filter
1056
- });
1057
- state.saveColumnInStorage(column, 'filter', column.filter);
1058
- setColumns(columns);
1059
- if (column.onChangeFilter) {
1060
- column.onChangeFilter(column);
1061
- }
1062
- },
1063
- onChange: async items => {
1064
- let {
1065
- filter
1066
- } = column;
1067
- filter.items = items;
1068
- setColumn(column, {
1069
- filter
1070
- });
1071
- state.saveColumnInStorage(column, 'filter', column.filter);
1072
- setColumns(columns);
1073
- if (column.onChangeFilter) {
1074
- column.onChangeFilter(column);
1075
- }
1076
- }
1077
- });
1078
- }
1079
- })
1080
- };
1081
- }
1082
- group_layout(o) {
1083
- let {
1084
- groupHeight,
1085
- rowHeight,
1086
- indent,
1087
- rtl,
1088
- editGroupName = o => o
1089
- } = this.context;
1090
- let {
1091
- cellsType
1092
- } = this.props;
1093
- return {
1094
- style: {
1095
- position: 'sticky',
1096
- [rtl ? 'right' : 'left']: 0,
1097
- height: groupHeight || rowHeight
1098
- },
1099
- className: TableCLS.groupRow,
1100
- row: cellsType === 'unfreezeCells' ? [{
1101
- flex: 1
1102
- }] : [{
1103
- size: 12
1104
- }, {
1105
- size: o.groupLevel * indent
1106
- }, this.groupToggle_layout(o), {
1107
- html: editGroupName(o.value),
1108
- align: 'v'
1109
- }]
1110
- };
1111
- }
1112
- getGroupToggleIcon(open) {
1113
- let {
1114
- getToggleIcon,
1115
- rtl
1116
- } = this.context;
1117
- if (getToggleIcon) {
1118
- return getToggleIcon(!!open);
1119
- }
1120
- return /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1121
- path: open ? _js.mdiChevronDown : rtl ? _js.mdiChevronLeft : _js.mdiChevronRight,
1122
- size: 0.8
1123
- });
1124
- }
1125
- groupToggle_layout(o) {
1126
- let {
1127
- state,
1128
- SetState
1129
- } = this.context;
1130
- let {
1131
- groupsOpen
1132
- } = state;
1133
- return {
1134
- align: 'vh',
1135
- row: [{
1136
- className: TableCLS.rowToggle,
1137
- html: this.getGroupToggleIcon(o.groupOpen),
1138
- align: 'vh',
1139
- attrs: {
1140
- onClick: () => SetState({
1141
- groupsOpen: {
1142
- ...groupsOpen,
1143
- [o.id]: !groupsOpen[o.id]
1144
- }
1145
- })
1146
- }
1147
- }, {
1148
- size: 6
1149
- }]
1150
- };
1151
- }
1152
- row_layout(rowId, striped) {
1153
- let {
1154
- isRowOpen,
1155
- getRowDetailById,
1156
- columnGap,
1157
- rowTemplate,
1158
- getRowById,
1159
- toggleRow,
1160
- rowChilds,
1161
- indent_layout,
1162
- toggle_layout,
1163
- rowHeight
1164
- } = this.context;
1165
- if (!isRowOpen(rowId)) {
1166
- return false;
1167
- }
1168
- let rowDetail = getRowDetailById(rowId);
1169
- if (rowDetail._show === false) {
1170
- return false;
1171
- }
1172
- if (rowTemplate) {
1173
- let row = getRowById(rowId);
1174
- if (rowChilds) {
1175
- return {
1176
- style: {
1177
- overflow: 'visible'
1178
- },
1179
- size: rowHeight,
1180
- row: [indent_layout(rowId), toggle_layout(rowId, false), {
1181
- flex: 1,
1182
- html: rowTemplate(row, rowDetail),
1183
- className: TableCLS.rowTemplate,
1184
- style: {
1185
- overflow: 'visible'
1186
- }
1187
- }, {
1188
- size: 6
1189
- }]
1190
- };
1191
- }
1192
- return {
1193
- html: rowTemplate(row, rowDetail, () => toggleRow(rowId))
1194
- };
1195
- }
1196
- let {
1197
- cellsType
1198
- } = this.props;
1199
- let cells = rowDetail['_' + cellsType];
1200
- let isThereAnyFlex = false;
1201
- return {
1202
- className: TableCLS.row + (rowDetail._show === 'relative' ? ' row-relative-filter' : ''),
1203
- gap: columnGap,
1204
- style: {
1205
- overflow: 'visible'
1206
- },
1207
- row: cells.map((cell, i) => {
1208
- let res = cell(striped);
1209
- let {
1210
- html,
1211
- size,
1212
- flex,
1213
- minWidth = 36,
1214
- attrs
1215
- } = res;
1216
- if (size === undefined && flex === undefined) {
1217
- flex = 1;
1218
- }
1219
- if (flex !== undefined) {
1220
- isThereAnyFlex = true;
1221
- }
1222
- if (i === cells.length - 1 && !isThereAnyFlex) {
1223
- size = undefined;
1224
- flex = 1;
1225
- }
1226
- return {
1227
- style: {
1228
- height: '100%',
1229
- minWidth,
1230
- overflow: 'visible'
1231
- },
1232
- html,
1233
- size,
1234
- flex,
1235
- attrs
1236
- };
1237
- })
1238
- };
1239
- }
1240
- onSwap(f, t) {
1241
- debugger;
1242
- }
1243
- render() {
1244
- let {
1245
- rowGap
1246
- } = this.context,
1247
- {
1248
- cellsType,
1249
- onScroll
1250
- } = this.props;
1251
- let headerLayout = this.header_layout();
1252
- let rowsLayout = this.rows_layout();
1253
- let className = TableCLS.rows;
1254
- if (cellsType === 'freezeCells') {
1255
- className += ' ' + TableCLS.freezeContainer;
1256
- } else if (cellsType === 'unfreezeCells') {
1257
- className += ' ' + TableCLS.unfreezeContainer;
1258
- }
1259
- return /*#__PURE__*/_react.default.createElement(_reactVirtualDom.default, {
1260
- onSwap: (f, t) => this.onSwap(f, t),
1261
- layout: {
1262
- className,
1263
- column: [headerLayout, ...rowsLayout],
1264
- scroll: 'vh',
1265
- gap: rowGap,
1266
- flex: 1,
1267
- attrs: {
1268
- onScroll: () => onScroll(),
1269
- ref: this.rowsRef
1270
- }
1271
- }
1272
- });
1273
- }
1274
- header_layout() {
1275
- let {
1276
- rowTemplate,
1277
- columnGap,
1278
- showHeader
1279
- } = this.context;
1280
- let {
1281
- columns = []
1282
- } = this.props;
1283
- if (rowTemplate || showHeader === false) {
1284
- return false;
1285
- }
1286
- let isThereAnyFlex = false;
1287
- return {
1288
- gap: columnGap,
1289
- className: TableCLS.header,
1290
- row: columns.map((column, i) => {
1291
- let {
1292
- width,
1293
- flex
1294
- } = column;
1295
- if (width === undefined && flex === undefined) {
1296
- flex = 1;
1297
- }
1298
- if (flex !== undefined) {
1299
- isThereAnyFlex = true;
1300
- }
1301
- let setFlex = false;
1302
- if (i === columns.length - 1 && !isThereAnyFlex) {
1303
- setFlex = true;
1304
- }
1305
- return this.title_layout(column, setFlex);
1306
- })
1307
- };
1308
- }
1309
- rows_layout() {
1310
- let {
1311
- rows_array,
1312
- striped
1313
- } = this.context;
1314
- let index = -1;
1315
- return rows_array.map((o, i) => {
1316
- if (o._isGroup_) {
1317
- return this.group_layout(o);
1318
- }
1319
- index++;
1320
- return this.row_layout(o._id, index % 2 === 0 ? striped : undefined);
1321
- });
1322
- }
1323
- }
1324
- _defineProperty(TableUnit, "contextType", TableContext);
1325
- class Toolbar extends _react.Component {
1326
- constructor(...args) {
1327
- super(...args);
1328
- _defineProperty(this, "state", {
1329
- searchText: ''
1330
- });
1331
- }
1332
- changeSearch(value, time = 1000) {
1333
- clearTimeout(this.searchTimeout);
1334
- this.setState({
1335
- searchText: value
1336
- });
1337
- this.searchTimeout = setTimeout(() => this.context.SetState({
1338
- searchText: value
1339
- }), time);
1340
- }
1341
- getSearchbox() {
1342
- let {
1343
- translate,
1344
- getSearchs
1345
- } = this.context;
1346
- let searchs = getSearchs();
1347
- let {
1348
- searchText
1349
- } = this.state;
1350
- if (!searchs.length) {
1351
- return false;
1352
- }
1353
- return /*#__PURE__*/_react.default.createElement("div", {
1354
- className: TableCLS.searchBox,
1355
- key: "search"
1356
- }, /*#__PURE__*/_react.default.createElement("input", {
1357
- type: "text",
1358
- value: searchText,
1359
- placeholder: translate('Search'),
1360
- onChange: e => this.changeSearch(e.target.value)
1361
- }), /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1362
- path: searchText ? _js.mdiClose : _js.mdiMagnify,
1363
- size: 0.7,
1364
- onClick: () => {
1365
- if (!searchText) {
1366
- return;
1367
- }
1368
- this.changeSearch('', 0);
1369
- }
1370
- }));
1371
- }
1372
- getToggleButton() {
1373
- let {
1374
- state,
1375
- translate
1376
- } = this.context;
1377
- let {
1378
- columns,
1379
- setColumn
1380
- } = state;
1381
- if (!columns || !columns.length) {
1382
- return false;
1383
- }
1384
- let options = columns.filter(({
1385
- toggle
1386
- }) => toggle).map(column => {
1387
- return {
1388
- column,
1389
- text: column.title,
1390
- checked: column.show !== false
1391
- };
1392
- });
1393
- if (!options.length) {
1394
- return false;
1395
- }
1396
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, {
1397
- popupHeader: /*#__PURE__*/_react.default.createElement("div", {
1398
- className: TableCLS.toolbarPopupHeader
1399
- }, translate('Show Columns')),
1400
- key: "togglebutton",
1401
- caret: false,
1402
- type: "select",
1403
- options: options,
1404
- className: TableCLS.toolbarIconButton,
1405
- text: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1406
- path: _js.mdiEye,
1407
- size: 0.7
1408
- }),
1409
- onChange: (value, obj) => {
1410
- let {
1411
- state,
1412
- setColumns
1413
- } = this.context;
1414
- let {
1415
- columns
1416
- } = state;
1417
- let {
1418
- column
1419
- } = obj.option;
1420
- let {
1421
- show = true
1422
- } = column;
1423
- setColumn(column, {
1424
- show: !show
1425
- });
1426
- state.saveColumnInStorage(column, 'show', obj.option.column.show);
1427
- setColumns(columns);
1428
- }
1429
- });
1430
- }
1431
- getSortButton() {
1432
- let {
1433
- state,
1434
- model = [],
1435
- translate
1436
- } = this.context;
1437
- let sorts = state.Sort.get();
1438
- if (!sorts.length || !model.length) {
1439
- return false;
1440
- }
1441
- let options = sorts.map((sort, i) => {
1442
- return {
1443
- text: sort.title,
1444
- checked: !!sort.active,
1445
- after: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1446
- path: sort.dir === 'dec' ? _js.mdiArrowDown : _js.mdiArrowUp,
1447
- size: 0.8,
1448
- onClick: e => {
1449
- e.stopPropagation();
1450
- sorts[i].dir = sort.dir === 'dec' ? 'inc' : 'dec';
1451
- state.Sort.set(sorts);
1452
- }
1453
- })
1454
- };
1455
- });
1456
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, {
1457
- popupHeader: /*#__PURE__*/_react.default.createElement("div", {
1458
- className: TableCLS.toolbarPopupHeader
1459
- }, translate('Sort By')),
1460
- key: "sortbutton",
1461
- caret: false,
1462
- type: "select",
1463
- options: options,
1464
- className: TableCLS.toolbarIconButton,
1465
- text: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1466
- path: _js.mdiSort,
1467
- size: 0.7
1468
- }),
1469
- onChange: (value, obj) => {
1470
- sorts[obj.realIndex].active = !sorts[obj.realIndex].active;
1471
- state.Sort.set(sorts);
1472
- },
1473
- onSwap: (from, to, swap) => state.Sort.set(swap(sorts, from, to))
1474
- });
1475
- }
1476
- getExcelButton() {
1477
- let {
1478
- state,
1479
- rows_array,
1480
- getRowDetailById
1481
- } = this.context;
1482
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, {
1483
- key: "excelbutton",
1484
- caret: false,
1485
- type: "button",
1486
- className: TableCLS.toolbarIconButton,
1487
- text: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1488
- path: _js.mdiFileExcel,
1489
- size: 0.7
1490
- }),
1491
- onClick: () => state.Excel.export(rows_array.filter(({
1492
- _isGroup_
1493
- }) => !_isGroup_).map(({
1494
- _id
1495
- }) => getRowDetailById(_id)._json))
1496
- });
1497
- }
1498
- getGroupButton() {
1499
- var {
1500
- model,
1501
- state,
1502
- groups,
1503
- translate
1504
- } = this.context;
1505
- if (!groups.length || !model.length) {
1506
- return false;
1507
- }
1508
- let options = groups.map(group => {
1509
- return {
1510
- text: group.title,
1511
- checked: !!group.active
1512
- };
1513
- });
1514
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, {
1515
- popupHeader: /*#__PURE__*/_react.default.createElement("div", {
1516
- className: TableCLS.toolbarPopupHeader
1517
- }, translate('Group By')),
1518
- key: "groupbutton",
1519
- caret: false,
1520
- type: "select",
1521
- options: options,
1522
- className: TableCLS.toolbarIconButton,
1523
- text: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
1524
- path: _js.mdiFileTree,
1525
- size: 0.7
1526
- }),
1527
- onChange: (value, obj) => {
1528
- groups[obj.realIndex].active = !groups[obj.realIndex].active;
1529
- state.Group.set(groups);
1530
- },
1531
- onSwap: (from, to, swap) => state.Group.set(swap(groups, from, to))
1532
- });
1533
- }
1534
- getToolbarItems() {
1535
- var {
1536
- toolbarItems = []
1537
- } = this.context;
1538
- return toolbarItems.map(o => {
1539
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, _extends({}, o, {
1540
- className: TableCLS.toolbarItem + (o.className ? ' ' + o.className : '')
1541
- }));
1542
- });
1543
- }
1544
- getItems() {
1545
- let {
1546
- excel
1547
- } = this.context;
1548
- let items = [];
1549
- let searchBox = this.getSearchbox();
1550
- if (searchBox) {
1551
- items.push(searchBox);
1552
- }
1553
- let toggleButton = this.getToggleButton();
1554
- if (toggleButton) {
1555
- items.push(toggleButton);
1556
- }
1557
- let sortButton = this.getSortButton();
1558
- if (sortButton) {
1559
- items.push(sortButton);
1560
- }
1561
- let groupButton = this.getGroupButton();
1562
- if (groupButton) {
1563
- items.push(groupButton);
1564
- }
1565
- if (excel) {
1566
- items.push(this.getExcelButton());
1567
- }
1568
- let toolbarItems = this.getToolbarItems();
1569
- items = items.concat(toolbarItems);
1570
- return items;
1571
- }
1572
- render() {
1573
- let items = this.getItems();
1574
- if (!items.length) {
1575
- return null;
1576
- }
1577
- return /*#__PURE__*/_react.default.createElement("div", {
1578
- className: TableCLS.toolbar
1579
- }, items);
1580
- }
1581
- }
1582
- _defineProperty(Toolbar, "contextType", TableContext);
1583
- class Cell extends _react.Component {
1584
- constructor(props) {
1585
- super(props);
1586
- this.dataUniqId = 'cell' + Math.random();
1587
- }
1588
- getContent(row, column, value) {
1589
- let {
1590
- rows_object,
1591
- details_object,
1592
- verticalTabIndex
1593
- } = this.context;
1594
- let {
1595
- rowId,
1596
- colId
1597
- } = this.props;
1598
- if (this.inlineEdit) {
1599
- if (this.inlineEdit.type === 'text' || this.inlineEdit.type === 'number') {
1600
- let props = {
1601
- type: column.type,
1602
- className: TableCLS.inlineEditInput,
1603
- defaultValue: value,
1604
- tabIndex: verticalTabIndex ? colId : 0,
1605
- style: {
1606
- textAlign: column.justify ? 'center' : undefined
1607
- },
1608
- 'data-col-id': colId,
1609
- 'data-row-id': rowId,
1610
- onBlur: e => this.onChange(e.target.value)
1611
- };
1612
- return /*#__PURE__*/_react.default.createElement("input", props);
1613
- }
1614
- if (this.inlineEdit.type === 'select') {
1615
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, _extends({
1616
- attrs: {
1617
- 'data-col-id': colId,
1618
- 'data-row-id': rowId,
1619
- tabIndex: verticalTabIndex ? colId : 0
1620
- }
1621
- }, this.inlineEdit, {
1622
- className: TableCLS.inlineEditInput,
1623
- onChange: value => this.onChange(value),
1624
- text: value
1625
- }));
1626
- }
1627
- if (this.inlineEdit.type === 'checkbox') {
1628
- return /*#__PURE__*/_react.default.createElement(_aioButton.default, _extends({
1629
- attrs: {
1630
- 'data-col-id': colId,
1631
- 'data-row-id': rowId,
1632
- tabIndex: verticalTabIndex ? colId : 0
1633
- }
1634
- }, this.inlineEdit, {
1635
- className: TableCLS.inlineEditInput,
1636
- value: value,
1637
- style: {
1638
- padding: 0
1639
- },
1640
- onChange: value => this.onChange(!value)
1641
- }));
1642
- }
1643
- }
1644
- let {
1645
- templates = {}
1646
- } = this.context;
1647
- if (column.template && templates[column.template]) {
1648
- return templates[column.template](rows_object[rowId], details_object[rowId]);
1649
- } else {
1650
- return value;
1651
- }
1652
- }
1653
- async onChange(value) {
1654
- let {
1655
- column,
1656
- rowId
1657
- } = this.props;
1658
- let {
1659
- rows_object,
1660
- setModel
1661
- } = this.context;
1662
- let row = rows_object[rowId];
1663
- this.setState({
1664
- loading: true
1665
- });
1666
- if (this.inlineEdit.type === 'number' && !isNaN(+value)) {
1667
- value = +value;
1668
- }
1669
- if (this.inlineEdit.onChange) {
1670
- await this.inlineEdit.onChange(row, value);
1671
- } else {
1672
- setModel(this.setCellValue(row, column.field, value));
1673
- }
1674
- this.setState({
1675
- loading: false
1676
- });
1677
- }
1678
- setCellValue(row, field, value) {
1679
- //row is used in eval
1680
- let {
1681
- model
1682
- } = this.context;
1683
- let evalText;
1684
- if (typeof value === 'string') {
1685
- evalText = `${field} = "${value}"`;
1686
- } else {
1687
- evalText = field + ' = ' + JSON.stringify(value);
1688
- }
1689
- eval(evalText);
1690
- return model;
1691
- }
1692
- getInlineEdit(row, column) {
1693
- let inlineEdit = typeof column.inlineEdit === 'function' ? column.inlineEdit(row) : column.inlineEdit;
1694
- if (!inlineEdit) {
1695
- return false;
1696
- }
1697
- if (inlineEdit === true) {
1698
- inlineEdit = {};
1699
- }
1700
- let {
1701
- disabled = () => false,
1702
- type = column.type || 'text'
1703
- } = inlineEdit;
1704
- if (disabled(row)) {
1705
- return false;
1706
- }
1707
- return {
1708
- ...inlineEdit,
1709
- type
1710
- };
1711
- }
1712
- render() {
1713
- let {
1714
- getRowById,
1715
- rowHeight
1716
- } = this.context;
1717
- let {
1718
- column,
1719
- rowId,
1720
- value,
1721
- striped
1722
- } = this.props;
1723
- let row = getRowById(rowId);
1724
- let attrs = {},
1725
- style = {
1726
- overflow: 'visible'
1727
- };
1728
- if (column.cellAttrs) {
1729
- attrs = column.cellAttrs(row) || {};
1730
- if (attrs.style) {
1731
- style = attrs.style;
1732
- }
1733
- }
1734
- if (rowHeight) {
1735
- style.height = rowHeight;
1736
- }
1737
- if (typeof striped === 'string') {
1738
- style.background = striped;
1739
- } else if (Array.isArray(striped)) {
1740
- style.background = striped[0];
1741
- style.color = striped[1];
1742
- }
1743
- style = {
1744
- justifyContent: column.justify ? 'center' : undefined,
1745
- ...style
1746
- };
1747
- this.inlineEdit = this.getInlineEdit(row, column);
1748
- return /*#__PURE__*/_react.default.createElement(_reactVirtualDom.default, {
1749
- layout: {
1750
- className: TableCLS.cell + (attrs.className ? ' ' + attrs.className : '') + (striped === true ? ' striped' : ''),
1751
- attrs: {
1752
- ...attrs,
1753
- 'data-uniq-id': this.dataUniqId,
1754
- style: undefined,
1755
- className: undefined,
1756
- onClick: attrs.onClick ? () => attrs.onClick(row) : undefined
1757
- },
1758
- style,
1759
- row: [this.indent_layout(column.treeMode, rowId), this.toggle_layout(), this.before_layout(row, column), this.content_layout(row, column, value), this.after_layout(row, column)]
1760
- }
1761
- });
1762
- }
1763
- indent_layout(treeMode, rowId) {
1764
- if (!treeMode) {
1765
- return false;
1766
- }
1767
- return this.context.indent_layout(rowId);
1768
- }
1769
- toggle_layout() {
1770
- let {
1771
- column,
1772
- rowId
1773
- } = this.props;
1774
- if (!column.treeMode) {
1775
- return false;
1776
- }
1777
- let {
1778
- toggle_layout
1779
- } = this.context;
1780
- return toggle_layout(rowId);
1781
- }
1782
- before_layout(row, column) {
1783
- if (!column.before) {
1784
- return false;
1785
- }
1786
- let {
1787
- state
1788
- } = this.context;
1789
- let html = state.getValueByField(row, undefined, column.before);
1790
- return {
1791
- row: [{
1792
- className: TableCLS.cellBefore,
1793
- html
1794
- }, {
1795
- size: 6
1796
- }]
1797
- };
1798
- }
1799
- content_layout(row, column, value) {
1800
- let {
1801
- state
1802
- } = this.context;
1803
- let subtext = state.getValueByField(row, undefined, column.subtext);
1804
- if (subtext) {
1805
- return {
1806
- className: TableCLS.cellContent,
1807
- style: {
1808
- height: '100%'
1809
- },
1810
- align: 'v',
1811
- flex: 1,
1812
- column: [{
1813
- html: this.getContent(row, column, value),
1814
- align: column.justify ? 'vh' : 'v',
1815
- style: {
1816
- overflow: 'visible'
1817
- }
1818
- }, {
1819
- size: 3
1820
- }, {
1821
- html: subtext,
1822
- className: TableCLS.cellSubtext,
1823
- align: column.justify ? 'vh' : 'v'
1824
- }]
1825
- };
1826
- } else {
1827
- return {
1828
- className: TableCLS.cellContent,
1829
- align: column.justify ? 'vh' : 'v',
1830
- flex: 1,
1831
- html: this.getContent(row, column, value),
1832
- style: {
1833
- height: '100%'
1834
- }
1835
- };
1836
- }
1837
- }
1838
- after_layout(row, column) {
1839
- if (!column.after) {
1840
- return false;
1841
- }
1842
- let {
1843
- state
1844
- } = this.context;
1845
- let html = state.getValueByField(row, undefined, column.after);
1846
- return {
1847
- row: [{
1848
- className: TableCLS.cellAfter,
1849
- html
1850
- }]
1851
- };
1852
- }
1853
- }
1854
- _defineProperty(Cell, "contextType", TableContext);
1855
- function FilterResult(items = [], booleanType = 'or', value, reverse) {
1856
- let fn = {
1857
- and() {
1858
- if (value === undefined) {
1859
- return false;
1860
- }
1861
- for (let i = 0; i < items.length; i++) {
1862
- let {
1863
- operator: o,
1864
- value: v,
1865
- type
1866
- } = items[i];
1867
- if (v === '' || v === undefined) {
1868
- continue;
1869
- }
1870
- let a, b;
1871
- if (reverse) {
1872
- a = v;
1873
- b = value;
1874
- } else {
1875
- a = value;
1876
- b = v;
1877
- }
1878
- if (o === 'contain') {
1879
- if (!this.isContain(a, b)) {
1880
- return false;
1881
- }
1882
- continue;
1883
- }
1884
- if (o === 'notContain') {
1885
- if (this.isContain(a, b)) {
1886
- return false;
1887
- }
1888
- continue;
1889
- }
1890
- if (o === 'equal') {
1891
- if (!this.isEqual(a, b)) {
1892
- return false;
1893
- }
1894
- continue;
1895
- }
1896
- if (o === 'notEqual') {
1897
- if (this.isEqual(a, b)) {
1898
- return false;
1899
- }
1900
- continue;
1901
- }
1902
- if (o === 'greater') {
1903
- if (!this.isGreater(a, b, type)) {
1904
- return false;
1905
- }
1906
- continue;
1907
- }
1908
- if (o === 'less') {
1909
- if (!this.isLess(a, b, type)) {
1910
- return false;
1911
- }
1912
- continue;
1913
- }
1914
- }
1915
- return true;
1916
- },
1917
- or() {
1918
- if (value === undefined) {
1919
- return false;
1920
- }
1921
- for (let i = 0; i < items.length; i++) {
1922
- let {
1923
- operator: o,
1924
- value: v,
1925
- type
1926
- } = items[i];
1927
- if (v === '' || v === undefined) {
1928
- return true;
1929
- }
1930
- let a, b;
1931
- if (reverse) {
1932
- a = v;
1933
- b = value;
1934
- } else {
1935
- a = value;
1936
- b = v;
1937
- }
1938
- if (o === 'contain') {
1939
- if (this.isContain(a, b)) {
1940
- return true;
1941
- }
1942
- continue;
1943
- }
1944
- if (o === 'notContain') {
1945
- if (!this.isContain(a, b)) {
1946
- return true;
1947
- }
1948
- continue;
1949
- }
1950
- if (o === 'equal') {
1951
- if (this.isEqual(a, b)) {
1952
- return true;
1953
- }
1954
- continue;
1955
- }
1956
- if (o === 'notEqual') {
1957
- if (!this.isEqual(a, b)) {
1958
- return true;
1959
- }
1960
- continue;
1961
- }
1962
- if (o === 'greater') {
1963
- if (this.isGreater(a, b, type)) {
1964
- return true;
1965
- }
1966
- continue;
1967
- }
1968
- if (o === 'less') {
1969
- if (this.isLess(a, b, type)) {
1970
- return true;
1971
- }
1972
- continue;
1973
- }
1974
- }
1975
- return false;
1976
- },
1977
- isContain(text, subtext) {
1978
- return text.toString().toLowerCase().indexOf(subtext.toString().toLowerCase()) !== -1;
1979
- },
1980
- isEqual(a, b) {
1981
- return a.toString().toLowerCase() === b.toString().toLowerCase();
1982
- },
1983
- isGreater(a, b, type) {
1984
- if (type === 'date') {
1985
- return this.getDateNumber(a) > this.getDateNumber(b);
1986
- }
1987
- return parseFloat(a) > parseFloat(b);
1988
- },
1989
- getDateNumber(value) {
1990
- let splitter;
1991
- for (let i = 0; i < value.length; i++) {
1992
- if (isNaN(parseInt(value[i]))) {
1993
- splitter = value[i];
1994
- break;
1995
- }
1996
- }
1997
- let [year, month = '01', day = '01'] = value.split(splitter);
1998
- let list = [year, month, day];
1999
- return parseInt(list.map(o => o.length === 1 ? '0' + o : o).join(''));
2000
- },
2001
- isLess(a, b, type) {
2002
- if (type === 'date') {
2003
- return this.getDateNumber(a) < this.getDateNumber(b);
2004
- }
2005
- return parseFloat(a) < parseFloat(b);
2006
- }
2007
- };
2008
- if (items.length) {
2009
- return fn[booleanType]();
2010
- }
2011
- return true;
2012
- }
2013
- class AIOTableFilterPopup extends _react.Component {
2014
- items_layout() {
2015
- let {
2016
- items
2017
- } = this.props;
2018
- return {
2019
- column: items.map((item, i) => {
2020
- return {
2021
- column: [this.item_layout(item, i), this.boolean_layout(i)]
2022
- };
2023
- })
2024
- };
2025
- }
2026
- item_layout(item, itemIndex) {
2027
- let {
2028
- type,
2029
- items,
2030
- onChange,
2031
- translate = str => str,
2032
- add,
2033
- operators,
2034
- valueOptions
2035
- } = this.props;
2036
- return {
2037
- html: /*#__PURE__*/_react.default.createElement(AIOfilterItem, {
2038
- operator: item.operator,
2039
- value: item.value,
2040
- type: type,
2041
- translate: translate,
2042
- operators: operators,
2043
- operatorOptions: this.operatorOptions,
2044
- valueOptions: valueOptions,
2045
- add: add,
2046
- onChange: (key, value) => {
2047
- onChange(items.map((o, i) => {
2048
- if (itemIndex === i) {
2049
- return {
2050
- ...o,
2051
- [key]: value
2052
- };
2053
- }
2054
- return o;
2055
- }));
2056
- },
2057
- onRemove: add === false ? undefined : () => onChange(items.filter((o, i) => i !== itemIndex))
2058
- })
2059
- };
2060
- }
2061
- getOperatorOptions() {
2062
- let {
2063
- translate,
2064
- type,
2065
- operators = ['contain', 'notContain', 'equal', 'notEqual', 'greater', 'less']
2066
- } = this.props;
2067
- return [{
2068
- text: translate('Contain'),
2069
- value: 'contain',
2070
- show: type === 'text' && operators.indexOf('contain') !== -1
2071
- }, {
2072
- text: translate('Not Contain'),
2073
- value: 'notContain',
2074
- show: type === 'text' && operators.indexOf('notContain') !== -1
2075
- }, {
2076
- text: translate('Equal'),
2077
- value: 'equal',
2078
- show: operators.indexOf('equal') !== -1
2079
- }, {
2080
- text: translate('Not Equal'),
2081
- value: 'notEqual',
2082
- show: operators.indexOf('notEqual') !== -1
2083
- }, {
2084
- text: translate('Greater Than'),
2085
- value: 'greater',
2086
- show: (type === 'date' || type === 'number') && operators.indexOf('greater') !== -1
2087
- }, {
2088
- text: translate('Less Than'),
2089
- value: 'less',
2090
- show: (type === 'date' || type === 'number') && operators.indexOf('less') !== -1
2091
- }];
2092
- }
2093
- boolean_layout(index) {
2094
- let {
2095
- items,
2096
- translate = text => text,
2097
- booleanType,
2098
- onChangeBooleanType
2099
- } = this.props;
2100
- if (index >= items.length - 1) {
2101
- return false;
2102
- }
2103
- return {
2104
- html: translate(booleanType),
2105
- attrs: {
2106
- onClick: () => onChangeBooleanType(booleanType === 'or' ? 'and' : 'or')
2107
- },
2108
- align: 'vh'
2109
- };
2110
- }
2111
- add_layout() {
2112
- var {
2113
- type,
2114
- items,
2115
- onChange,
2116
- translate = str => str,
2117
- add
2118
- } = this.props;
2119
- if (add === false) {
2120
- return false;
2121
- }
2122
- return {
2123
- html: /*#__PURE__*/_react.default.createElement("button", {
2124
- className: TableCLS.addFilter,
2125
- onClick: () => onChange(items.concat({
2126
- operator: this.operatorOptions[0].value,
2127
- value: '',
2128
- type
2129
- }))
2130
- }, translate('Add'))
2131
- };
2132
- }
2133
- render() {
2134
- this.operatorOptions = this.getOperatorOptions();
2135
- return /*#__PURE__*/_react.default.createElement(_reactVirtualDom.default, {
2136
- layout: {
2137
- className: TableCLS.filterPopup,
2138
- style: {
2139
- minWidth: 250
2140
- },
2141
- column: [this.items_layout(), this.add_layout()]
2142
- }
2143
- });
2144
- }
2145
- }
2146
- class AIOfilterItem extends _react.Component {
2147
- constructor(props) {
2148
- super(props);
2149
- let {
2150
- value
2151
- } = this.props;
2152
- this.state = {
2153
- value,
2154
- prevValue: value
2155
- };
2156
- }
2157
- operator_layout() {
2158
- let {
2159
- onChange,
2160
- operator,
2161
- operatorOptions,
2162
- add
2163
- } = this.props;
2164
- if (add === false) {
2165
- return false;
2166
- }
2167
- return {
2168
- size: 90,
2169
- html: /*#__PURE__*/_react.default.createElement(_aioButton.default, {
2170
- style: {
2171
- width: '100%'
2172
- },
2173
- type: "select",
2174
- className: TableCLS.filterOperator,
2175
- value: operator,
2176
- options: operatorOptions,
2177
- onChange: value => onChange('operator', value)
2178
- })
2179
- };
2180
- }
2181
- value_layout() {
2182
- let {
2183
- type,
2184
- onChange,
2185
- valueOptions
2186
- } = this.props;
2187
- let {
2188
- value
2189
- } = this.state;
2190
- if (valueOptions) {
2191
- return {
2192
- flex: 1,
2193
- html: /*#__PURE__*/_react.default.createElement("select", {
2194
- className: TableCLS.filterValue,
2195
- type: type === 'number' ? 'number' : 'text',
2196
- value: value,
2197
- onChange: e => {
2198
- let value = e.target.value;
2199
- clearTimeout(this.timeout);
2200
- this.setState({
2201
- value
2202
- });
2203
- onChange('value', value);
2204
- }
2205
- }, valueOptions.map(({
2206
- value,
2207
- text
2208
- }) => {
2209
- return /*#__PURE__*/_react.default.createElement("option", {
2210
- value: value
2211
- }, text);
2212
- }))
2213
- };
2214
- }
2215
- return {
2216
- flex: 1,
2217
- html: /*#__PURE__*/_react.default.createElement("input", {
2218
- className: TableCLS.filterValue,
2219
- type: type === 'number' ? 'number' : 'text',
2220
- value: value,
2221
- onChange: e => {
2222
- let value = e.target.value;
2223
- clearTimeout(this.timeout);
2224
- this.setState({
2225
- value
2226
- });
2227
- this.timeout = setTimeout(() => onChange('value', value), 1000);
2228
- }
2229
- })
2230
- };
2231
- }
2232
- remove_layout() {
2233
- let {
2234
- onRemove
2235
- } = this.props;
2236
- if (!onRemove) {
2237
- return false;
2238
- }
2239
- return {
2240
- size: 24,
2241
- html: /*#__PURE__*/_react.default.createElement(_react2.Icon, {
2242
- path: _js.mdiClose,
2243
- size: 0.6,
2244
- onClick: () => onRemove()
2245
- }),
2246
- align: 'vh',
2247
- className: TableCLS.filterRemove
2248
- };
2249
- }
2250
- render() {
2251
- if (this.state.prevValue !== this.props.value) {
2252
- setTimeout(() => this.setState({
2253
- value: this.props.value,
2254
- prevValue: this.props.value
2255
- }), 0);
2256
- }
2257
- return /*#__PURE__*/_react.default.createElement(_reactVirtualDom.default, {
2258
- layout: {
2259
- className: TableCLS.filterItem,
2260
- gap: 3,
2261
- row: [this.operator_layout(), this.value_layout(), this.remove_layout()]
2262
- }
2263
- });
2264
- }
2265
- }
2266
- function Sort(getProps, getState, setColumns) {
2267
- let o = {
2268
- get() {
2269
- let {
2270
- columns = [],
2271
- setColumn
2272
- } = getState();
2273
- let sorts = [];
2274
- for (let i = 0; i < columns.length; i++) {
2275
- if (!columns[i].sort) {
2276
- continue;
2277
- }
2278
- if (typeof columns[i].sort !== 'object') {
2279
- let column = columns[i];
2280
- setColumn(column, {
2281
- sort: {}
2282
- });
2283
- }
2284
- let {
2285
- sort,
2286
- type = 'text',
2287
- field,
2288
- dataColumnId,
2289
- title
2290
- } = columns[i];
2291
- let {
2292
- dir = 'inc',
2293
- order,
2294
- active = true,
2295
- toggle = true
2296
- } = sort;
2297
- if (order === undefined) {
2298
- let newOrder = 0;
2299
- let orders = columns.filter(({
2300
- sort
2301
- }) => sort && sort.order !== undefined).map(({
2302
- sort
2303
- }) => sort.order);
2304
- while (orders.indexOf(newOrder) !== -1) {
2305
- newOrder++;
2306
- }
2307
- sort.order = newOrder;
2308
- }
2309
- sorts.push({
2310
- dir,
2311
- order: sort.order,
2312
- type,
2313
- field,
2314
- active,
2315
- toggle,
2316
- dataColumnId,
2317
- title
2318
- });
2319
- }
2320
- sorts = sorts.sort(({
2321
- order: a
2322
- }, {
2323
- order: b
2324
- }) => a - b);
2325
- return sorts;
2326
- },
2327
- sort(model, sorts) {
2328
- let {
2329
- getValueByField
2330
- } = getState();
2331
- return model.sort((a, b) => {
2332
- for (let i = 0; i < sorts.length; i++) {
2333
- let {
2334
- field,
2335
- dir,
2336
- active
2337
- } = sorts[i];
2338
- if (!active) {
2339
- continue;
2340
- }
2341
- let aValue = getValueByField(a, undefined, field),
2342
- bValue = getValueByField(b, undefined, field);
2343
- if (aValue < bValue) {
2344
- return -1 * (dir === 'dec' ? -1 : 1);
2345
- }
2346
- if (aValue > bValue) {
2347
- return 1 * (dir === 'dec' ? -1 : 1);
2348
- }
2349
- if (i === sorts.length - 1) {
2350
- return 0;
2351
- }
2352
- }
2353
- return 0;
2354
- });
2355
- },
2356
- updateColumns(sorts) {
2357
- let {
2358
- columns,
2359
- saveColumnInStorage
2360
- } = getState();
2361
- for (let i = 0; i < sorts.length; i++) {
2362
- let sort = sorts[i];
2363
- let {
2364
- dir,
2365
- active,
2366
- dataColumnId
2367
- } = sort;
2368
- let column = columns.filter(c => c.dataColumnId === dataColumnId)[0];
2369
- column.sort = {
2370
- ...column.sort,
2371
- dir,
2372
- active,
2373
- order: i
2374
- };
2375
- saveColumnInStorage(column, 'sort', column.sort);
2376
- }
2377
- setColumns(columns);
2378
- },
2379
- async set(sorts) {
2380
- sorts = sorts || this.get();
2381
- if (!sorts.length) {
2382
- return;
2383
- }
2384
- let {
2385
- model,
2386
- onChangeSorts,
2387
- setModel
2388
- } = getProps();
2389
- if (onChangeSorts) {
2390
- let res = await onChangeSorts(sorts, this.sort(model, sorts));
2391
- if (res !== false) {
2392
- this.updateColumns(sorts);
2393
- }
2394
- } else if (setModel) {
2395
- setModel(this.sort(model, sorts));
2396
- this.updateColumns(sorts);
2397
- } else {
2398
- console.error('AIOTable Error => you set sort in columns but missing setModel or onChangeSort props.');
2399
- }
2400
- }
2401
- };
2402
- return {
2403
- set: o.set.bind(o),
2404
- get: o.get.bind(o)
2405
- };
2406
- }
2407
- function Group(getProps, getState, setColumns) {
2408
- let o = {
2409
- getGroupModel(model, groups) {
2410
- let {
2411
- getValueByField
2412
- } = getState();
2413
- let newModel = {};
2414
- for (let i = 0; i < model.length; i++) {
2415
- let row = model[i],
2416
- obj = newModel,
2417
- values = groups.map(group => getValueByField(row, undefined, group.field));
2418
- //let show = row._detail._show
2419
- for (let j = 0; j < values.length; j++) {
2420
- let value = values[j];
2421
- if (j === values.length - 1) {
2422
- obj[value] = obj[value] || [];
2423
- obj[value].push(row);
2424
- } else {
2425
- obj[value] = obj[value] || {};
2426
- obj = obj[value];
2427
- }
2428
- }
2429
- }
2430
- return newModel;
2431
- },
2432
- getGroupRows(model) {
2433
- var {
2434
- groupsOpen
2435
- } = getState();
2436
- function msf(obj, level, parents) {
2437
- if (Array.isArray(obj)) {
2438
- groupedRows = groupedRows.concat(obj);
2439
- } else {
2440
- for (var prop in obj) {
2441
- let newParents = parents.concat(prop),
2442
- id = newParents.toString();
2443
- groupsOpen[id] = groupsOpen[id] === undefined ? true : groupsOpen[id];
2444
- groupedRows.push({
2445
- _isGroup_: true,
2446
- value: prop,
2447
- id,
2448
- groupLevel: level,
2449
- groupOpen: groupsOpen[id]
2450
- });
2451
- if (groupsOpen[id]) {
2452
- msf(obj[prop], level + 1, newParents);
2453
- }
2454
- }
2455
- }
2456
- }
2457
- var groupedRows = [],
2458
- level = 0;
2459
- msf(model, level, []);
2460
- return groupedRows;
2461
- },
2462
- groupBy(model, groups = []) {
2463
- if (!groups.length) {
2464
- return model;
2465
- }
2466
- const groupModel = this.getGroupModel(model, groups);
2467
- return this.getGroupRows(groupModel);
2468
- },
2469
- updateColumns(groups) {
2470
- let {
2471
- columns = [],
2472
- saveColumnInStorage
2473
- } = getState();
2474
- for (let i = 0; i < groups.length; i++) {
2475
- let group = groups[i];
2476
- let {
2477
- active,
2478
- dataColumnId
2479
- } = group;
2480
- let column = columns.filter(c => c.dataColumnId === dataColumnId)[0];
2481
- column.group = {
2482
- ...column.group,
2483
- active,
2484
- order: i
2485
- };
2486
- saveColumnInStorage(column, 'group', column.group);
2487
- }
2488
- setColumns(columns);
2489
- },
2490
- get() {
2491
- let {
2492
- columns = []
2493
- } = getState();
2494
- let groups = [];
2495
- for (let i = 0; i < columns.length; i++) {
2496
- if (!columns[i].group) {
2497
- continue;
2498
- }
2499
- if (typeof columns[i].group !== 'object') {
2500
- columns[i].group = {};
2501
- }
2502
- let {
2503
- group,
2504
- type = 'text',
2505
- field,
2506
- dataColumnId,
2507
- title
2508
- } = columns[i];
2509
- let {
2510
- order,
2511
- active = true
2512
- } = group;
2513
- if (order === undefined) {
2514
- let newOrder = 0;
2515
- let orders = columns.filter(({
2516
- group
2517
- }) => group && group.order !== undefined).map(({
2518
- group
2519
- }) => group.order);
2520
- while (orders.indexOf(newOrder) !== -1) {
2521
- newOrder++;
2522
- }
2523
- group.order = newOrder;
2524
- }
2525
- groups.push({
2526
- order: group.order,
2527
- type,
2528
- field,
2529
- active,
2530
- dataColumnId,
2531
- title
2532
- });
2533
- }
2534
- groups = groups.sort(({
2535
- order: a
2536
- }, {
2537
- order: b
2538
- }) => a - b);
2539
- return groups;
2540
- },
2541
- set(groups) {
2542
- this.updateColumns(groups);
2543
- }
2544
- };
2545
- return {
2546
- get: o.get.bind(o),
2547
- set: o.set.bind(o),
2548
- groupBy: o.groupBy.bind(o)
2549
- };
2550
- }
2551
- function Excel(getProps) {
2552
- let o = {
2553
- fixPersianAndArabicNumbers(str) {
2554
- if (typeof srt !== 'string') {
2555
- return str;
2556
- }
2557
- var persianNumbers = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g],
2558
- arabicNumbers = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g];
2559
- for (var i = 0; i < 10; i++) {
2560
- str = str.replace(persianNumbers[i], i).replace(arabicNumbers[i], i);
2561
- }
2562
- return str;
2563
- },
2564
- getJSON(rows) {
2565
- let result = [];
2566
- for (let i = 0; i < rows.length; i++) {
2567
- let json = rows[i],
2568
- fixedJson = {};
2569
- for (let prop in json) {
2570
- fixedJson[prop] = this.fixPersianAndArabicNumbers(json[prop]);
2571
- }
2572
- result.push(fixedJson);
2573
- }
2574
- return result;
2575
- },
2576
- export(rows) {
2577
- let {
2578
- translate
2579
- } = getProps();
2580
- let name = window.prompt(translate('Inter Excel File Name'));
2581
- if (!name || name === null || !name.length) return;
2582
- var data = this.getJSON(rows);
2583
- var arrData = typeof data != "object" ? JSON.parse(data) : data;
2584
- var CSV = "";
2585
- // CSV += 'title';
2586
- CSV += '\r\n\n';
2587
- if (true) {
2588
- let row = "";
2589
- for (let index in arrData[0]) {
2590
- row += index + ",";
2591
- }
2592
- row = row.slice(0, -1);
2593
- CSV += row + "\r\n";
2594
- }
2595
- for (var i = 0; i < arrData.length; i++) {
2596
- let row = "";
2597
- for (let index in arrData[i]) {
2598
- row += '"' + arrData[i][index] + '",';
2599
- }
2600
- row.slice(0, row.length - 1);
2601
- CSV += row + "\r\n";
2602
- }
2603
- if (CSV === "") {
2604
- alert("Invalid data");
2605
- return;
2606
- }
2607
- var fileName = name.replace(/ /g, "_");
2608
- var universalBOM = "\uFEFF";
2609
- var uri = "data:text/csv;charset=utf-8," + encodeURIComponent(universalBOM + CSV);
2610
- var link = document.createElement("a");
2611
- link.href = uri;
2612
- link.style = "visibility:hidden";
2613
- link.download = fileName + ".csv";
2614
- document.body.appendChild(link);
2615
- link.click();
2616
- document.body.removeChild(link);
2617
- }
2618
- };
2619
- return {
2620
- export: o.export.bind(o)
2621
- };
2622
- }
2623
- let functions = {
2624
- async onScroll(index) {
2625
- let {
2626
- lazyLoad = {}
2627
- } = this.props;
2628
- let {
2629
- onScrollEnd
2630
- } = lazyLoad;
2631
- if (onScrollEnd) {
2632
- // if(index === undefined || index === 0){
2633
- // let table = $(this.dom.current).find('.' + TableCLS.rows);
2634
- // let scrollTop = table.scrollTop();
2635
- // let scrollHeight = table[0].scrollHeight;
2636
- // let height = table.height();
2637
- // if(scrollTop + height === scrollHeight){
2638
- // let {startIndex} = getState();
2639
- // let {lazyLength,totalLength} = lazyLoad;
2640
- // let from = startIndex + lazyLength;
2641
- // if(from > totalLength){return;}
2642
- // let to = from + lazyLength;
2643
- // if(to > totalLength){to = totalLength;}
2644
- // let a = $(dom.current).find('.aio-table-main-loading')
2645
- // a.css({display:'flex'})
2646
- // let res = await onScrollEnd(from,to);
2647
- // a.css({display:'none'})
2648
- // if(res !== false){
2649
- // setState({startIndex:from})
2650
- // }
2651
- // }
2652
- // }
2653
- }
2654
- if (index === undefined) {
2655
- return;
2656
- }
2657
- if (!this['scroll' + index]) {
2658
- let otherIndex = Number(!index);
2659
- this['scroll' + otherIndex] = true;
2660
- let c = (0, _jquery.default)(this.dom.current);
2661
- var units = [c.find('.' + TableCLS.freezeContainer), c.find('.' + TableCLS.unfreezeContainer)];
2662
- var scrollTop = units[index].scrollTop();
2663
- units[otherIndex].scrollTop(scrollTop);
2664
- }
2665
- this['scroll' + index] = false;
2666
- },
2667
- getValueByField(row, column, field) {
2668
- try {
2669
- if (field === undefined) {
2670
- field = column.field;
2671
- }
2672
- let type = typeof field;
2673
- if (type === 'function') {
2674
- return field(row, column);
2675
- }
2676
- if (type === 'string') {
2677
- if (field.indexOf('.') !== -1 && (field.indexOf('row') !== -1 || field.indexOf('column') !== -1 || field.indexOf('props') !== -1)) {
2678
- let result;
2679
- eval('result = ' + field);
2680
- return result;
2681
- }
2682
- return field;
2683
- }
2684
- return field;
2685
- } catch {
2686
- return;
2687
- }
2688
- },
2689
- getSearchs() {
2690
- let {
2691
- columns = []
2692
- } = this.state;
2693
- let searchs = [];
2694
- for (let i = 0; i < columns.length; i++) {
2695
- let {
2696
- show = true,
2697
- search,
2698
- field
2699
- } = columns[i];
2700
- if (!show || !search) {
2701
- continue;
2702
- }
2703
- searchs.push(field);
2704
- }
2705
- return searchs;
2706
- },
2707
- getFilterResult(row, detail) {
2708
- let {
2709
- searchText,
2710
- getValueByField
2711
- } = this.state;
2712
- let searchs = this.getSearchs();
2713
- if (searchText && searchs.length) {
2714
- let items = searchs.map(field => {
2715
- return {
2716
- operator: 'contain',
2717
- value: getValueByField(row, undefined, field).toString()
2718
- };
2719
- });
2720
- if (FilterResult(items, 'or', searchText, true) === false) {
2721
- return false;
2722
- }
2723
- }
2724
- let {
2725
- columns = []
2726
- } = this.state;
2727
- for (let i = 0; i < columns.length; i++) {
2728
- let column = columns[i];
2729
- let {
2730
- filter,
2731
- dataColumnId
2732
- } = column;
2733
- if (!filter) {
2734
- continue;
2735
- }
2736
- if (filter === true) {
2737
- filter = {};
2738
- column.filter = {};
2739
- }
2740
- let {
2741
- items = [],
2742
- booleanType = 'or'
2743
- } = filter;
2744
- if (!items.length) {
2745
- continue;
2746
- }
2747
- let value = detail._values[dataColumnId];
2748
- if (FilterResult(items, booleanType, value) === false) {
2749
- return false;
2750
- }
2751
- }
2752
- return true;
2753
- },
2754
- isRowOpen(id) {
2755
- if (!this.props.rowChilds) {
2756
- return true;
2757
- }
2758
- let {
2759
- _parentIds
2760
- } = this.getRowDetailById(id);
2761
- for (let i = 0; i < _parentIds.length; i++) {
2762
- let parentId = _parentIds[i];
2763
- if (this.getRowDetailById(parentId)._open === false) {
2764
- return false;
2765
- }
2766
- }
2767
- return true;
2768
- },
2769
- ///ok
2770
- getClient(e) {
2771
- return this.context.touch ? [e.changedTouches[0].clientX, e.changedTouches[0].clientY] : [e.clientX, e.clientY];
2772
- },
2773
- ///ok
2774
- resizeDown(e, column, type) {
2775
- e.stopPropagation();
2776
- this.downOnResizeHandle = true;
2777
- let {
2778
- state
2779
- } = this.context;
2780
- let {
2781
- touch
2782
- } = state;
2783
- this.resized = false;
2784
- (0, _jquery.default)(window).bind(touch ? 'touchmove' : 'mousemove', _jquery.default.proxy(this.resizeMove, this));
2785
- (0, _jquery.default)(window).bind(touch ? 'touchend' : 'mouseup', _jquery.default.proxy(this.resizeUp, this));
2786
- this.resizeDetails = {
2787
- client: this.getClient(e),
2788
- width: column.width,
2789
- column,
2790
- type
2791
- };
2792
- },
2793
- ///ok
2794
- resizeMove(e) {
2795
- this.resized = true;
2796
- var {
2797
- rtl
2798
- } = this.props;
2799
- var Client = this.getClient(e);
2800
- var {
2801
- client,
2802
- width,
2803
- column,
2804
- type
2805
- } = this.resizeDetails;
2806
- var offset = (Client[0] - client[0]) * (type === 'start' ? -1 : 1);
2807
- let newWidth = width + offset * (rtl ? -1 : 1);
2808
- if (newWidth < parseInt(column.minWidth || 36)) {
2809
- newWidth = parseInt(column.minWidth || 36);
2810
- }
2811
- this.resizeDetails.newWidth = newWidth;
2812
- if (newWidth % 10 !== 0) {
2813
- return;
2814
- }
2815
- (0, _jquery.default)(`[data-column-id='${column.dataColumnId}']`).css({
2816
- width: newWidth
2817
- });
2818
- },
2819
- ///ok
2820
- resizeUp() {
2821
- this.downOnResizeHandle = false;
2822
- let {
2823
- state,
2824
- setColumns
2825
- } = this.context;
2826
- let {
2827
- touch
2828
- } = state;
2829
- (0, _jquery.default)(window).unbind(touch ? 'touchmove' : 'mousemove', this.resizeMove);
2830
- (0, _jquery.default)(window).unbind(touch ? 'touchend' : 'mouseup', this.resizeUp);
2831
- if (!this.resized) {
2832
- return;
2833
- }
2834
- let {
2835
- columns
2836
- } = state;
2837
- let {
2838
- newWidth,
2839
- column
2840
- } = this.resizeDetails;
2841
- column.width = newWidth;
2842
- state.saveColumnInStorage(column, 'width', newWidth);
2843
- setColumns(columns);
2844
- }
2845
- };
2846
- function convertFlatModel({
2847
- model,
2848
- childsField,
2849
- getId,
2850
- getParentId
2851
- }) {
2852
- var convertModelRecursive = (array, parentId, parentObject) => {
2853
- for (let i = 0; i < array.length; i++) {
2854
- let row = array[i];
2855
- let rowParentId = getParentId(row);
2856
- if (rowParentId !== parentId) {
2857
- continue;
2858
- }
2859
- let rowId = getId(row);
2860
- row[childsField] = [];
2861
- parentObject.push(row);
2862
- array.splice(i, 1);
2863
- i--;
2864
- convertModelRecursive([...array], rowId, row[childsField]);
2865
- }
2866
- };
2867
- var result = [];
2868
- convertModelRecursive([...model], undefined, result);
2869
- return result;
2870
- }
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { createElement as _createElement } from "react";
11
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
12
+ import { createContext, createRef, Fragment, useContext, useEffect, useRef, useState } from "react";
13
+ import AIOInput from "aio-input";
14
+ import * as UT from 'aio-utils';
15
+ import "./index.css";
16
+ const Context = createContext({});
17
+ const Provider = (p) => _jsx(Context.Provider, { value: p.value, children: p.children });
18
+ const useProvider = () => useContext(Context);
19
+ const AIOTable = (rootProps) => {
20
+ let { paging, getValue = {}, value, onChange = () => { }, onAdd, onRemove, excel, onSwap, onSearch, rowAttrs, onChangeSort, className } = rootProps;
21
+ let [dom] = useState(createRef());
22
+ let [searchValue, setSearchValue] = useState('');
23
+ let [columns, setColumns] = useState([]);
24
+ let [searchColumns, setSearchColumns] = useState([]);
25
+ let [excelColumns, setExcelColumns] = useState([]);
26
+ const getIconRef = useRef(new UT.GetSvg());
27
+ const getIcon = getIconRef.current.getIcon;
28
+ let [temp] = useState({});
29
+ const DragRows = UT.useDrag((dragData, dropData, reOrder) => {
30
+ const { dragIndex } = dragData;
31
+ const { dropIndex, rows } = dropData;
32
+ const newRows = reOrder(rows, dragIndex, dropIndex);
33
+ const from = rows[dragIndex];
34
+ const to = rows[dropIndex];
35
+ if (typeof onSwap === 'function') {
36
+ onSwap(newRows, from, to);
37
+ }
38
+ else {
39
+ onChange(newRows);
40
+ }
41
+ });
42
+ const DragColumns = UT.useDrag((dragIndex, dropIndex, reOrder) => setColumns(reOrder(columns, dragIndex, dropIndex)));
43
+ let [sorts, setSorts] = useState([]);
44
+ function getColumns() {
45
+ let { columns = [] } = rootProps;
46
+ let searchColumns = [], excelColumns = [];
47
+ let updatedColumns = columns.map((o) => {
48
+ let { id = 'aitc' + Math.round(Math.random() * 1000000), sort, search, excel } = o;
49
+ let column = Object.assign(Object.assign({}, o), { _id: id });
50
+ if (search) {
51
+ searchColumns.push(column);
52
+ }
53
+ if (excel) {
54
+ excelColumns.push(column);
55
+ }
56
+ return column;
57
+ });
58
+ setColumns(updatedColumns);
59
+ setSearchColumns(searchColumns);
60
+ setExcelColumns(excelColumns);
61
+ return updatedColumns;
62
+ }
63
+ function getSorts(columns) {
64
+ let sorts = [];
65
+ for (let i = 0; i < columns.length; i++) {
66
+ let column = columns[i];
67
+ let { _id } = column;
68
+ let sort = column.sort === true ? {} : column.sort;
69
+ if (!sort) {
70
+ continue;
71
+ }
72
+ let { active = false, dir = 'dec' } = sort;
73
+ let getValue;
74
+ if (sort.getValue) {
75
+ getValue = sort.getValue;
76
+ }
77
+ else {
78
+ getValue = (row) => getDynamics({ value: column.value, row, column });
79
+ }
80
+ let type = sort.type || 'string';
81
+ let sortItem = { dir, title: sort.title || column.title, sortId: _id, active, type, getValue };
82
+ sorts.push(sortItem);
83
+ }
84
+ setSorts(sorts);
85
+ }
86
+ function getDynamics(p) {
87
+ let { value, row, column, def, rowIndex } = p;
88
+ if (paging) {
89
+ let { number, size } = paging;
90
+ if (rowIndex)
91
+ rowIndex += ((number - 1) * size);
92
+ }
93
+ let type = typeof value;
94
+ if (type === 'string') {
95
+ let result = value;
96
+ let param = { row: row, column: column, rowIndex: rowIndex };
97
+ if (getValue[value]) {
98
+ result = getValue[value](Object.assign(Object.assign({}, param), { change: () => { } }));
99
+ }
100
+ else if (value.indexOf('row.') !== -1) {
101
+ try {
102
+ eval(`result = ${value}`);
103
+ }
104
+ catch (_a) {
105
+ result = '';
106
+ }
107
+ }
108
+ return result === undefined ? def : result;
109
+ }
110
+ if (type === 'undefined') {
111
+ return def;
112
+ }
113
+ if (type === 'function') {
114
+ return value({ row, column, rowIndex });
115
+ }
116
+ return value === undefined ? def : value;
117
+ }
118
+ useEffect(() => { getSorts(getColumns()); }, []);
119
+ function add() {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ if (!onAdd) {
122
+ return;
123
+ }
124
+ const row = yield onAdd();
125
+ if (!row) {
126
+ return;
127
+ }
128
+ onChange([Object.assign({}, row), ...value]);
129
+ });
130
+ }
131
+ function remove(row, index) {
132
+ let action = () => onChange(value.filter((o) => o._id !== row._id));
133
+ typeof onRemove === 'function' ? onRemove({ row, action, rowIndex: index }) : action();
134
+ }
135
+ function exportToExcel() {
136
+ let list = [];
137
+ if (typeof rootProps.excel === 'function') {
138
+ list = rootProps.excel(value);
139
+ }
140
+ else {
141
+ for (let i = 0; i < value.length; i++) {
142
+ let row = value[i], json = {};
143
+ for (let j = 0; j < excelColumns.length; j++) {
144
+ let column = excelColumns[j], { excel, value } = column;
145
+ let key = '';
146
+ if (excel === true) {
147
+ if (typeof column.title === 'string') {
148
+ key = column.title;
149
+ }
150
+ else {
151
+ key = 'untitle';
152
+ }
153
+ }
154
+ else if (typeof excel === 'string') {
155
+ key = excel;
156
+ }
157
+ else {
158
+ continue;
159
+ }
160
+ json[key] = getDynamics({ value, row, column, rowIndex: i });
161
+ }
162
+ list.push(json);
163
+ }
164
+ }
165
+ UT.ExportToExcel(list, { promptText: typeof excel === 'string' ? excel : 'Inter Excel File Name' });
166
+ }
167
+ function getSearchedRows(rows) {
168
+ if (onSearch !== true) {
169
+ return rows;
170
+ }
171
+ if (!searchColumns.length || !searchValue) {
172
+ return rows;
173
+ }
174
+ return UT.Search(rows, searchValue, (row, index) => {
175
+ let str = '';
176
+ for (let i = 0; i < searchColumns.length; i++) {
177
+ let column = searchColumns[i];
178
+ let value = getDynamics({ value: column.value, row, def: '', column, rowIndex: index });
179
+ if (value) {
180
+ str += value + ' ';
181
+ }
182
+ }
183
+ return str;
184
+ });
185
+ }
186
+ function sortRows(rows, sorts) {
187
+ if (!rows) {
188
+ return [];
189
+ }
190
+ if (!sorts || !sorts.length) {
191
+ return rows;
192
+ }
193
+ return rows.sort((a, b) => {
194
+ for (let i = 0; i < sorts.length; i++) {
195
+ let { dir, getValue } = sorts[i];
196
+ if (!getValue) {
197
+ return 0;
198
+ }
199
+ let aValue = getValue(a), bValue = getValue(b);
200
+ if (aValue < bValue) {
201
+ return -1 * (dir === 'dec' ? -1 : 1);
202
+ }
203
+ if (aValue > bValue) {
204
+ return 1 * (dir === 'dec' ? -1 : 1);
205
+ }
206
+ if (i === sorts.length - 1) {
207
+ return 0;
208
+ }
209
+ }
210
+ return 0;
211
+ });
212
+ }
213
+ function getSortedRows(rows) {
214
+ if (temp.isInitSortExecuted) {
215
+ return rows;
216
+ }
217
+ if (onChangeSort) {
218
+ return rows;
219
+ }
220
+ let activeSorts = sorts.filter((sort) => sort.active !== false);
221
+ if (!activeSorts.length || !rows.length) {
222
+ return rows;
223
+ }
224
+ temp.isInitSortExecuted = true;
225
+ let sortedRows = sortRows(rows, activeSorts);
226
+ onChange(sortedRows);
227
+ return sortedRows;
228
+ }
229
+ function getRows() {
230
+ let searchedRows = getSearchedRows(value);
231
+ let sortedRows = getSortedRows(searchedRows);
232
+ let pagedRows = paging && !paging.serverSide ? sortedRows.slice((paging.number - 1) * paging.size, paging.number * paging.size) : sortedRows;
233
+ return { rows: value, searchedRows, sortedRows, pagedRows };
234
+ }
235
+ //calculate style of cells and title cells
236
+ function getCellStyle(column) {
237
+ let width = getDynamics({ value: column.width });
238
+ let minWidth = getDynamics({ value: column.minWidth });
239
+ return { width: width ? width : undefined, flex: width ? undefined : 1, minWidth };
240
+ }
241
+ const getCellAttrs = ({ row, rowIndex, column, type }) => {
242
+ let { cellAttrs, titleAttrs } = column;
243
+ let attrs = getDynamics({ value: type === 'title' ? titleAttrs : cellAttrs, column, def: {}, row, rowIndex });
244
+ let justify = getDynamics({ value: column.justify, def: false });
245
+ let cls = `aio-input-table-${type}` + (justify ? ` aio-input-table-${type}-justify` : '');
246
+ attrs = UT.AddToAttrs(attrs, { className: cls, style: getCellStyle(column) });
247
+ if (type === 'title') {
248
+ attrs.title = getDynamics({ value: column.title, def: '' });
249
+ }
250
+ return Object.assign({}, attrs);
251
+ };
252
+ function getRowAttrs(row, rowIndex) {
253
+ let attrs = rowAttrs ? rowAttrs({ row, rowIndex }) : {};
254
+ let obj = UT.AddToAttrs(attrs, { className: 'aio-input-table-row' });
255
+ if (onSwap) {
256
+ obj = Object.assign(Object.assign(Object.assign({}, obj), DragRows.getDragAttrs({ dragIndex: rowIndex })), DragRows.getDropAttrs({ dropIndex: rowIndex, rows: value }));
257
+ }
258
+ return obj;
259
+ }
260
+ function search(searchValue) {
261
+ if (onSearch === true) {
262
+ setSearchValue(searchValue);
263
+ }
264
+ else if (typeof onSearch === 'function') {
265
+ onSearch(searchValue);
266
+ }
267
+ }
268
+ let ROWS = getRows();
269
+ let attrs = UT.AddToAttrs(rootProps.attrs, { className: ['aio-input aio-input-table', className], style: rootProps.style, attrs: { ref: dom } });
270
+ return (_jsx(Provider, { value: {
271
+ ROWS, rootProps, columns, sorts, setSorts, sortRows, excelColumns, getCellAttrs, getRowAttrs,
272
+ add, remove, search, exportToExcel, getDynamics, DragColumns, getIcon
273
+ }, children: _jsxs("div", Object.assign({}, attrs, { children: [_jsx(TableToolbar, {}), _jsxs("div", { className: 'aio-input-table-unit aio-input-scroll', children: [_jsx(TableHeader, {}), _jsx(TableRows, {})] }), !!paging && !!ROWS.rows.length ? _jsx(TablePaging, {}) : ''] })) }));
274
+ };
275
+ export default AIOTable;
276
+ const TableGap = ({ dir }) => {
277
+ const { rootProps } = useProvider(), { rowGap, columnGap } = rootProps;
278
+ return _jsx("div", { className: `aio-input-table-border-${dir}`, style: dir === 'h' ? { height: rowGap } : { width: columnGap } });
279
+ };
280
+ function TablePaging() {
281
+ let { ROWS, rootProps } = useProvider();
282
+ let [temp] = useState({ timeout: undefined, start: undefined, end: undefined, pages: 0 });
283
+ function fix(paging) {
284
+ if (typeof rootProps.onChangePaging !== 'function') {
285
+ alert('aio-input error => in type table you set paging but forget to set onChangePaging function prop to aio input');
286
+ return { number: 0, size: 0 };
287
+ }
288
+ let { number, size = 20, length = 0, sizes = [1, 5, 10, 15, 20, 30, 50, 70, 100], serverSide } = paging;
289
+ if (!serverSide) {
290
+ length = ROWS.sortedRows.length;
291
+ }
292
+ if (sizes.indexOf(size) === -1) {
293
+ size = sizes[0];
294
+ }
295
+ let pages = Math.ceil(length / size);
296
+ number = number > pages ? pages : number;
297
+ number = number < 1 ? 1 : number;
298
+ let start = number - 3, end = number + 3;
299
+ temp.start = start;
300
+ temp.end = end;
301
+ temp.pages = pages;
302
+ return Object.assign(Object.assign({}, paging), { length, number, size, sizes });
303
+ }
304
+ let [paging, setPaging] = useState(fix(rootProps.paging || { size: 0, number: 0 }));
305
+ useEffect(() => {
306
+ if (rootProps.paging) {
307
+ setPaging(fix(rootProps.paging));
308
+ }
309
+ }, [(rootProps.paging || { size: 0, number: 0, length: 0 }).size, (rootProps.paging || { size: 0, number: 0, length: 0 }).number, (rootProps.paging || { size: 0, number: 0, length: 0 }).length]);
310
+ function changePaging(obj) {
311
+ let newPaging = fix(Object.assign(Object.assign({}, paging), obj));
312
+ setPaging(newPaging);
313
+ if (rootProps.onChangePaging) {
314
+ if (newPaging.serverSide) {
315
+ clearTimeout(temp.timeout);
316
+ temp.timeout = setTimeout(() => {
317
+ //be khatere fahme payine typescript majbooram dobare in shart ro bezanam
318
+ if (rootProps.onChangePaging) {
319
+ rootProps.onChangePaging(newPaging);
320
+ }
321
+ }, 800);
322
+ }
323
+ else {
324
+ rootProps.onChangePaging(newPaging);
325
+ }
326
+ }
327
+ }
328
+ let { number, size, sizes } = paging;
329
+ let buttons = [];
330
+ let isFirst = true;
331
+ for (let i = temp.start; i <= temp.end; i++) {
332
+ if (i < 1 || i > temp.pages) {
333
+ buttons.push(_jsx("button", { className: 'aio-input-table-paging-button aio-input-table-paging-button-hidden', children: i }, i));
334
+ }
335
+ else {
336
+ let index;
337
+ if (isFirst) {
338
+ index = 1;
339
+ isFirst = false;
340
+ }
341
+ else if (i === Math.min(temp.end, temp.pages)) {
342
+ index = temp.pages;
343
+ }
344
+ else {
345
+ index = i;
346
+ }
347
+ buttons.push(_jsx("button", { className: 'aio-input-table-paging-button' + (index === number ? ' active' : ''), onClick: () => changePaging({ number: index }), children: index }, index));
348
+ }
349
+ }
350
+ function changeSizeButton() {
351
+ if (!sizes || !sizes.length) {
352
+ return null;
353
+ }
354
+ let p = {
355
+ attrs: { className: 'aio-input-table-paging-button aio-input-table-paging-size' },
356
+ type: 'select', value: size, options: sizes, option: { text: 'option', value: 'option' },
357
+ onChange: (value) => changePaging({ size: value }),
358
+ popover: { fitHorizontal: true },
359
+ };
360
+ return (_jsx(AIOInput, Object.assign({}, p)));
361
+ }
362
+ return (_jsxs("div", { className: 'aio-input-table-paging', children: [buttons, changeSizeButton()] }));
363
+ }
364
+ const TableRows = () => {
365
+ let { ROWS, rootProps } = useProvider();
366
+ let { rowTemplate, rowAfter = () => null, rowBefore = () => null, rowsTemplate, placeholder = 'there is not any items' } = rootProps;
367
+ let rows = ROWS.pagedRows || [];
368
+ let content;
369
+ if (rowsTemplate) {
370
+ content = rowsTemplate(rows);
371
+ }
372
+ else if (rows.length) {
373
+ content = rows.map((o, i) => {
374
+ let { id = 'ailr' + Math.round(Math.random() * 10000000) } = o;
375
+ o._id = o._id === undefined ? id : o._id;
376
+ let isLast = i === rows.length - 1, Row;
377
+ if (rowTemplate) {
378
+ Row = rowTemplate({ row: o, rowIndex: i, isLast });
379
+ }
380
+ else {
381
+ Row = _jsx(TableRow, { row: o, rowIndex: i, isLast: isLast }, o._id);
382
+ }
383
+ return (_jsxs(Fragment, { children: [rowBefore({ row: o, rowIndex: i }), Row, rowAfter({ row: o, rowIndex: i })] }, o._id));
384
+ });
385
+ }
386
+ else if (placeholder) {
387
+ content = _jsx("div", { style: { width: '100%', textAlign: 'center', padding: 12, boxSizing: 'border-box' }, children: placeholder });
388
+ }
389
+ else {
390
+ return null;
391
+ }
392
+ return _jsx("div", { className: 'aio-input-table-rows', children: content });
393
+ };
394
+ const TableToolbar = () => {
395
+ let { add, exportToExcel, sorts, sortRows, setSorts, search, rootProps, excelColumns, getIcon } = useProvider();
396
+ let { toolbarAttrs, toolbar, onAdd, onSearch, onChangeSort, onChange = () => { }, value, addText } = rootProps;
397
+ toolbarAttrs = UT.AddToAttrs(toolbarAttrs, { className: 'aio-input-table-toolbar' });
398
+ if (!onAdd && !toolbar && !onSearch && !sorts.length && !excelColumns.length) {
399
+ return null;
400
+ }
401
+ function changeSort(sortId, changeObject) {
402
+ let newSorts = sorts.map((sort) => {
403
+ if (sort.sortId === sortId) {
404
+ let newSort = Object.assign(Object.assign({}, sort), changeObject);
405
+ return newSort;
406
+ }
407
+ return sort;
408
+ });
409
+ changeSorts(newSorts);
410
+ }
411
+ function changeSorts(sorts) {
412
+ return __awaiter(this, void 0, void 0, function* () {
413
+ if (onChangeSort) {
414
+ let res = yield onChangeSort(sorts);
415
+ if (res !== false) {
416
+ setSorts(sorts);
417
+ }
418
+ }
419
+ else {
420
+ setSorts(sorts);
421
+ let activeSorts = sorts.filter((sort) => sort.active !== false);
422
+ if (activeSorts.length) {
423
+ onChange(sortRows(value, activeSorts));
424
+ }
425
+ }
426
+ });
427
+ }
428
+ function button() {
429
+ if (!sorts.length) {
430
+ return null;
431
+ }
432
+ let p = {
433
+ popover: {
434
+ header: { title: 'Sort', onClose: false },
435
+ setAttrs: (key) => { if (key === 'header') {
436
+ return { className: 'aio-input-table-toolbar-popover-header' };
437
+ } },
438
+ limitTo: '.aio-input-table'
439
+ },
440
+ caret: false, type: 'select', options: sorts,
441
+ option: {
442
+ text: 'option.title',
443
+ checked: '!!option.active',
444
+ close: () => false,
445
+ value: 'option.sortId',
446
+ after: (option) => {
447
+ let { dir = 'dec', sortId } = option;
448
+ return (_jsx("div", { onClick: (e) => {
449
+ e.stopPropagation();
450
+ changeSort(sortId, { dir: dir === 'dec' ? 'inc' : 'dec' });
451
+ }, children: getIcon(dir === 'dec' ? 'mdiArrowDown' : 'mdiArrowUp', 0.8) }));
452
+ }
453
+ },
454
+ attrs: { className: 'aio-input-table-toolbar-button' },
455
+ text: getIcon('mdiSort', 0.7),
456
+ onSwap: (newSorts, from, to) => changeSorts(newSorts),
457
+ onChange: (value, option) => changeSort(value, { active: !option.checked })
458
+ };
459
+ return (_createElement(AIOInput, Object.assign({}, p, { key: 'sortbutton' })));
460
+ }
461
+ function getAddText() {
462
+ let { addText } = rootProps;
463
+ if (!rootProps.addText) {
464
+ return getIcon('mdiPlusThick', 0.8);
465
+ }
466
+ return typeof addText === 'function' ? addText(value) : addText;
467
+ }
468
+ return (_jsxs(_Fragment, { children: [_jsxs("div", Object.assign({}, toolbarAttrs, { children: [toolbar && _jsx("div", { className: 'aio-input-table-toolbar-content', children: typeof toolbar === 'function' ? toolbar() : toolbar }), _jsx("div", { className: 'aio-input-table-search', children: !!onSearch && _jsx(AIOInput, { type: 'text', onChange: (value) => search(value), after: getIcon('mdiMagnify', 0.7) }) }), button(), !!excelColumns.length && _jsx("div", { className: 'aio-input-table-toolbar-button', onClick: () => exportToExcel(), children: getIcon('mdiFileExcel', 0.8) }), !!onAdd && _jsx("div", { className: 'aio-input-table-toolbar-button', onClick: () => add(), children: getAddText() })] })), _jsx(TableGap, { dir: 'h' })] }));
469
+ };
470
+ const TableHeader = () => {
471
+ let { rootProps, columns } = useProvider();
472
+ let { headerAttrs, onRemove } = rootProps;
473
+ headerAttrs = UT.AddToAttrs(headerAttrs, { className: 'aio-input-table-header' });
474
+ let Titles = columns.map((o, i) => _jsx(TableTitle, { column: o, isLast: i === columns.length - 1, colIndex: i }, o._id));
475
+ let RemoveTitle = !onRemove ? null : _jsxs(_Fragment, { children: [_jsx(TableGap, { dir: 'v' }), _jsx("div", { className: 'aio-input-table-remove-title' })] });
476
+ return _jsxs("div", Object.assign({}, headerAttrs, { children: [Titles, RemoveTitle, _jsx(TableGap, { dir: 'h' })] }));
477
+ };
478
+ const TableTitle = (p) => {
479
+ const { column, isLast, colIndex } = p;
480
+ let { getCellAttrs, DragColumns } = useProvider();
481
+ const attrs = Object.assign(Object.assign(Object.assign({}, getCellAttrs({ column, type: 'title', row: undefined, rowIndex: 0 })), DragColumns.getDragAttrs(colIndex)), DragColumns.getDropAttrs(colIndex));
482
+ return (_jsxs(_Fragment, { children: [_jsx("div", Object.assign({}, attrs, { children: attrs.title })), !isLast && _jsx(TableGap, { dir: 'v' })] }));
483
+ };
484
+ const TableRow = (p) => {
485
+ const { row, isLast, rowIndex } = p;
486
+ let { remove, rootProps, columns, getRowAttrs, getIcon } = useProvider();
487
+ function getCells() {
488
+ return columns.map((column, i) => {
489
+ let key = row._id + ' ' + column._id;
490
+ let isLast = i === columns.length - 1;
491
+ return (_jsx(TableCell, { isLast: isLast, row: row, rowIndex: rowIndex, column: column }, key));
492
+ });
493
+ }
494
+ let { onRemove } = rootProps;
495
+ return (_jsxs(_Fragment, { children: [_jsxs("div", Object.assign({}, getRowAttrs(row, rowIndex), { children: [getCells(), onRemove ? _jsxs(_Fragment, { children: [_jsx(TableGap, { dir: 'v' }), _jsx("button", { className: 'aio-input-table-remove', onClick: () => remove(row, rowIndex), children: getIcon('mdiClose', 0.8) })] }) : null] }), row._id), _jsx(TableGap, { dir: 'h' })] }));
496
+ };
497
+ const TableCell = (p) => {
498
+ let { row, rowIndex, column, isLast } = p;
499
+ let { getCellAttrs, rootProps } = useProvider();
500
+ let { onChange = () => { }, value = [] } = rootProps;
501
+ //cellNewValue is used to eval please dont remove it
502
+ function setCell(row, column, cellNewValue) {
503
+ row = JSON.parse(JSON.stringify(row));
504
+ eval(`${column.value} = cellNewValue`);
505
+ onChange(value.map((o) => o._id !== row._id ? o : row));
506
+ }
507
+ return (_jsxs(Fragment, { children: [_jsx("div", Object.assign({}, getCellAttrs({ row, rowIndex, column, type: 'cell' }), { children: _jsx(TableCellContent, { row: row, rowIndex: rowIndex, column: column, onChange: (value) => setCell(row, column, value) }, row._id + ' ' + column._id) })), !isLast && _jsx(TableGap, { dir: 'v' })] }, row._id + ' ' + column._id));
508
+ };
509
+ const TableCellContent = (props) => {
510
+ let { row, column, rowIndex, onChange } = props;
511
+ let { getDynamics, rootProps } = useProvider();
512
+ const { getValue = {} } = rootProps;
513
+ if (column.template !== undefined) {
514
+ const p = { row, column, rowIndex, change: (newRow) => (onChange || (() => { }))(newRow) };
515
+ if (typeof column.template === 'string' && getValue[column.template]) {
516
+ return getValue[column.template](p);
517
+ }
518
+ if (typeof column.template === 'function') {
519
+ return column.template(p);
520
+ }
521
+ }
522
+ return getDynamics({ value: column.value, row, rowIndex, column });
523
+ };