@sd-angular/core 1.3.147 → 1.3.148

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 (24) hide show
  1. package/bundles/sd-angular-core-grid-material.umd.js +1 -1
  2. package/bundles/sd-angular-core-grid-material.umd.js.map +1 -1
  3. package/bundles/sd-angular-core-grid-material.umd.min.js +1 -1
  4. package/bundles/sd-angular-core-grid-material.umd.min.js.map +1 -1
  5. package/bundles/sd-angular-core-table.umd.js +217 -144
  6. package/bundles/sd-angular-core-table.umd.js.map +1 -1
  7. package/bundles/sd-angular-core-table.umd.min.js +1 -1
  8. package/bundles/sd-angular-core-table.umd.min.js.map +1 -1
  9. package/esm2015/grid-material/src/lib/components/column-inline-filter/column-inline-filter.component.js +2 -2
  10. package/esm2015/table/src/lib/components/column-inline-filter/column-inline-filter.component.js +34 -12
  11. package/esm2015/table/src/lib/models/table-column.model.js +43 -19
  12. package/esm2015/table/src/lib/models/table-configuration.model.js +1 -1
  13. package/esm2015/table/src/lib/table.component.js +19 -3
  14. package/fesm2015/sd-angular-core-grid-material.js +1 -1
  15. package/fesm2015/sd-angular-core-grid-material.js.map +1 -1
  16. package/fesm2015/sd-angular-core-table.js +91 -29
  17. package/fesm2015/sd-angular-core-table.js.map +1 -1
  18. package/grid-material/sd-angular-core-grid-material.metadata.json +1 -1
  19. package/package.json +1 -1
  20. package/{sd-angular-core-1.3.147.tgz → sd-angular-core-1.3.148.tgz} +0 -0
  21. package/table/sd-angular-core-table.metadata.json +1 -1
  22. package/table/src/lib/components/column-inline-filter/column-inline-filter.component.d.ts +11 -4
  23. package/table/src/lib/models/table-column.model.d.ts +2 -1
  24. package/table/src/lib/models/table-configuration.model.d.ts +7 -0
@@ -1421,11 +1421,11 @@
1421
1421
  this.exportTitle = 'Export';
1422
1422
  _loadCompleted.set(this, false);
1423
1423
  _initCellDef.set(this, function () {
1424
- var e_1, _3;
1424
+ var e_1, _8;
1425
1425
  _this.cellDef = {};
1426
1426
  try {
1427
- for (var _4 = __values(_this.sdCellDefs), _5 = _4.next(); !_5.done; _5 = _4.next()) {
1428
- var cellDef = _5.value;
1427
+ for (var _9 = __values(_this.sdCellDefs), _10 = _9.next(); !_10.done; _10 = _9.next()) {
1428
+ var cellDef = _10.value;
1429
1429
  if (cellDef.sdMaterialCellDef) {
1430
1430
  _this.cellDef[cellDef.sdMaterialCellDef] = cellDef;
1431
1431
  }
@@ -1434,35 +1434,35 @@
1434
1434
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
1435
1435
  finally {
1436
1436
  try {
1437
- if (_5 && !_5.done && (_3 = _4.return)) _3.call(_4);
1437
+ if (_10 && !_10.done && (_8 = _9.return)) _8.call(_9);
1438
1438
  }
1439
1439
  finally { if (e_1) throw e_1.error; }
1440
1440
  }
1441
1441
  });
1442
1442
  _initFilterDef.set(this, function () {
1443
- var e_2, _3;
1443
+ var e_2, _8;
1444
1444
  _this.filterDefs = [];
1445
1445
  try {
1446
- for (var _4 = __values(_this.sdFilterDefs), _5 = _4.next(); !_5.done; _5 = _4.next()) {
1447
- var filterDef = _5.value;
1446
+ for (var _9 = __values(_this.sdFilterDefs), _10 = _9.next(); !_10.done; _10 = _9.next()) {
1447
+ var filterDef = _10.value;
1448
1448
  _this.filterDefs.push(filterDef);
1449
1449
  }
1450
1450
  }
1451
1451
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
1452
1452
  finally {
1453
1453
  try {
1454
- if (_5 && !_5.done && (_3 = _4.return)) _3.call(_4);
1454
+ if (_10 && !_10.done && (_8 = _9.return)) _8.call(_9);
1455
1455
  }
1456
1456
  finally { if (e_2) throw e_2.error; }
1457
1457
  }
1458
1458
  });
1459
1459
  _initFooterDef.set(this, function () {
1460
- var e_3, _3;
1460
+ var e_3, _8;
1461
1461
  _this.footerDef = {};
1462
1462
  _this.hasFooter = false;
1463
1463
  try {
1464
- for (var _4 = __values(_this.sdFooterDefs), _5 = _4.next(); !_5.done; _5 = _4.next()) {
1465
- var footerDef = _5.value;
1464
+ for (var _9 = __values(_this.sdFooterDefs), _10 = _9.next(); !_10.done; _10 = _9.next()) {
1465
+ var footerDef = _10.value;
1466
1466
  if (footerDef.sdMaterialFooterDef) {
1467
1467
  _this.hasFooter = true;
1468
1468
  _this.footerDef[footerDef.sdMaterialFooterDef] = footerDef;
@@ -1472,14 +1472,14 @@
1472
1472
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
1473
1473
  finally {
1474
1474
  try {
1475
- if (_5 && !_5.done && (_3 = _4.return)) _3.call(_4);
1475
+ if (_10 && !_10.done && (_8 = _9.return)) _8.call(_9);
1476
1476
  }
1477
1477
  finally { if (e_3) throw e_3.error; }
1478
1478
  }
1479
1479
  });
1480
1480
  _filterExportInfo.set(this, function (pageNumber, pageSize) {
1481
1481
  var _a, _b;
1482
- var _3 = _this.filterRegister.value.get(), columnOperator = _3.columnOperator, columnFilter = _3.columnFilter, externalFilter = _3.externalFilter, filterDef = _3.filterDef;
1482
+ var _8 = _this.filterRegister.value.get(), columnOperator = _8.columnOperator, columnFilter = _8.columnFilter, externalFilter = _8.externalFilter, filterDef = _8.filterDef;
1483
1483
  return {
1484
1484
  columnOperator: columnOperator || {},
1485
1485
  rawColumnFilter: columnFilter || {},
@@ -1493,7 +1493,8 @@
1493
1493
  };
1494
1494
  });
1495
1495
  _initConfiguration$1.set(this, function (option) {
1496
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
1496
+ var e_4, _8;
1497
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
1497
1498
  // Init pagination
1498
1499
  option.paginate = {
1499
1500
  hidden: (_a = option === null || option === void 0 ? void 0 : option.paginate) === null || _a === void 0 ? void 0 : _a.hidden,
@@ -1501,6 +1502,32 @@
1501
1502
  pages: (_m = (_j = (_h = option === null || option === void 0 ? void 0 : option.paginate) === null || _h === void 0 ? void 0 : _h.pages) !== null && _j !== void 0 ? _j : (_l = (_k = _this.configuration) === null || _k === void 0 ? void 0 : _k.paginate) === null || _l === void 0 ? void 0 : _l.pages) !== null && _m !== void 0 ? _m : (_o = DEFAULT_TABLE_CONFIG.paginate) === null || _o === void 0 ? void 0 : _o.pages,
1502
1503
  showFirstLastButtons: (_q = (_p = option === null || option === void 0 ? void 0 : option.paginate) === null || _p === void 0 ? void 0 : _p.showFirstLastButtons) !== null && _q !== void 0 ? _q : false,
1503
1504
  };
1505
+ try {
1506
+ for (var _9 = __values(option.columns || []), _10 = _9.next(); !_10.done; _10 = _9.next()) {
1507
+ var column = _10.value;
1508
+ if (((_s = (_r = column.filter) === null || _r === void 0 ? void 0 : _r.operator) === null || _s === void 0 ? void 0 : _s.enable) && !((_v = (_u = (_t = column.filter) === null || _t === void 0 ? void 0 : _t.operator) === null || _u === void 0 ? void 0 : _u.list) === null || _v === void 0 ? void 0 : _v.length)) {
1509
+ if (column.type === 'string') {
1510
+ column.filter.operator.list = ((_y = (_x = (_w = _this.configuration) === null || _w === void 0 ? void 0 : _w.filter) === null || _x === void 0 ? void 0 : _x.operator) === null || _y === void 0 ? void 0 : _y.defaultListString) || [];
1511
+ }
1512
+ if (column.type === 'number') {
1513
+ column.filter.operator.list = ((_1 = (_0 = (_z = _this.configuration) === null || _z === void 0 ? void 0 : _z.filter) === null || _0 === void 0 ? void 0 : _0.operator) === null || _1 === void 0 ? void 0 : _1.defaultListNumber) || [];
1514
+ }
1515
+ if (column.type === 'values') {
1516
+ column.filter.operator.list = ((_4 = (_3 = (_2 = _this.configuration) === null || _2 === void 0 ? void 0 : _2.filter) === null || _3 === void 0 ? void 0 : _3.operator) === null || _4 === void 0 ? void 0 : _4.defaultListValues) || [];
1517
+ }
1518
+ if (column.type === 'date' || column.type === 'datetime') {
1519
+ column.filter.operator.list = ((_7 = (_6 = (_5 = _this.configuration) === null || _5 === void 0 ? void 0 : _5.filter) === null || _6 === void 0 ? void 0 : _6.operator) === null || _7 === void 0 ? void 0 : _7.defaultListDate) || [];
1520
+ }
1521
+ }
1522
+ }
1523
+ }
1524
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
1525
+ finally {
1526
+ try {
1527
+ if (_10 && !_10.done && (_8 = _9.return)) _8.call(_9);
1528
+ }
1529
+ finally { if (e_4) throw e_4.error; }
1530
+ }
1504
1531
  return option;
1505
1532
  });
1506
1533
  _loadFilterRegister.set(this, function () {
@@ -1534,7 +1561,7 @@
1534
1561
  var columns = _this.gridOption.columns;
1535
1562
  var rawColumnFilter = filterInfo.rawColumnFilter, orderBy = filterInfo.orderBy, orderDirection = filterInfo.orderDirection, pageSize = filterInfo.pageSize, pageNumber = filterInfo.pageNumber;
1536
1563
  var items = localItems.filter(function (tableItem) {
1537
- var e_4, _3;
1564
+ var e_5, _8;
1538
1565
  var _a, _b, _c, _d;
1539
1566
  var item = tableItem.current;
1540
1567
  try {
@@ -1612,12 +1639,12 @@
1612
1639
  }
1613
1640
  }
1614
1641
  }
1615
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
1642
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
1616
1643
  finally {
1617
1644
  try {
1618
- if (columns_1_1 && !columns_1_1.done && (_3 = columns_1.return)) _3.call(columns_1);
1645
+ if (columns_1_1 && !columns_1_1.done && (_8 = columns_1.return)) _8.call(columns_1);
1619
1646
  }
1620
- finally { if (e_4) throw e_4.error; }
1647
+ finally { if (e_5) throw e_5.error; }
1621
1648
  }
1622
1649
  return true;
1623
1650
  });
@@ -1661,7 +1688,7 @@
1661
1688
  });
1662
1689
  _getFilter.set(this, function () {
1663
1690
  var _a, _b, _c, _d, _e, _f;
1664
- var _3 = _this.filterRegister.value.get(), columnOperator = _3.columnOperator, columnFilter = _3.columnFilter, externalFilter = _3.externalFilter, filterDef = _3.filterDef;
1691
+ var _8 = _this.filterRegister.value.get(), columnOperator = _8.columnOperator, columnFilter = _8.columnFilter, externalFilter = _8.externalFilter, filterDef = _8.filterDef;
1665
1692
  return {
1666
1693
  columnOperator: columnOperator || {},
1667
1694
  rawColumnFilter: columnFilter || {},
@@ -1678,8 +1705,8 @@
1678
1705
  return __awaiter(_this, void 0, void 0, function () {
1679
1706
  var items, data, items, results, data;
1680
1707
  var _this = this;
1681
- return __generator(this, function (_3) {
1682
- switch (_3.label) {
1708
+ return __generator(this, function (_8) {
1709
+ switch (_8.label) {
1683
1710
  case 0:
1684
1711
  this.isLoading = true;
1685
1712
  if (!(this.gridOption.type === 'server')) return [3 /*break*/, 2];
@@ -1693,7 +1720,7 @@
1693
1720
  };
1694
1721
  })];
1695
1722
  case 1:
1696
- data = _3.sent();
1723
+ data = _8.sent();
1697
1724
  this.isLoading = false;
1698
1725
  return [2 /*return*/, {
1699
1726
  items: (data === null || data === void 0 ? void 0 : data.items.map(MapToSdTableItem)) || [],
@@ -1711,11 +1738,11 @@
1711
1738
  return [];
1712
1739
  })];
1713
1740
  case 3:
1714
- data = _3.sent();
1741
+ data = _8.sent();
1715
1742
  return [3 /*break*/, 5];
1716
1743
  case 4:
1717
1744
  data = results;
1718
- _3.label = 5;
1745
+ _8.label = 5;
1719
1746
  case 5:
1720
1747
  if (!Array.isArray(data)) {
1721
1748
  this.notifyService.notify.warning('Dữ liệu không phải là một mảng');
@@ -1723,7 +1750,7 @@
1723
1750
  }
1724
1751
  __classPrivateFieldSet(this, _localItems, data.map(MapToSdTableItem));
1725
1752
  this.isLoading = false;
1726
- _3.label = 6;
1753
+ _8.label = 6;
1727
1754
  case 6: return [2 /*return*/, __classPrivateFieldGet(this, _filterLocal).call(this, __classPrivateFieldGet(this, _localItems), filterReq)];
1728
1755
  }
1729
1756
  });
@@ -1731,15 +1758,15 @@
1731
1758
  });
1732
1759
  _render.set(this, function (args) { return __awaiter(_this, void 0, void 0, function () {
1733
1760
  var _a, _b, _c, _d;
1734
- return __generator(this, function (_3) {
1735
- switch (_3.label) {
1761
+ return __generator(this, function (_8) {
1762
+ switch (_8.label) {
1736
1763
  case 0:
1737
1764
  (_a = this.sdScroll) === null || _a === void 0 ? void 0 : _a.scrollTop();
1738
1765
  this.items = (args === null || args === void 0 ? void 0 : args.items) || [];
1739
1766
  this.total = (args === null || args === void 0 ? void 0 : args.total) || 0;
1740
1767
  return [4 /*yield*/, ((_d = (_c = (_b = this.gridOption) === null || _b === void 0 ? void 0 : _b.reload) === null || _c === void 0 ? void 0 : _c.onReload) === null || _d === void 0 ? void 0 : _d.call(_c, this.items))];
1741
1768
  case 1:
1742
- _3.sent();
1769
+ _8.sent();
1743
1770
  this.isSelectAll = this.items.every(function (e) { return e.meta.selector.isSelected; });
1744
1771
  __classPrivateFieldGet(this, _updateSelectedItems).call(this);
1745
1772
  return [2 /*return*/];
@@ -1750,13 +1777,13 @@
1750
1777
  if (force === void 0) { force = true; }
1751
1778
  return __awaiter(_this, void 0, void 0, function () {
1752
1779
  var _e, _f, data;
1753
- return __generator(this, function (_3) {
1754
- switch (_3.label) {
1780
+ return __generator(this, function (_8) {
1781
+ switch (_8.label) {
1755
1782
  case 0:
1756
1783
  (_f = (_e = this.gridFilter) === null || _e === void 0 ? void 0 : _e.updateFilter) === null || _f === void 0 ? void 0 : _f.call(_e);
1757
1784
  return [4 /*yield*/, __classPrivateFieldGet(this, _load$1).call(this, __classPrivateFieldGet(this, _getFilter).call(this), force)];
1758
1785
  case 1:
1759
- data = _3.sent();
1786
+ data = _8.sent();
1760
1787
  __classPrivateFieldGet(this, _render).call(this, data);
1761
1788
  return [2 /*return*/];
1762
1789
  }
@@ -1768,8 +1795,8 @@
1768
1795
  if (pageSize === void 0) { pageSize = 10000; }
1769
1796
  return __awaiter(_this, void 0, void 0, function () {
1770
1797
  var _g, _h, result, filterInfo, result, exportedItems, results;
1771
- return __generator(this, function (_3) {
1772
- switch (_3.label) {
1798
+ return __generator(this, function (_8) {
1799
+ switch (_8.label) {
1773
1800
  case 0:
1774
1801
  if (!((_g = this.gridOption.export) === null || _g === void 0 ? void 0 : _g.items)) return [3 /*break*/, 2];
1775
1802
  result = (_h = this.gridOption.export) === null || _h === void 0 ? void 0 : _h.items(__classPrivateFieldGet(this, _filterExportInfo).call(this, pageNumber, pageSize));
@@ -1783,13 +1810,13 @@
1783
1810
  result = result.toPromise();
1784
1811
  }
1785
1812
  return [4 /*yield*/, result];
1786
- case 1: return [2 /*return*/, _3.sent()];
1813
+ case 1: return [2 /*return*/, _8.sent()];
1787
1814
  case 2:
1788
1815
  filterInfo = __classPrivateFieldGet(this, _filterExportInfo).call(this, pageNumber, pageSize);
1789
1816
  if (!(this.gridOption.type === 'server')) return [3 /*break*/, 4];
1790
1817
  result = this.gridOption.items(filterInfo);
1791
1818
  return [4 /*yield*/, result];
1792
- case 3: return [2 /*return*/, _3.sent()];
1819
+ case 3: return [2 /*return*/, _8.sent()];
1793
1820
  case 4:
1794
1821
  exportedItems = [];
1795
1822
  if (!(typeof this.gridOption.items === 'function')) return [3 /*break*/, 8];
@@ -1797,15 +1824,15 @@
1797
1824
  if (!(results instanceof Promise)) return [3 /*break*/, 6];
1798
1825
  return [4 /*yield*/, results];
1799
1826
  case 5:
1800
- exportedItems = _3.sent();
1827
+ exportedItems = _8.sent();
1801
1828
  return [3 /*break*/, 7];
1802
1829
  case 6:
1803
1830
  exportedItems = results;
1804
- _3.label = 7;
1831
+ _8.label = 7;
1805
1832
  case 7: return [3 /*break*/, 9];
1806
1833
  case 8:
1807
1834
  exportedItems = this.gridOption.items;
1808
- _3.label = 9;
1835
+ _8.label = 9;
1809
1836
  case 9: return [2 /*return*/, __classPrivateFieldGet(this, _filterLocal).call(this, exportedItems, filterInfo)];
1810
1837
  }
1811
1838
  });
@@ -1832,13 +1859,13 @@
1832
1859
  return ((_b = (_a = _this.gridOption.export) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.filter(function (e) { var _a; return !((_a = e.export) === null || _a === void 0 ? void 0 : _a.disabled); })) || [];
1833
1860
  });
1834
1861
  _onExport.set(this, function (isCSV) { return __awaiter(_this, void 0, void 0, function () {
1835
- var _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, columns_2, pageSize_1, batch, total_1, pageNumber_1, exportItems_1, items_1, promises_1, handleData, sheets, _3, _4, sheet, _5, _6, _7, e_5_1;
1836
- var e_5, _8;
1862
+ var _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, columns_2, pageSize_1, batch, total_1, pageNumber_1, exportItems_1, items_1, promises_1, handleData, sheets, _8, _9, sheet, _10, _11, _12, e_6_1;
1863
+ var e_6, _13;
1837
1864
  var _this = this;
1838
- return __generator(this, function (_9) {
1839
- switch (_9.label) {
1865
+ return __generator(this, function (_14) {
1866
+ switch (_14.label) {
1840
1867
  case 0:
1841
- _9.trys.push([0, , 18, 19]);
1868
+ _14.trys.push([0, , 18, 19]);
1842
1869
  columns_2 = __classPrivateFieldGet(this, _getExportColumns).call(this);
1843
1870
  pageSize_1 = ((_k = (_j = this.gridOption) === null || _j === void 0 ? void 0 : _j.export) === null || _k === void 0 ? void 0 : _k.maxItemsPerRequest) || 1000;
1844
1871
  batch = ((_m = (_l = this.gridOption) === null || _l === void 0 ? void 0 : _l.export) === null || _m === void 0 ? void 0 : _m.batch) || 1;
@@ -1849,14 +1876,14 @@
1849
1876
  items_1 = [];
1850
1877
  promises_1 = [];
1851
1878
  handleData = function () { return __awaiter(_this, void 0, void 0, function () {
1852
- var _u, results, results_1, results_1_1, result, results_2, totalPage, percent, allColumns, allExportedColumns, _loop_1, exportItems_2, exportItems_2_1, item, e_6_1;
1853
- var e_7, _3, e_6, _4;
1879
+ var _u, results, results_1, results_1_1, result, results_2, totalPage, percent, allColumns, allExportedColumns, _loop_1, exportItems_2, exportItems_2_1, item, e_7_1;
1880
+ var e_8, _8, e_7, _9;
1854
1881
  var _this = this;
1855
- return __generator(this, function (_5) {
1856
- switch (_5.label) {
1882
+ return __generator(this, function (_10) {
1883
+ switch (_10.label) {
1857
1884
  case 0: return [4 /*yield*/, Promise.all(promises_1)];
1858
1885
  case 1:
1859
- results = _5.sent();
1886
+ results = _10.sent();
1860
1887
  promises_1 = [];
1861
1888
  exportItems_1 = [];
1862
1889
  try {
@@ -1871,23 +1898,23 @@
1871
1898
  }
1872
1899
  }
1873
1900
  }
1874
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
1901
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
1875
1902
  finally {
1876
1903
  try {
1877
- if (results_1_1 && !results_1_1.done && (_3 = results_1.return)) _3.call(results_1);
1904
+ if (results_1_1 && !results_1_1.done && (_8 = results_1.return)) _8.call(results_1);
1878
1905
  }
1879
- finally { if (e_7) throw e_7.error; }
1906
+ finally { if (e_8) throw e_8.error; }
1880
1907
  }
1881
1908
  if (!((_u = this.gridOption.export) === null || _u === void 0 ? void 0 : _u.mapping)) return [3 /*break*/, 4];
1882
1909
  results_2 = this.gridOption.export.mapping(exportItems_1);
1883
1910
  if (!(results_2 instanceof Promise)) return [3 /*break*/, 3];
1884
1911
  return [4 /*yield*/, results_2];
1885
1912
  case 2:
1886
- exportItems_1 = _5.sent();
1913
+ exportItems_1 = _10.sent();
1887
1914
  return [3 /*break*/, 4];
1888
1915
  case 3:
1889
1916
  exportItems_1 = results_2;
1890
- _5.label = 4;
1917
+ _10.label = 4;
1891
1918
  case 4:
1892
1919
  totalPage = total_1 / pageSize_1;
1893
1920
  percent = Math.round(((pageNumber_1 - 1) * 100.0) / totalPage);
@@ -1895,16 +1922,16 @@
1895
1922
  allColumns = __classPrivateFieldGet(this, _allColumns).call(this);
1896
1923
  allExportedColumns = __classPrivateFieldGet(this, _allExportedColumns).call(this);
1897
1924
  _loop_1 = function (item) {
1898
- var obj, handle, columns_3, columns_3_1, exportColumn, e_8_1;
1899
- var e_8, _3;
1900
- return __generator(this, function (_4) {
1901
- switch (_4.label) {
1925
+ var obj, handle, columns_3, columns_3_1, exportColumn, e_9_1;
1926
+ var e_9, _8;
1927
+ return __generator(this, function (_9) {
1928
+ switch (_9.label) {
1902
1929
  case 0:
1903
1930
  obj = {};
1904
1931
  handle = function (exportColumn) { return __awaiter(_this, void 0, void 0, function () {
1905
- var _v, _w, _x, column, exportedColumn, transform, _3, _4, date, transformDate, date, transformDate, date, transformDate, _5, _6;
1906
- return __generator(this, function (_7) {
1907
- switch (_7.label) {
1932
+ var _v, _w, _x, column, exportedColumn, transform, _8, _9, date, transformDate, date, transformDate, date, transformDate, _10, _11;
1933
+ return __generator(this, function (_12) {
1934
+ switch (_12.label) {
1908
1935
  case 0:
1909
1936
  obj[exportColumn.field] = item[exportColumn.field];
1910
1937
  column = allColumns.find(function (e) { return e.field === exportColumn.field; });
@@ -1928,15 +1955,15 @@
1928
1955
  isExport: true,
1929
1956
  });
1930
1957
  if (!(transform instanceof Promise)) return [3 /*break*/, 2];
1931
- _3 = obj;
1932
- _4 = column.field;
1958
+ _8 = obj;
1959
+ _9 = column.field;
1933
1960
  return [4 /*yield*/, transform];
1934
1961
  case 1:
1935
- _3[_4] = _7.sent();
1962
+ _8[_9] = _12.sent();
1936
1963
  return [3 /*break*/, 3];
1937
1964
  case 2:
1938
1965
  obj[column.field] = transform;
1939
- _7.label = 3;
1966
+ _12.label = 3;
1940
1967
  case 3:
1941
1968
  obj[column.field] = (_v = obj[column.field]) !== null && _v !== void 0 ? _v : '';
1942
1969
  return [3 /*break*/, 13];
@@ -1992,45 +2019,45 @@
1992
2019
  case 10:
1993
2020
  if (!(column.type === 'values')) return [3 /*break*/, 12];
1994
2021
  // Nếu là values thì lấy giá trị của value được chọn
1995
- _5 = obj;
1996
- _6 = column.field;
2022
+ _10 = obj;
2023
+ _11 = column.field;
1997
2024
  return [4 /*yield*/, this.columnValuesPipe.transform(item[column.field], column)];
1998
2025
  case 11:
1999
2026
  // Nếu là values thì lấy giá trị của value được chọn
2000
- _5[_6] = _7.sent();
2027
+ _10[_11] = _12.sent();
2001
2028
  return [3 /*break*/, 13];
2002
2029
  case 12:
2003
2030
  obj[column.field] = item[column.field];
2004
- _7.label = 13;
2031
+ _12.label = 13;
2005
2032
  case 13: return [2 /*return*/];
2006
2033
  }
2007
2034
  });
2008
2035
  }); };
2009
- _4.label = 1;
2036
+ _9.label = 1;
2010
2037
  case 1:
2011
- _4.trys.push([1, 6, 7, 8]);
2012
- columns_3 = (e_8 = void 0, __values(columns_2)), columns_3_1 = columns_3.next();
2013
- _4.label = 2;
2038
+ _9.trys.push([1, 6, 7, 8]);
2039
+ columns_3 = (e_9 = void 0, __values(columns_2)), columns_3_1 = columns_3.next();
2040
+ _9.label = 2;
2014
2041
  case 2:
2015
2042
  if (!!columns_3_1.done) return [3 /*break*/, 5];
2016
2043
  exportColumn = columns_3_1.value;
2017
2044
  return [4 /*yield*/, handle(exportColumn)];
2018
2045
  case 3:
2019
- _4.sent();
2020
- _4.label = 4;
2046
+ _9.sent();
2047
+ _9.label = 4;
2021
2048
  case 4:
2022
2049
  columns_3_1 = columns_3.next();
2023
2050
  return [3 /*break*/, 2];
2024
2051
  case 5: return [3 /*break*/, 8];
2025
2052
  case 6:
2026
- e_8_1 = _4.sent();
2027
- e_8 = { error: e_8_1 };
2053
+ e_9_1 = _9.sent();
2054
+ e_9 = { error: e_9_1 };
2028
2055
  return [3 /*break*/, 8];
2029
2056
  case 7:
2030
2057
  try {
2031
- if (columns_3_1 && !columns_3_1.done && (_3 = columns_3.return)) _3.call(columns_3);
2058
+ if (columns_3_1 && !columns_3_1.done && (_8 = columns_3.return)) _8.call(columns_3);
2032
2059
  }
2033
- finally { if (e_8) throw e_8.error; }
2060
+ finally { if (e_9) throw e_9.error; }
2034
2061
  return [7 /*endfinally*/];
2035
2062
  case 8:
2036
2063
  items_1.push(obj);
@@ -2038,37 +2065,37 @@
2038
2065
  }
2039
2066
  });
2040
2067
  };
2041
- _5.label = 5;
2068
+ _10.label = 5;
2042
2069
  case 5:
2043
- _5.trys.push([5, 10, 11, 12]);
2070
+ _10.trys.push([5, 10, 11, 12]);
2044
2071
  exportItems_2 = __values(exportItems_1), exportItems_2_1 = exportItems_2.next();
2045
- _5.label = 6;
2072
+ _10.label = 6;
2046
2073
  case 6:
2047
2074
  if (!!exportItems_2_1.done) return [3 /*break*/, 9];
2048
2075
  item = exportItems_2_1.value;
2049
2076
  return [5 /*yield**/, _loop_1(item)];
2050
2077
  case 7:
2051
- _5.sent();
2052
- _5.label = 8;
2078
+ _10.sent();
2079
+ _10.label = 8;
2053
2080
  case 8:
2054
2081
  exportItems_2_1 = exportItems_2.next();
2055
2082
  return [3 /*break*/, 6];
2056
2083
  case 9: return [3 /*break*/, 12];
2057
2084
  case 10:
2058
- e_6_1 = _5.sent();
2059
- e_6 = { error: e_6_1 };
2085
+ e_7_1 = _10.sent();
2086
+ e_7 = { error: e_7_1 };
2060
2087
  return [3 /*break*/, 12];
2061
2088
  case 11:
2062
2089
  try {
2063
- if (exportItems_2_1 && !exportItems_2_1.done && (_4 = exportItems_2.return)) _4.call(exportItems_2);
2090
+ if (exportItems_2_1 && !exportItems_2_1.done && (_9 = exportItems_2.return)) _9.call(exportItems_2);
2064
2091
  }
2065
- finally { if (e_6) throw e_6.error; }
2092
+ finally { if (e_7) throw e_7.error; }
2066
2093
  return [7 /*endfinally*/];
2067
2094
  case 12: return [2 /*return*/];
2068
2095
  }
2069
2096
  });
2070
2097
  }); };
2071
- _9.label = 1;
2098
+ _14.label = 1;
2072
2099
  case 1:
2073
2100
  if (!(pageNumber_1 * pageSize_1 < total_1)) return [3 /*break*/, 3];
2074
2101
  promises_1.push(__classPrivateFieldGet(this, _exportedItems).call(this, pageNumber_1, pageSize_1));
@@ -2078,14 +2105,14 @@
2078
2105
  }
2079
2106
  return [4 /*yield*/, handleData()];
2080
2107
  case 2:
2081
- _9.sent();
2108
+ _14.sent();
2082
2109
  return [3 /*break*/, 1];
2083
2110
  case 3:
2084
2111
  if (!(promises_1.length > 0)) return [3 /*break*/, 5];
2085
2112
  return [4 /*yield*/, handleData()];
2086
2113
  case 4:
2087
- _9.sent();
2088
- _9.label = 5;
2114
+ _14.sent();
2115
+ _14.label = 5;
2089
2116
  case 5:
2090
2117
  if (!isCSV) return [3 /*break*/, 7];
2091
2118
  return [4 /*yield*/, this.exportService.exportCSV({
@@ -2094,19 +2121,19 @@
2094
2121
  fileName: (_p = (_o = this.gridOption) === null || _o === void 0 ? void 0 : _o.export) === null || _p === void 0 ? void 0 : _p.fileName,
2095
2122
  })];
2096
2123
  case 6:
2097
- _9.sent();
2124
+ _14.sent();
2098
2125
  return [2 /*return*/];
2099
2126
  case 7:
2100
2127
  sheets = [];
2101
2128
  if (!Array.isArray((_r = (_q = this.gridOption) === null || _q === void 0 ? void 0 : _q.export) === null || _r === void 0 ? void 0 : _r.sheets)) return [3 /*break*/, 16];
2102
- _9.label = 8;
2129
+ _14.label = 8;
2103
2130
  case 8:
2104
- _9.trys.push([8, 14, 15, 16]);
2105
- _3 = __values(this.gridOption.export.sheets), _4 = _3.next();
2106
- _9.label = 9;
2131
+ _14.trys.push([8, 14, 15, 16]);
2132
+ _8 = __values(this.gridOption.export.sheets), _9 = _8.next();
2133
+ _14.label = 9;
2107
2134
  case 9:
2108
- if (!!_4.done) return [3 /*break*/, 13];
2109
- sheet = _4.value;
2135
+ if (!!_9.done) return [3 /*break*/, 13];
2136
+ sheet = _9.value;
2110
2137
  if (!(sheet.name && sheet.items && sheet.fields)) return [3 /*break*/, 12];
2111
2138
  if (!Array.isArray(sheet.items)) return [3 /*break*/, 10];
2112
2139
  sheets.push({
@@ -2116,29 +2143,29 @@
2116
2143
  });
2117
2144
  return [3 /*break*/, 12];
2118
2145
  case 10:
2119
- _6 = (_5 = sheets).push;
2120
- _7 = {
2146
+ _11 = (_10 = sheets).push;
2147
+ _12 = {
2121
2148
  name: sheet.name
2122
2149
  };
2123
2150
  return [4 /*yield*/, sheet.items()];
2124
2151
  case 11:
2125
- _6.apply(_5, [(_7.items = _9.sent(),
2126
- _7.fields = sheet.fields,
2127
- _7)]);
2128
- _9.label = 12;
2152
+ _11.apply(_10, [(_12.items = _14.sent(),
2153
+ _12.fields = sheet.fields,
2154
+ _12)]);
2155
+ _14.label = 12;
2129
2156
  case 12:
2130
- _4 = _3.next();
2157
+ _9 = _8.next();
2131
2158
  return [3 /*break*/, 9];
2132
2159
  case 13: return [3 /*break*/, 16];
2133
2160
  case 14:
2134
- e_5_1 = _9.sent();
2135
- e_5 = { error: e_5_1 };
2161
+ e_6_1 = _14.sent();
2162
+ e_6 = { error: e_6_1 };
2136
2163
  return [3 /*break*/, 16];
2137
2164
  case 15:
2138
2165
  try {
2139
- if (_4 && !_4.done && (_8 = _3.return)) _8.call(_3);
2166
+ if (_9 && !_9.done && (_13 = _8.return)) _13.call(_8);
2140
2167
  }
2141
- finally { if (e_5) throw e_5.error; }
2168
+ finally { if (e_6) throw e_6.error; }
2142
2169
  return [7 /*endfinally*/];
2143
2170
  case 16: return [4 /*yield*/, this.exportService.export({
2144
2171
  columns: columns_2,
@@ -2147,7 +2174,7 @@
2147
2174
  sheets: sheets,
2148
2175
  })];
2149
2176
  case 17:
2150
- _9.sent();
2177
+ _14.sent();
2151
2178
  return [2 /*return*/];
2152
2179
  case 18:
2153
2180
  this.isExporting = false;
@@ -2184,7 +2211,7 @@
2184
2211
  };
2185
2212
  this.onExpand = function (rowData) { return __awaiter(_this, void 0, void 0, function () {
2186
2213
  var _y, _z, _0, _1, _2, data;
2187
- return __generator(this, function (_3) {
2214
+ return __generator(this, function (_8) {
2188
2215
  if ((_y = this.gridOption.expand) === null || _y === void 0 ? void 0 : _y.always) {
2189
2216
  return [2 /*return*/];
2190
2217
  }
@@ -2260,7 +2287,7 @@
2260
2287
  };
2261
2288
  this.setFilter = function (args) {
2262
2289
  var _a, _b;
2263
- var _3 = args || {}, columnFilter = _3.columnFilter, externalFilter = _3.externalFilter, filterDef = _3.filterDef;
2290
+ var _8 = args || {}, columnFilter = _8.columnFilter, externalFilter = _8.externalFilter, filterDef = _8.filterDef;
2264
2291
  if (((_b = (_a = _this.gridOption) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.inlineColumn) && columnFilter) {
2265
2292
  _this.columnFilter = columnFilter;
2266
2293
  }
@@ -2348,13 +2375,13 @@
2348
2375
  var _this = this;
2349
2376
  __classPrivateFieldGet(this, _subscription$1).add(__classPrivateFieldGet(this, _reload).pipe(operators.debounceTime(200), operators.switchMap(function (data) { return __awaiter(_this, void 0, void 0, function () {
2350
2377
  var filterInfo, result;
2351
- return __generator(this, function (_3) {
2352
- switch (_3.label) {
2378
+ return __generator(this, function (_8) {
2379
+ switch (_8.label) {
2353
2380
  case 0:
2354
2381
  filterInfo = __classPrivateFieldGet(this, _getFilter).call(this);
2355
2382
  return [4 /*yield*/, __classPrivateFieldGet(this, _load$1).call(this, filterInfo, !__classPrivateFieldGet(this, _loadCompleted) || data.force)];
2356
2383
  case 1:
2357
- result = _3.sent();
2384
+ result = _8.sent();
2358
2385
  __classPrivateFieldSet(this, _loadCompleted, true);
2359
2386
  return [2 /*return*/, result];
2360
2387
  }
@@ -2395,7 +2422,7 @@
2395
2422
  SdTable.decorators = [
2396
2423
  { type: core.Component, args: [{
2397
2424
  selector: 'sd-table',
2398
- template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container *ngIf=\"gridConfiguration | sdGridConfigurationResult : gridOption : sdSubInformation as configuration\">\r\n <sd-grid-filter\r\n *ngIf=\"!gridOption.filter?.disabled && filterRegister\"\r\n [filterRegister]=\"filterRegister\"\r\n [filter]=\"gridOption?.filter\"\r\n [columns]=\"configuration.firstColumns\"\r\n [externalFilters]=\"gridOption?.filter?.externalFilters\"\r\n [filterDefs]=\"filterDefs\"\r\n #gridFilter>\r\n </sd-grid-filter>\r\n <ng-container *ngIf=\"items | sdGroup : gridOption; $implicit as groupedItems\">\r\n <div class=\"c-container\">\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div\r\n class=\"c-table\"\r\n sdScroll\r\n [ngStyle]=\"{\r\n 'max-height': gridOption?.style?.maxHeight,\r\n 'min-height': gridOption?.style?.minHeight\r\n }\">\r\n <table\r\n *ngIf=\"items?.length; else elseEmpty\"\r\n mat-table\r\n [dataSource]=\"groupedItems\"\r\n matSort\r\n [matSortDisabled]=\"!gridOption.sort?.enable\"\r\n multiTemplateDataRows>\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdSubInformation?.templateRef\">\r\n <ng-container *ngIf=\"gridOption?.expand?.always; else useExpandCollapse\">\r\n <ng-container *ngTemplateOutlet=\"sdSubInformation.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-template #useExpandCollapse>\r\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container *ngTemplateOutlet=\"sdSubInformation.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button\r\n *ngIf=\"!element.isExpanding && !gridOption?.expand?.always\"\r\n mat-icon-button\r\n aria-label=\"Expand & Collapse\"\r\n (click)=\"onExpand(element)\">\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th\r\n class=\"text-center px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <ng-container *ngIf=\"items | selectionVisibleSelectAll : gridOption?.selector | async\">\r\n <mat-checkbox\r\n *ngIf=\"!gridOption.selector?.single\"\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\"\r\n (change)=\"onSelectAll()\">\r\n </mat-checkbox>\r\n </ng-container>\r\n </th>\r\n <td class=\"text-center px-15\" mat-cell *matCellDef=\"let item\" style=\"min-width: 50px; max-width: 50px\">\r\n <ng-container *ngIf=\"item | selectionVisible : gridOption?.selector\">\r\n <mat-checkbox\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\"\r\n [disabled]=\"selectedItems | selectionDisable : item : gridOption?.selector\">\r\n </mat-checkbox>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th\r\n class=\"px-8 py-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command [commands]=\"gridOption.commands\" [item]=\"item\"></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\" [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"!item?.sdGroup ? 1 : configuration.displayedColumns.length\">\r\n <div [innerHtml]=\"item?.sdGroup?.htmlTemplate | safeHtml\"></div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n cdkDrag\r\n class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\"\r\n [attr.rowspan]=\"configuration.multipleHeader && column.type !== 'children-col' ? 2 : 1\"\r\n [attr.colspan]=\"column.type === 'children-col' ? column.children?.length : 1\">\r\n <div>\r\n <div\r\n aria-hidden=\"false\"\r\n role=\"presentation\"\r\n mat-sort-header\r\n [disabled]=\"!column.sortable || column.type === 'children-col'\"\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\"\r\n [columnOperator]=\"columnOperator\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell\r\n class=\"d-block px-8\"\r\n *ngIf=\"!item?.sdGroup\"\r\n [sdId]=\"item.meta.id\"\r\n [key]=\"key\"\r\n [value]=\"item[column.field]\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n [idx]=\"i\"\r\n [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"footerDef[column.field].templateRef; context: { items: items, column: column }\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns; let i = index\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"c-th px-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell\r\n class=\"d-block px-8\"\r\n [sdId]=\"item.meta.id\"\r\n [key]=\"key\"\r\n [value]=\"item[column.field]\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n [idx]=\"i\"\r\n [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"footerDef[column.field].templateRef; context: { items: items, column: column }\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"></tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"></tr>\r\n </ng-container>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: configuration.displayedColumns\"\r\n matRipple\r\n class=\"c-row\"\r\n [class.selected]=\"row.isSelected\"></tr>\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']\" class=\"c-detail-row\"></tr>\r\n <ng-container *ngIf=\"hasFooter && configuration.displayedFooters?.length\">\r\n <tr mat-footer-row *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th\r\n class=\"px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th\r\n class=\"px-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td class=\"c-empty\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\">\r\n <ng-container *ngTemplateOutlet=\"sdEmptyData.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\">leaderboard</mat-icon>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\" [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\"></td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.columns\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n </th>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\"\r\n [attr.rowspan]=\"configuration.multipleHeader && column.type !== 'children-col' ? 2 : 1\"\r\n [attr.colspan]=\"column.type === 'children-col' ? column.children?.length : 1\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"></tr>\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button\r\n *ngIf=\"gridFilter && !gridOption.filter?.inlineColumn\"\r\n class=\"mr-10\"\r\n [title]=\"'Filter' | sdTranslate\"\r\n icon=\"filter_alt\"\r\n size=\"sm\"\r\n (action)=\"gridFilter.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n <sd-button\r\n *ngIf=\"gridOption.reload?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Reload' | sdTranslate\"\r\n icon=\"refresh\"\r\n size=\"sm\"\r\n (action)=\"reload()\"\r\n [disabled]=\"!items?.length\"\r\n type=\"link\">\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button class=\"mr-10\" [loading]=\"isExporting\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\" size=\"sm\" type=\"link\">\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button\r\n class=\"mr-10\"\r\n [title]=\"exportTitle | sdTranslate\"\r\n icon=\"get_app\"\r\n size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\"\r\n type=\"link\">\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item (click)=\"exportExcel()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> Xu\u1EA5t excel</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportCSV()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> Xu\u1EA5t CSV</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button\r\n *ngIf=\"gridOption.config?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\"\r\n size=\"sm\"\r\n (action)=\"popupGridConfiguration.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n </div>\r\n <mat-paginator\r\n [class.d-none]=\"gridOption.paginate?.hidden\"\r\n [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\"\r\n [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-grid-quick-action [gridOption]=\"gridOption\" [selectedItems]=\"selectedItems\" (clear)=\"onClearSelection(groupedItems)\">\r\n </sd-grid-quick-action>\r\n <sd-popup-grid-configuration [gridOption]=\"gridOption\" [key]=\"key\" #popupGridConfiguration> </sd-popup-grid-configuration>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>\r\n",
2425
+ template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container *ngIf=\"gridConfiguration | sdGridConfigurationResult : gridOption : sdSubInformation as configuration\">\r\n <sd-grid-filter\r\n *ngIf=\"!gridOption.filter?.disabled && filterRegister\"\r\n [filterRegister]=\"filterRegister\"\r\n [filter]=\"gridOption?.filter\"\r\n [columns]=\"configuration.firstColumns\"\r\n [externalFilters]=\"gridOption?.filter?.externalFilters\"\r\n [filterDefs]=\"filterDefs\"\r\n #gridFilter>\r\n </sd-grid-filter>\r\n <ng-container *ngIf=\"items | sdGroup : gridOption; $implicit as groupedItems\">\r\n <div class=\"c-container\">\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div\r\n class=\"c-table\"\r\n sdScroll\r\n [ngStyle]=\"{\r\n 'max-height': gridOption?.style?.maxHeight,\r\n 'min-height': gridOption?.style?.minHeight\r\n }\">\r\n <table\r\n *ngIf=\"items?.length; else elseEmpty\"\r\n mat-table\r\n [dataSource]=\"groupedItems\"\r\n matSort\r\n [matSortDisabled]=\"!gridOption.sort?.enable\"\r\n multiTemplateDataRows>\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdSubInformation?.templateRef\">\r\n <ng-container *ngIf=\"gridOption?.expand?.always; else useExpandCollapse\">\r\n <ng-container *ngTemplateOutlet=\"sdSubInformation.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-template #useExpandCollapse>\r\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container *ngTemplateOutlet=\"sdSubInformation.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button\r\n *ngIf=\"!element.isExpanding && !gridOption?.expand?.always\"\r\n mat-icon-button\r\n aria-label=\"Expand & Collapse\"\r\n (click)=\"onExpand(element)\">\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th\r\n class=\"text-center px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <ng-container *ngIf=\"items | selectionVisibleSelectAll : gridOption?.selector | async\">\r\n <mat-checkbox\r\n *ngIf=\"!gridOption.selector?.single\"\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\"\r\n (change)=\"onSelectAll()\">\r\n </mat-checkbox>\r\n </ng-container>\r\n </th>\r\n <td class=\"text-center px-15\" mat-cell *matCellDef=\"let item\" style=\"min-width: 50px; max-width: 50px\">\r\n <ng-container *ngIf=\"item | selectionVisible : gridOption?.selector\">\r\n <mat-checkbox\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\"\r\n [disabled]=\"selectedItems | selectionDisable : item : gridOption?.selector\">\r\n </mat-checkbox>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th\r\n class=\"px-8 py-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command [commands]=\"gridOption.commands\" [item]=\"item\"></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\" [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"!item?.sdGroup ? 1 : configuration.displayedColumns.length\">\r\n <div [innerHtml]=\"item?.sdGroup?.htmlTemplate | safeHtml\"></div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n cdkDrag\r\n class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\"\r\n [attr.rowspan]=\"configuration.multipleHeader && column.type !== 'children-col' ? 2 : 1\"\r\n [attr.colspan]=\"column.type === 'children-col' ? column.children?.length : 1\">\r\n <div>\r\n <div\r\n aria-hidden=\"false\"\r\n role=\"presentation\"\r\n mat-sort-header\r\n [disabled]=\"!column.sortable || column.type === 'children-col'\"\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn && columnOperator\"\r\n [value]=\"columnFilter[column.field]\"\r\n [(inlineOperator)]=\"columnOperator[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell\r\n class=\"d-block px-8\"\r\n *ngIf=\"!item?.sdGroup\"\r\n [sdId]=\"item.meta.id\"\r\n [key]=\"key\"\r\n [value]=\"item[column.field]\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n [idx]=\"i\"\r\n [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"footerDef[column.field].templateRef; context: { items: items, column: column }\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns; let i = index\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"c-th px-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn && columnOperator\"\r\n [value]=\"columnFilter[column.field]\"\r\n [(inlineOperator)]=\"columnOperator[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell\r\n class=\"d-block px-8\"\r\n [sdId]=\"item.meta.id\"\r\n [key]=\"key\"\r\n [value]=\"item[column.field]\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n [idx]=\"i\"\r\n [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"footerDef[column.field].templateRef; context: { items: items, column: column }\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"></tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"></tr>\r\n </ng-container>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: configuration.displayedColumns\"\r\n matRipple\r\n class=\"c-row\"\r\n [class.selected]=\"row.isSelected\"></tr>\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']\" class=\"c-detail-row\"></tr>\r\n <ng-container *ngIf=\"hasFooter && configuration.displayedFooters?.length\">\r\n <tr mat-footer-row *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th\r\n class=\"px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th\r\n class=\"px-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td class=\"c-empty\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\">\r\n <ng-container *ngTemplateOutlet=\"sdEmptyData.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\">leaderboard</mat-icon>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\" [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\"></td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.columns\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n </th>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\"\r\n [attr.rowspan]=\"configuration.multipleHeader && column.type !== 'children-col' ? 2 : 1\"\r\n [attr.colspan]=\"column.type === 'children-col' ? column.children?.length : 1\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn && columnOperator\"\r\n [value]=\"columnFilter[column.field]\"\r\n [(inlineOperator)]=\"columnOperator[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div\r\n [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <sd-column-inline-filter\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\"\r\n [columnFilter]=\"columnFilter\"\r\n [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"></tr>\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button\r\n *ngIf=\"gridFilter && !gridOption.filter?.inlineColumn\"\r\n class=\"mr-10\"\r\n [title]=\"'Filter' | sdTranslate\"\r\n icon=\"filter_alt\"\r\n size=\"sm\"\r\n (action)=\"gridFilter.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n <sd-button\r\n *ngIf=\"gridOption.reload?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Reload' | sdTranslate\"\r\n icon=\"refresh\"\r\n size=\"sm\"\r\n (action)=\"reload()\"\r\n [disabled]=\"!items?.length\"\r\n type=\"link\">\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button class=\"mr-10\" [loading]=\"isExporting\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\" size=\"sm\" type=\"link\">\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button\r\n class=\"mr-10\"\r\n [title]=\"exportTitle | sdTranslate\"\r\n icon=\"get_app\"\r\n size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\"\r\n type=\"link\">\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item (click)=\"exportExcel()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> Xu\u1EA5t excel</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportCSV()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> Xu\u1EA5t CSV</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button\r\n *ngIf=\"gridOption.config?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\"\r\n size=\"sm\"\r\n (action)=\"popupGridConfiguration.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n </div>\r\n <mat-paginator\r\n [class.d-none]=\"gridOption.paginate?.hidden\"\r\n [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\"\r\n [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-grid-quick-action [gridOption]=\"gridOption\" [selectedItems]=\"selectedItems\" (clear)=\"onClearSelection(groupedItems)\">\r\n </sd-grid-quick-action>\r\n <sd-popup-grid-configuration [gridOption]=\"gridOption\" [key]=\"key\" #popupGridConfiguration> </sd-popup-grid-configuration>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>\r\n",
2399
2426
  changeDetection: core.ChangeDetectionStrategy.OnPush,
2400
2427
  animations: [
2401
2428
  animations.trigger('detailExpand', [
@@ -3310,47 +3337,74 @@
3310
3337
  var SdFilterOperators = [
3311
3338
  {
3312
3339
  value: 'EQUAL',
3313
- display: '=',
3340
+ symbol: '=',
3341
+ display: 'Bằng',
3314
3342
  },
3315
3343
  {
3316
3344
  value: 'NOT_EQUAL',
3317
- display: '!=',
3345
+ symbol: '',
3346
+ display: 'Không bằng',
3318
3347
  },
3319
- {
3320
- value: 'CONTAIN',
3321
- display: '∈',
3322
- },
3323
- // {
3324
- // value: 'START_WITH';
3325
- // display: '=';
3326
- // },
3327
- // {
3328
- // value: 'END_WITH';
3329
- // display: '=';
3330
- // },
3331
3348
  {
3332
3349
  value: 'GREATER_THAN',
3333
- display: '>',
3350
+ symbol: '>',
3351
+ display: 'Lớn hơn',
3334
3352
  },
3335
3353
  {
3336
3354
  value: 'LESS_THAN',
3337
- display: '<',
3355
+ symbol: '<',
3356
+ display: 'Nhỏ hơn',
3338
3357
  },
3339
3358
  {
3340
3359
  value: 'GREATER_OR_EQUAL',
3341
- display: '>=',
3360
+ symbol: '',
3361
+ display: 'Lớn hơn, hoặc bằng'
3342
3362
  },
3343
3363
  {
3344
3364
  value: 'LESS_OR_EQUAL',
3345
- display: '<=',
3365
+ symbol: '',
3366
+ display: 'Nhỏ hơn, hoặc bằng'
3367
+ },
3368
+ {
3369
+ value: 'CONTAIN',
3370
+ symbol: 'join_inner',
3371
+ display: 'Chứa',
3372
+ },
3373
+ {
3374
+ value: 'NOT_CONTAIN',
3375
+ symbol: 'join',
3376
+ display: 'Không chứa',
3377
+ },
3378
+ {
3379
+ value: 'START_WITH',
3380
+ symbol: 'line_start_circle',
3381
+ display: 'Bắt đầu bởi'
3382
+ },
3383
+ {
3384
+ value: 'END_WITH',
3385
+ symbol: 'line_end_circle',
3386
+ display: 'Kết thúc bởi'
3387
+ },
3388
+ {
3389
+ value: 'IN',
3390
+ symbol: 'checklist_rtl',
3391
+ display: 'Nằm trong'
3392
+ },
3393
+ {
3394
+ value: 'NOT_IN',
3395
+ symbol: 'event_list',
3396
+ display: 'Không nằm trong'
3346
3397
  },
3347
3398
  ];
3348
3399
 
3349
- var _valueChanges, _subcription;
3400
+ var _inlineOperator_1, _valueChanges, _subcription;
3350
3401
  var SdColumnInlineFilter = /** @class */ (function () {
3351
- function SdColumnInlineFilter() {
3402
+ function SdColumnInlineFilter(ref) {
3352
3403
  var _this = this;
3353
- this.columnOperator = {};
3404
+ this.ref = ref;
3405
+ this.inlineSymbol = 'filter_alt';
3406
+ _inlineOperator_1.set(this, void 0);
3407
+ this.inlineOperatorChange = new core.EventEmitter();
3354
3408
  this.columnFilter = {};
3355
3409
  this.operators = [];
3356
3410
  this.filterChange = new core.EventEmitter();
@@ -3359,14 +3413,30 @@
3359
3413
  this.onFilterChange = function () {
3360
3414
  _this.filterChange.emit();
3361
3415
  };
3416
+ this.onChangeOperator = function (operator) {
3417
+ if (operator) {
3418
+ __classPrivateFieldSet(_this, _inlineOperator_1, operator.value);
3419
+ _this.inlineSymbol = operator.symbol;
3420
+ }
3421
+ else {
3422
+ __classPrivateFieldSet(_this, _inlineOperator_1, null);
3423
+ _this.inlineSymbol = 'filter_alt';
3424
+ }
3425
+ _this.inlineOperatorChange.emit(__classPrivateFieldGet(_this, _inlineOperator_1));
3426
+ _this.ref.markForCheck();
3427
+ };
3362
3428
  }
3363
3429
  SdColumnInlineFilter.prototype._value = function (value) {
3364
3430
  this.value = value;
3365
3431
  __classPrivateFieldGet(this, _valueChanges).next();
3366
3432
  };
3367
- Object.defineProperty(SdColumnInlineFilter.prototype, "_columnOperator", {
3368
- set: function (columnOperator) {
3369
- this.columnOperator = columnOperator || {};
3433
+ Object.defineProperty(SdColumnInlineFilter.prototype, "_inlineOperator", {
3434
+ set: function (inlineOperator) {
3435
+ var _a, _b;
3436
+ if (__classPrivateFieldGet(this, _inlineOperator_1) !== inlineOperator) {
3437
+ __classPrivateFieldSet(this, _inlineOperator_1, inlineOperator);
3438
+ this.inlineSymbol = (_b = (_a = SdFilterOperators.find(function (e) { return e.value === inlineOperator; })) === null || _a === void 0 ? void 0 : _a.symbol) !== null && _b !== void 0 ? _b : 'filter_alt';
3439
+ }
3370
3440
  },
3371
3441
  enumerable: false,
3372
3442
  configurable: true
@@ -3412,19 +3482,22 @@
3412
3482
  };
3413
3483
  return SdColumnInlineFilter;
3414
3484
  }());
3415
- _valueChanges = new WeakMap(), _subcription = new WeakMap();
3485
+ _inlineOperator_1 = new WeakMap(), _valueChanges = new WeakMap(), _subcription = new WeakMap();
3416
3486
  SdColumnInlineFilter.decorators = [
3417
3487
  { type: core.Component, args: [{
3418
3488
  selector: 'sd-column-inline-filter',
3419
- template: "<div class=\"d-flex c-inline-column\">\r\n <ng-container\r\n *ngIf=\"\r\n column.type === 'string' ||\r\n column.type === 'number' ||\r\n column.type === 'bool' ||\r\n column.type === 'values' ||\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time';\r\n else noFilter\r\n \">\r\n <sd-select\r\n *ngIf=\"operators.length\"\r\n style=\"width: 60px; margin-right: 4px\"\r\n size=\"sm\"\r\n [items]=\"operators\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n required\r\n [(model)]=\"columnOperator[column.field]\"></sd-select>\r\n <sd-input\r\n *ngIf=\"column.type === 'string'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n type=\"text\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-input>\r\n <sd-input-number\r\n *ngIf=\"column.type === 'number'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-input-number>\r\n <sd-select\r\n *ngIf=\"column.type === 'bool'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"[\r\n { value: '1', display: column.option?.displayOnTrue || 'True' },\r\n { value: '0', display: column.option?.displayOnFalse || 'False' }\r\n ]\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n <ng-template sdSelectDisplayDef let-item=\"item\">\r\n <sd-badge *ngIf=\"item.value === '1'\" color=\"success\" [title]=\"column.option?.displayOnTrue || 'True'\"> </sd-badge>\r\n <sd-badge *ngIf=\"item.value === '0'\" color=\"danger\" [title]=\"column.option?.displayOnFalse || 'False'\"> </sd-badge>\r\n </ng-template>\r\n </sd-select>\r\n <sd-select\r\n *ngIf=\"column.type === 'values' && column?.option?.selection !== 'AUTOCOMPLETE'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n [multiple]=\"column?.option?.selection === 'MULTIPLE' || column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\"\r\n [filtered]=\"column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\">\r\n </sd-select>\r\n <sd-autocomplete\r\n *ngIf=\"column.type === 'values' && column?.option?.selection === 'AUTOCOMPLETE'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-autocomplete>\r\n <ng-container *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\">\r\n <sd-date-range\r\n *ngIf=\"!column.option?.useFilterDate\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [(from)]=\"columnFilter[column.field].from\"\r\n [(to)]=\"columnFilter[column.field].to\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-date-range>\r\n <sd-date-time\r\n *ngIf=\"column.option?.useFilterDate\"\r\n style=\"flex: 1\"\r\n type=\"date\"\r\n size=\"sm\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-date-time>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noFilter>\r\n <sd-input type=\"text\" size=\"sm\" disabled> </sd-input>\r\n </ng-template>\r\n</div>\r\n",
3489
+ template: "<div class=\"d-flex c-inline-column\">\r\n <ng-container\r\n *ngIf=\"\r\n column.type === 'string' ||\r\n column.type === 'number' ||\r\n column.type === 'bool' ||\r\n column.type === 'values' ||\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time';\r\n else noFilter\r\n \">\r\n <div class=\"d-flex align-items-center\" *ngIf=\"operators.length\">\r\n <!-- Only number column icon broken. add mb when not default symbol -->\r\n <sd-button class=\"{{ (column.type === 'number' && inlineSymbol !== 'filter_alt') ? 'mb-4 mr-2 ' :'mr-2 '}}\" fontSet=\"material-symbols-outlined\" [icon]=\"inlineSymbol\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" type=\"link\"> </sd-button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngFor=\"let operator of operators\" (click)=\"onChangeOperator(operator)\" mat-menu-item type=\"button\">\r\n <mat-icon fontSet=\"material-symbols-outlined\" class=\"{{column.type === 'number' ? 'mb-8 ':''}}\">{{ operator.symbol }}</mat-icon>\r\n <span> {{ operator.display }}</span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <sd-input\r\n *ngIf=\"column.type === 'string'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n type=\"text\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-input>\r\n <sd-input-number\r\n *ngIf=\"column.type === 'number'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-input-number>\r\n <sd-select\r\n *ngIf=\"column.type === 'bool'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"[\r\n { value: '1', display: column.option?.displayOnTrue || 'True' },\r\n { value: '0', display: column.option?.displayOnFalse || 'False' }\r\n ]\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n <ng-template sdSelectDisplayDef let-item=\"item\">\r\n <sd-badge *ngIf=\"item.value === '1'\" color=\"success\" [title]=\"column.option?.displayOnTrue || 'True'\"> </sd-badge>\r\n <sd-badge *ngIf=\"item.value === '0'\" color=\"danger\" [title]=\"column.option?.displayOnFalse || 'False'\"> </sd-badge>\r\n </ng-template>\r\n </sd-select>\r\n <sd-select\r\n *ngIf=\"column.type === 'values' && column?.option?.selection !== 'AUTOCOMPLETE'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n [multiple]=\"column?.option?.selection === 'MULTIPLE' || column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\"\r\n [filtered]=\"column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\">\r\n </sd-select>\r\n <sd-autocomplete\r\n *ngIf=\"column.type === 'values' && column?.option?.selection === 'AUTOCOMPLETE'\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-autocomplete>\r\n <ng-container *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\">\r\n <sd-date-range\r\n *ngIf=\"!column.option?.useFilterDate\"\r\n style=\"flex: 1\"\r\n size=\"sm\"\r\n [(from)]=\"columnFilter[column.field].from\"\r\n [(to)]=\"columnFilter[column.field].to\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-date-range>\r\n <sd-date-time\r\n *ngIf=\"column.option?.useFilterDate\"\r\n style=\"flex: 1\"\r\n type=\"date\"\r\n size=\"sm\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-date-time>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noFilter>\r\n <sd-input type=\"text\" size=\"sm\" disabled> </sd-input>\r\n </ng-template>\r\n</div>\r\n",
3420
3490
  changeDetection: core.ChangeDetectionStrategy.OnPush,
3421
3491
  styles: [":host ::ng-deep .c-inline-column .mat-form-field-wrapper{background-color:#fff;border-radius:8px;margin:8px 0 0!important;padding:0!important}"]
3422
3492
  },] }
3423
3493
  ];
3424
- SdColumnInlineFilter.ctorParameters = function () { return []; };
3494
+ SdColumnInlineFilter.ctorParameters = function () { return [
3495
+ { type: core.ChangeDetectorRef }
3496
+ ]; };
3425
3497
  SdColumnInlineFilter.propDecorators = {
3426
3498
  _value: [{ type: core.Input, args: ['value',] }],
3427
- _columnOperator: [{ type: core.Input, args: ['columnOperator',] }],
3499
+ _inlineOperator: [{ type: core.Input, args: ['inlineOperator',] }],
3500
+ inlineOperatorChange: [{ type: core.Output }],
3428
3501
  _columnFilter: [{ type: core.Input, args: ['columnFilter',] }],
3429
3502
  _column: [{ type: core.Input, args: ['column',] }],
3430
3503
  filterChange: [{ type: core.Output }]