jattac.libs.web.responsive-table 0.12.0-rc.4 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -13
- package/dist/Hooks/useTablePlugins.d.ts +0 -8
- package/dist/Plugins/IResponsiveTablePlugin.d.ts +0 -6
- package/dist/UI/DetailRow.d.ts +1 -2
- package/dist/UI/ResponsiveTable.d.ts +0 -11
- package/dist/UI/TableBodyRow.d.ts +6 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.es.js +156 -327
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +155 -327
- package/dist/index.js.map +1 -1
- package/docs/api.md +102 -22
- package/docs/development.md +1 -2
- package/docs/examples.md +57 -1
- package/docs/expand-collapse.md +630 -0
- package/docs/features.md +6 -0
- package/docs/recommendations.md +376 -0
- package/package.json +1 -1
- package/dist/Plugins/InfiniteScrollPlugin.d.ts +0 -13
- package/dist/UI/InfiniteTable.d.ts +0 -46
package/dist/index.es.js
CHANGED
|
@@ -6,7 +6,7 @@ function styleInject(css, ref) {
|
|
|
6
6
|
if ( ref === void 0 ) ref = {};
|
|
7
7
|
var insertAt = ref.insertAt;
|
|
8
8
|
|
|
9
|
-
if (
|
|
9
|
+
if (typeof document === 'undefined') { return; }
|
|
10
10
|
|
|
11
11
|
var head = document.head || document.getElementsByTagName('head')[0];
|
|
12
12
|
var style = document.createElement('style');
|
|
@@ -29,9 +29,9 @@ function styleInject(css, ref) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
var css_248z$2 = ".ResponsiveTable-module_responsiveTable__4y-Od{--table-border-color:#e0e0e0;--table-header-bg:#f8f9fa;--table-row-hover-bg:#f1f3f5;--table-row-stripe-bg:#fafbfc;--card-bg:#fff;--card-border-color:#d1d5db;--card-shadow:0 2px 8px rgba(0,0,0,.06);--text-color:#212529;--text-color-muted:#6c757d;--interactive-color:#0056b3;--primary-color:#007bff;--rt-mobile-card-shadow:0 1px 2px rgba(0,0,0,.04),0 4px 12px rgba(0,0,0,.06),0 12px 32px rgba(0,0,0,.04);--rt-mobile-card-radius:16px;--rt-mobile-bg-wash:#f1f5f9;--rt-mobile-label-color:#475569;--rt-mobile-value-color:#1e293b}.ResponsiveTable-module_tableContainer__VjWjH{border:1px solid var(--table-border-color);border-radius:8px;overflow-x:auto;width:100%}.ResponsiveTable-module_responsiveTable__4y-Od{background-color:var(--card-bg);border-collapse:collapse;color:var(--text-color);width:100%}.ResponsiveTable-module_responsiveTable__4y-Od thead th{background-color:var(--table-header-bg);border-bottom:2px solid var(--table-border-color);color:var(--text-color-muted);font-size:.75rem;font-weight:600;letter-spacing:.05em;padding:1rem;text-align:left;text-transform:uppercase;z-index:1}.ResponsiveTable-module_responsiveTable__4y-Od td{border-bottom:1px solid var(--table-border-color);font-size:.9rem;padding:1rem;text-align:left}.ResponsiveTable-module_responsiveTable__4y-Od tr:last-child td{border-bottom:none}.ResponsiveTable-module_responsiveTable__4y-Od tr:nth-child(2n){background-color:var(--table-row-stripe-bg)}.ResponsiveTable-module_responsiveTable__4y-Od tr:hover{background-color:var(--table-row-hover-bg)}.ResponsiveTable-module_cardContainer__Het4h{background-color:var(--rt-mobile-bg-wash);border-radius:var(--rt-mobile-card-radius);display:flex;flex-direction:column;gap:1.25rem;padding:1rem}.ResponsiveTable-module_card__b-U2v{background-color:var(--card-bg);border:1px solid var(--card-border-color);border-bottom:3px solid var(--primary-color);border-radius:var(--rt-mobile-card-radius);box-shadow:var(--rt-mobile-card-shadow);overflow:hidden;padding:1rem;transition:box-shadow .2s ease-in-out,transform .2s ease-in-out}.ResponsiveTable-module_card__b-U2v:hover{box-shadow:0 2px 4px rgba(0,0,0,.06),0 8px 24px rgba(0,0,0,.08),0 16px 48px rgba(0,0,0,.06);transform:translateY(-4px)}.ResponsiveTable-module_card-header__Ttk51{border-bottom:1px solid var(--table-border-color);margin-bottom:1rem;padding-bottom:.5rem}.ResponsiveTable-module_card-row__qvIUJ{align-items:flex-start;display:flex;gap:1rem;justify-content:space-between;margin:0 0 .75rem}.ResponsiveTable-module_card-row__qvIUJ.ResponsiveTable-module_stacked__FSaTB{align-items:stretch;flex-direction:column;gap:.25rem;margin-bottom:1rem}.ResponsiveTable-module_card-row__qvIUJ:last-child{margin-bottom:0}.ResponsiveTable-module_card-label__v9L71{color:var(--rt-mobile-label-color);font-size:.75rem;font-weight:600;text-transform:uppercase;white-space:nowrap}.ResponsiveTable-module_card-value__BO-c-{color:var(--rt-mobile-value-color);font-size:.95rem;text-align:right}.ResponsiveTable-module_card-row__qvIUJ.ResponsiveTable-module_stacked__FSaTB .ResponsiveTable-module_card-value__BO-c-{text-align:left}.ResponsiveTable-module_numberValue__-TLR1{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;text-align:right!important}.ResponsiveTable-module_dateValue__UMvqJ{color:var(--text-color-muted);font-size:.85rem}.ResponsiveTable-module_imageValue__wVb-p img{border-radius:8px;height:auto;max-width:100%;object-fit:cover}.ResponsiveTable-module_inputValue__CrGMx{margin-top:.5rem;width:100%}.ResponsiveTable-module_inputValue__CrGMx button,.ResponsiveTable-module_inputValue__CrGMx input[type=text],.ResponsiveTable-module_inputValue__CrGMx select,.ResponsiveTable-module_inputValue__CrGMx textarea{min-height:44px;width:100%!important}.ResponsiveTable-module_clickableRow__0kjWm{cursor:pointer}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr{transition:background-color .12s ease}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr.ResponsiveTable-module_clickableRow__0kjWm:active{background-color:var(--table-row-active-bg,#dde3ea);transition:background-color .08s ease}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr.ResponsiveTable-module_clickableRow__0kjWm:focus-visible{outline:2px solid var(--primary-color,#3b82f6);outline-offset:-2px}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_clickableRow__0kjWm:active{box-shadow:0 1px 3px rgba(0,0,0,.08);transform:translateY(-1px);transition:transform .08s ease,box-shadow .08s ease}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_clickableRow__0kjWm:focus-visible{outline:2px solid var(--primary-color,#3b82f6);outline-offset:-2px}.ResponsiveTable-module_clickableHeader__xHQhF{cursor:pointer;transition:color .2s}.ResponsiveTable-module_clickableHeader__xHQhF:hover{color:var(--interactive-color)}.ResponsiveTable-module_sortable__yvA60{cursor:pointer}.ResponsiveTable-module_sorted-asc__jzOIa,.ResponsiveTable-module_sorted-desc__7WCFK{background-color:#f0f7ff!important;color:var(--interactive-color)!important}.ResponsiveTable-module_headerInnerWrapper__3VAhD{align-items:center;display:flex;justify-content:space-between;width:100%}.ResponsiveTable-module_headerContent__ODMzS{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ResponsiveTable-module_sortIcon__A9WtD{background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;height:1rem;margin-left:.5rem;opacity:.3;width:1rem}.ResponsiveTable-module_sortable__yvA60:hover .ResponsiveTable-module_sortIcon__A9WtD{opacity:.8}.ResponsiveTable-module_sortable__yvA60 .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%236c757d'%3E%3Cpath d='M10 18h4v-2h-4v2zm-6-8v2h16V8H4zm3-6h10v2H7V2z'/%3E%3C/svg%3E\")}.ResponsiveTable-module_sorted-asc__jzOIa .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%230056b3'%3E%3Cpath d='m7 14 5-5 5 5z'/%3E%3C/svg%3E\");opacity:1}.ResponsiveTable-module_sorted-desc__7WCFK .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%230056b3'%3E%3Cpath d='m7 10 5 5 5-5z'/%3E%3C/svg%3E\");opacity:1}.ResponsiveTable-module_responsiveTable__4y-Od tfoot{background-color:var(--table-header-bg);border-top:2px solid var(--table-border-color)}.ResponsiveTable-module_footerCell__8H-uG{font-size:.9rem;font-weight:600;padding:1rem;text-align:right}.ResponsiveTable-module_clickableFooterCell__WB9Ss{color:var(--interactive-color);cursor:pointer}.ResponsiveTable-module_clickableFooterCell__WB9Ss:hover{text-decoration:underline}.ResponsiveTable-module_footerCard__-NE2M{background-color:var(--table-header-bg);border:1px solid var(--card-border-color);border-radius:12px;margin-top:1rem;overflow:hidden;padding:1.25rem}.ResponsiveTable-module_footer-card-row__Vv6Ur{display:flex;font-size:.9rem;font-weight:600;justify-content:space-between;margin:0 0 .75rem}.ResponsiveTable-module_selectedRow__-JyNW{background-color:#e7f1ff!important;transition:background-color .15s ease}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_selectedRow__-JyNW{background-color:#e7f1ff;border-left:4px solid var(--primary-color)}.ResponsiveTable-module_animatedRow__SFjrJ{animation:ResponsiveTable-module_cardEntrance__6JjRV .5s cubic-bezier(.2,.8,.2,1) forwards;opacity:0}@keyframes ResponsiveTable-module_cardEntrance__6JjRV{0%{opacity:0;transform:translateY(15px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ResponsiveTable-module_fadeInUp__jMCS7{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ResponsiveTable-module_skeleton__XxsXW{background-color:#f0f0f0;border-radius:4px;overflow:hidden;position:relative}.ResponsiveTable-module_skeleton__XxsXW:after{animation:ResponsiveTable-module_shimmer__H8PhC 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.6),transparent);content:\"\";height:100%;left:-150%;position:absolute;top:0;width:150%}@keyframes ResponsiveTable-module_shimmer__H8PhC{0%{transform:translateX(0)}to{transform:translateX(100%)}}.ResponsiveTable-module_noDataWrapper__Rj-k3{align-items:center;background-color:var(--table-header-bg);border:2px dashed var(--table-border-color);border-radius:12px;color:var(--text-color-muted);display:flex;flex-direction:column;gap:1rem;justify-content:center;padding:4rem 2rem}.ResponsiveTable-module_noData__IpwNq{font-size:1.1rem;font-weight:500}.ResponsiveTable-module_spinner__Pn-3D{animation:ResponsiveTable-module_spin__i3NHn .8s linear infinite;border:3px solid rgba(0,0,0,.1);border-left:3px solid var(--primary-color);border-radius:50%;height:24px;width:24px}@keyframes ResponsiveTable-module_spin__i3NHn{to{transform:rotate(1turn)}}.ResponsiveTable-module_infoContainer__b9IF5{align-items:center;color:var(--text-color-muted);display:flex;font-size:.85rem;gap:.5rem;justify-content:center;padding:1.5rem}.ResponsiveTable-module_stickyHeader__-jjN- th{box-shadow:0 2px 4px rgba(0,0,0,.05);position:sticky;top:0}.ResponsiveTable-module_internalStickyHeader__idiJY th{position:sticky;top:0}.ResponsiveTable-module_detailCell__hb9C5{background:rgba(0,0,0,.012);border-top:none;padding:0;transition:border-left .2s ease}.ResponsiveTable-module_detailCellHasContent__F-DX5{padding-bottom:.5rem}.ResponsiveTable-module_detailCellExpanded__Zr6UF{border-left:2px solid var(--primary-color,#3b82f6)}.ResponsiveTable-module_detailToggleBar__F5Qrk{height:0;overflow:hidden;transition:height .2s ease}.ResponsiveTable-module_detailToggleBarVisible__q9b-3{align-items:center;background:rgba(59,130,246,.08);box-shadow:inset 0 1px 0 rgba(0,0,0,.04);cursor:pointer;display:flex;height:2.5rem;padding:0 .75rem;user-select:none}.ResponsiveTable-module_detailToggleBarVisible__q9b-3:hover{background:rgba(59,130,246,.14)}.ResponsiveTable-module_detailChevron__mBs8j{align-items:center;color:var(--primary-color,#3b82f6);display:flex;font-size:2.2rem;transform:rotate(-90deg);transition:transform .25s ease}.ResponsiveTable-module_detailChevronExpanded__zGFTQ{transform:rotate(0deg)}.ResponsiveTable-module_detailContentWrapper__VzM29{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease}.ResponsiveTable-module_detailContentWrapperExpanded__bkiUb{grid-template-rows:1fr}.ResponsiveTable-module_detailContentInner__GWVaq{overflow:hidden;padding-left:1.5rem}.ResponsiveTable-module_mobileDetailOuter__gusle{background:rgba(0,0,0,.012);overflow:hidden}";
|
|
33
|
-
var styles
|
|
34
|
-
styleInject(css_248z
|
|
32
|
+
var css_248z = ".ResponsiveTable-module_responsiveTable__4y-Od{--table-border-color:#e0e0e0;--table-header-bg:#f8f9fa;--table-row-hover-bg:#f1f3f5;--table-row-stripe-bg:#fafbfc;--card-bg:#fff;--card-border-color:#d1d5db;--card-shadow:0 2px 8px rgba(0,0,0,.06);--text-color:#212529;--text-color-muted:#6c757d;--interactive-color:#0056b3;--primary-color:#007bff;--rt-mobile-card-shadow:0 1px 2px rgba(0,0,0,.04),0 4px 12px rgba(0,0,0,.06),0 12px 32px rgba(0,0,0,.04);--rt-mobile-card-radius:16px;--rt-mobile-bg-wash:#f1f5f9;--rt-mobile-label-color:#475569;--rt-mobile-value-color:#1e293b}.ResponsiveTable-module_tableContainer__VjWjH{border:1px solid var(--table-border-color);border-radius:8px;overflow-x:auto;width:100%}.ResponsiveTable-module_responsiveTable__4y-Od{background-color:var(--card-bg);border-collapse:collapse;color:var(--text-color);width:100%}.ResponsiveTable-module_responsiveTable__4y-Od thead th{background-color:var(--table-header-bg);border-bottom:2px solid var(--table-border-color);color:var(--text-color-muted);font-size:.75rem;font-weight:600;letter-spacing:.05em;padding:1rem;text-align:left;text-transform:uppercase;z-index:1}.ResponsiveTable-module_responsiveTable__4y-Od td{border-bottom:1px solid var(--table-border-color);font-size:.9rem;padding:1rem;text-align:left}.ResponsiveTable-module_responsiveTable__4y-Od tr:last-child td{border-bottom:none}.ResponsiveTable-module_responsiveTable__4y-Od tr:nth-child(2n){background-color:var(--table-row-stripe-bg)}.ResponsiveTable-module_responsiveTable__4y-Od tr:hover{background-color:var(--table-row-hover-bg)}.ResponsiveTable-module_cardContainer__Het4h{background-color:var(--rt-mobile-bg-wash);border-radius:var(--rt-mobile-card-radius);display:flex;flex-direction:column;gap:1.25rem;padding:1rem}.ResponsiveTable-module_card__b-U2v{background-color:var(--card-bg);border:1px solid var(--card-border-color);border-bottom:3px solid var(--primary-color);border-radius:var(--rt-mobile-card-radius);box-shadow:var(--rt-mobile-card-shadow);overflow:hidden;padding:1rem;transition:box-shadow .2s ease-in-out,transform .2s ease-in-out}.ResponsiveTable-module_card__b-U2v:hover{box-shadow:0 2px 4px rgba(0,0,0,.06),0 8px 24px rgba(0,0,0,.08),0 16px 48px rgba(0,0,0,.06);transform:translateY(-4px)}.ResponsiveTable-module_card-header__Ttk51{border-bottom:1px solid var(--table-border-color);margin-bottom:1rem;padding-bottom:.5rem}.ResponsiveTable-module_card-row__qvIUJ{align-items:flex-start;display:flex;gap:1rem;justify-content:space-between;margin:0 0 .75rem}.ResponsiveTable-module_card-row__qvIUJ.ResponsiveTable-module_stacked__FSaTB{align-items:stretch;flex-direction:column;gap:.25rem;margin-bottom:1rem}.ResponsiveTable-module_card-row__qvIUJ:last-child{margin-bottom:0}.ResponsiveTable-module_card-label__v9L71{color:var(--rt-mobile-label-color);font-size:.75rem;font-weight:600;text-transform:uppercase;white-space:nowrap}.ResponsiveTable-module_card-value__BO-c-{color:var(--rt-mobile-value-color);font-size:.95rem;text-align:right}.ResponsiveTable-module_card-row__qvIUJ.ResponsiveTable-module_stacked__FSaTB .ResponsiveTable-module_card-value__BO-c-{text-align:left}.ResponsiveTable-module_numberValue__-TLR1{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;text-align:right!important}.ResponsiveTable-module_dateValue__UMvqJ{color:var(--text-color-muted);font-size:.85rem}.ResponsiveTable-module_imageValue__wVb-p img{border-radius:8px;height:auto;max-width:100%;object-fit:cover}.ResponsiveTable-module_inputValue__CrGMx{margin-top:.5rem;width:100%}.ResponsiveTable-module_inputValue__CrGMx button,.ResponsiveTable-module_inputValue__CrGMx input[type=text],.ResponsiveTable-module_inputValue__CrGMx select,.ResponsiveTable-module_inputValue__CrGMx textarea{min-height:44px;width:100%!important}.ResponsiveTable-module_clickableRow__0kjWm{cursor:pointer}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr{transition:background-color .12s ease}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr.ResponsiveTable-module_clickableRow__0kjWm:active{background-color:var(--table-row-active-bg,#dde3ea);transition:background-color .08s ease}.ResponsiveTable-module_responsiveTable__4y-Od tbody tr.ResponsiveTable-module_clickableRow__0kjWm:focus-visible{outline:2px solid var(--primary-color,#3b82f6);outline-offset:-2px}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_clickableRow__0kjWm:active{box-shadow:0 1px 3px rgba(0,0,0,.08);transform:translateY(-1px);transition:transform .08s ease,box-shadow .08s ease}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_clickableRow__0kjWm:focus-visible{outline:2px solid var(--primary-color,#3b82f6);outline-offset:-2px}.ResponsiveTable-module_clickableHeader__xHQhF{cursor:pointer;transition:color .2s}.ResponsiveTable-module_clickableHeader__xHQhF:hover{color:var(--interactive-color)}.ResponsiveTable-module_sortable__yvA60{cursor:pointer}.ResponsiveTable-module_sorted-asc__jzOIa,.ResponsiveTable-module_sorted-desc__7WCFK{background-color:#f0f7ff!important;color:var(--interactive-color)!important}.ResponsiveTable-module_headerInnerWrapper__3VAhD{align-items:center;display:flex;justify-content:space-between;width:100%}.ResponsiveTable-module_headerContent__ODMzS{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ResponsiveTable-module_sortIcon__A9WtD{background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;height:1rem;margin-left:.5rem;opacity:.3;width:1rem}.ResponsiveTable-module_sortable__yvA60:hover .ResponsiveTable-module_sortIcon__A9WtD{opacity:.8}.ResponsiveTable-module_sortable__yvA60 .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%236c757d'%3E%3Cpath d='M10 18h4v-2h-4v2zm-6-8v2h16V8H4zm3-6h10v2H7V2z'/%3E%3C/svg%3E\")}.ResponsiveTable-module_sorted-asc__jzOIa .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%230056b3'%3E%3Cpath d='m7 14 5-5 5 5z'/%3E%3C/svg%3E\");opacity:1}.ResponsiveTable-module_sorted-desc__7WCFK .ResponsiveTable-module_sortIcon__A9WtD{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%230056b3'%3E%3Cpath d='m7 10 5 5 5-5z'/%3E%3C/svg%3E\");opacity:1}.ResponsiveTable-module_responsiveTable__4y-Od tfoot{background-color:var(--table-header-bg);border-top:2px solid var(--table-border-color)}.ResponsiveTable-module_footerCell__8H-uG{font-size:.9rem;font-weight:600;padding:1rem;text-align:right}.ResponsiveTable-module_clickableFooterCell__WB9Ss{color:var(--interactive-color);cursor:pointer}.ResponsiveTable-module_clickableFooterCell__WB9Ss:hover{text-decoration:underline}.ResponsiveTable-module_footerCard__-NE2M{background-color:var(--table-header-bg);border:1px solid var(--card-border-color);border-radius:12px;margin-top:1rem;overflow:hidden;padding:1.25rem}.ResponsiveTable-module_footer-card-row__Vv6Ur{display:flex;font-size:.9rem;font-weight:600;justify-content:space-between;margin:0 0 .75rem}.ResponsiveTable-module_selectedRow__-JyNW{background-color:#e7f1ff!important;transition:background-color .15s ease}.ResponsiveTable-module_card__b-U2v.ResponsiveTable-module_selectedRow__-JyNW{background-color:#e7f1ff;border-left:4px solid var(--primary-color)}.ResponsiveTable-module_animatedRow__SFjrJ{animation:ResponsiveTable-module_cardEntrance__6JjRV .5s cubic-bezier(.2,.8,.2,1) forwards;opacity:0}@keyframes ResponsiveTable-module_cardEntrance__6JjRV{0%{opacity:0;transform:translateY(15px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ResponsiveTable-module_fadeInUp__jMCS7{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ResponsiveTable-module_skeleton__XxsXW{background-color:#f0f0f0;border-radius:4px;overflow:hidden;position:relative}.ResponsiveTable-module_skeleton__XxsXW:after{animation:ResponsiveTable-module_shimmer__H8PhC 1.5s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.6),transparent);content:\"\";height:100%;left:-150%;position:absolute;top:0;width:150%}@keyframes ResponsiveTable-module_shimmer__H8PhC{0%{transform:translateX(0)}to{transform:translateX(100%)}}.ResponsiveTable-module_noDataWrapper__Rj-k3{align-items:center;background-color:var(--table-header-bg);border:2px dashed var(--table-border-color);border-radius:12px;color:var(--text-color-muted);display:flex;flex-direction:column;gap:1rem;justify-content:center;padding:4rem 2rem}.ResponsiveTable-module_noData__IpwNq{font-size:1.1rem;font-weight:500}.ResponsiveTable-module_spinner__Pn-3D{animation:ResponsiveTable-module_spin__i3NHn .8s linear infinite;border:3px solid rgba(0,0,0,.1);border-left:3px solid var(--primary-color);border-radius:50%;height:24px;width:24px}@keyframes ResponsiveTable-module_spin__i3NHn{to{transform:rotate(1turn)}}.ResponsiveTable-module_infoContainer__b9IF5{align-items:center;color:var(--text-color-muted);display:flex;font-size:.85rem;gap:.5rem;justify-content:center;padding:1.5rem}.ResponsiveTable-module_stickyHeader__-jjN- th{box-shadow:0 2px 4px rgba(0,0,0,.05);position:sticky;top:0}.ResponsiveTable-module_internalStickyHeader__idiJY th{position:sticky;top:0}.ResponsiveTable-module_expandColumn__yvwN-{border-bottom:1px solid var(--table-border-color);min-width:2rem;padding:0!important;text-align:center;vertical-align:middle;width:2rem}.ResponsiveTable-module_expandChevron__7JalN{align-items:center;border-radius:.25rem;color:var(--primary-color,#3b82f6);cursor:pointer;display:inline-flex;font-size:1.125rem;height:1.5rem;justify-content:center;opacity:.25;transform:rotate(-90deg);transition:opacity .15s ease,transform .25s ease;user-select:none;width:1.5rem}.ResponsiveTable-module_expandChevron__7JalN:focus-visible{outline:2px solid var(--primary-color,#3b82f6);outline-offset:2px}@keyframes ResponsiveTable-module_chevronGreeting__nLVUh{0%{opacity:0;transform:rotate(-90deg) scale(.6)}12%{opacity:1;transform:rotate(-90deg) scale(1.3)}22%{opacity:.35;transform:rotate(-90deg) scale(1)}32%{opacity:1;transform:rotate(-90deg) scale(1.15)}45%{opacity:.25;transform:rotate(-90deg) scale(1)}to{opacity:.25;transform:rotate(-90deg) scale(1)}}.ResponsiveTable-module_expandChevronGreeting__hu51J{animation:ResponsiveTable-module_chevronGreeting__nLVUh 2.2s ease-out forwards;animation-delay:calc(var(--row-idx, 0)*60ms)}.ResponsiveTable-module_expandChevronHovered__aNVCU{opacity:.6}.ResponsiveTable-module_expandChevronExpanded__iQ1bV{opacity:1;transform:rotate(0deg)}.ResponsiveTable-module_detailCell__hb9C5{background:rgba(0,0,0,.012);border-top:none;padding:0;transition:border-left .2s ease}.ResponsiveTable-module_detailCellHasContent__F-DX5{padding-bottom:.5rem}.ResponsiveTable-module_detailCellExpanded__Zr6UF{border-left:2px solid var(--primary-color,#3b82f6)}.ResponsiveTable-module_detailToggleBar__F5Qrk{height:0;overflow:hidden;transition:height .25s ease,background .25s ease}.ResponsiveTable-module_detailToggleBarExpanded__l8IWq{align-items:center;background:rgba(59,130,246,.08);box-shadow:inset 0 1px 0 rgba(0,0,0,.04);cursor:pointer;display:flex;gap:.5rem;height:2rem;padding:0 .75rem;user-select:none}.ResponsiveTable-module_detailToggleBarExpanded__l8IWq:hover{background:rgba(59,130,246,.14)}.ResponsiveTable-module_detailToggleChevron__KWp3H{align-items:center;color:var(--primary-color,#3b82f6);display:flex;font-size:1.25rem;opacity:1}.ResponsiveTable-module_detailContentWrapper__VzM29{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease}.ResponsiveTable-module_detailContentWrapperExpanded__bkiUb{grid-template-rows:1fr}.ResponsiveTable-module_detailContentInner__GWVaq{overflow:hidden;padding-left:1.5rem}.ResponsiveTable-module_mobileDetailOuter__gusle{background:rgba(0,0,0,.012);overflow:hidden}.ResponsiveTable-module_mobileExpandRow__Fb0AP{align-items:center;border-bottom:1px solid var(--table-border-color);display:flex;justify-content:flex-start;margin-bottom:.25rem;padding:0 0 .25rem}";
|
|
33
|
+
var styles = {"responsiveTable":"ResponsiveTable-module_responsiveTable__4y-Od","tableContainer":"ResponsiveTable-module_tableContainer__VjWjH","cardContainer":"ResponsiveTable-module_cardContainer__Het4h","card":"ResponsiveTable-module_card__b-U2v","card-header":"ResponsiveTable-module_card-header__Ttk51","card-row":"ResponsiveTable-module_card-row__qvIUJ","stacked":"ResponsiveTable-module_stacked__FSaTB","card-label":"ResponsiveTable-module_card-label__v9L71","card-value":"ResponsiveTable-module_card-value__BO-c-","numberValue":"ResponsiveTable-module_numberValue__-TLR1","dateValue":"ResponsiveTable-module_dateValue__UMvqJ","imageValue":"ResponsiveTable-module_imageValue__wVb-p","inputValue":"ResponsiveTable-module_inputValue__CrGMx","clickableRow":"ResponsiveTable-module_clickableRow__0kjWm","clickableHeader":"ResponsiveTable-module_clickableHeader__xHQhF","sortable":"ResponsiveTable-module_sortable__yvA60","sorted-asc":"ResponsiveTable-module_sorted-asc__jzOIa","sorted-desc":"ResponsiveTable-module_sorted-desc__7WCFK","headerInnerWrapper":"ResponsiveTable-module_headerInnerWrapper__3VAhD","headerContent":"ResponsiveTable-module_headerContent__ODMzS","sortIcon":"ResponsiveTable-module_sortIcon__A9WtD","footerCell":"ResponsiveTable-module_footerCell__8H-uG","clickableFooterCell":"ResponsiveTable-module_clickableFooterCell__WB9Ss","footerCard":"ResponsiveTable-module_footerCard__-NE2M","footer-card-row":"ResponsiveTable-module_footer-card-row__Vv6Ur","selectedRow":"ResponsiveTable-module_selectedRow__-JyNW","animatedRow":"ResponsiveTable-module_animatedRow__SFjrJ","cardEntrance":"ResponsiveTable-module_cardEntrance__6JjRV","skeleton":"ResponsiveTable-module_skeleton__XxsXW","shimmer":"ResponsiveTable-module_shimmer__H8PhC","noDataWrapper":"ResponsiveTable-module_noDataWrapper__Rj-k3","noData":"ResponsiveTable-module_noData__IpwNq","spinner":"ResponsiveTable-module_spinner__Pn-3D","spin":"ResponsiveTable-module_spin__i3NHn","infoContainer":"ResponsiveTable-module_infoContainer__b9IF5","stickyHeader":"ResponsiveTable-module_stickyHeader__-jjN-","internalStickyHeader":"ResponsiveTable-module_internalStickyHeader__idiJY","expandColumn":"ResponsiveTable-module_expandColumn__yvwN-","expandChevron":"ResponsiveTable-module_expandChevron__7JalN","expandChevronGreeting":"ResponsiveTable-module_expandChevronGreeting__hu51J","chevronGreeting":"ResponsiveTable-module_chevronGreeting__nLVUh","expandChevronHovered":"ResponsiveTable-module_expandChevronHovered__aNVCU","expandChevronExpanded":"ResponsiveTable-module_expandChevronExpanded__iQ1bV","detailCell":"ResponsiveTable-module_detailCell__hb9C5","detailCellHasContent":"ResponsiveTable-module_detailCellHasContent__F-DX5","detailCellExpanded":"ResponsiveTable-module_detailCellExpanded__Zr6UF","detailToggleBar":"ResponsiveTable-module_detailToggleBar__F5Qrk","detailToggleBarExpanded":"ResponsiveTable-module_detailToggleBarExpanded__l8IWq","detailToggleChevron":"ResponsiveTable-module_detailToggleChevron__KWp3H","detailContentWrapper":"ResponsiveTable-module_detailContentWrapper__VzM29","detailContentWrapperExpanded":"ResponsiveTable-module_detailContentWrapperExpanded__bkiUb","detailContentInner":"ResponsiveTable-module_detailContentInner__GWVaq","mobileDetailOuter":"ResponsiveTable-module_mobileDetailOuter__gusle","mobileExpandRow":"ResponsiveTable-module_mobileExpandRow__Fb0AP","fadeInUp":"ResponsiveTable-module_fadeInUp__jMCS7"};
|
|
34
|
+
styleInject(css_248z);
|
|
35
35
|
|
|
36
36
|
/******************************************************************************
|
|
37
37
|
Copyright (c) Microsoft Corporation.
|
|
@@ -112,7 +112,7 @@ function TableProvider({ children, value }) {
|
|
|
112
112
|
var _a;
|
|
113
113
|
const rawColumnDefinition = getRawColumnDefinition(colDef);
|
|
114
114
|
return onHeaderClick
|
|
115
|
-
? ((_a = rawColumnDefinition.interactivity) === null || _a === void 0 ? void 0 : _a.className) || styles
|
|
115
|
+
? ((_a = rawColumnDefinition.interactivity) === null || _a === void 0 ? void 0 : _a.className) || styles.clickableHeader
|
|
116
116
|
: '';
|
|
117
117
|
}, [getRawColumnDefinition]);
|
|
118
118
|
const getHeaderProps = useCallback((colDef) => {
|
|
@@ -192,13 +192,13 @@ function TableHeaderCell(props) {
|
|
|
192
192
|
const rawColDef = getRawColumnDefinition(columnDefinition);
|
|
193
193
|
const clickableHeaderClassName = getClickableHeaderClassName(onHeaderClick, columnDefinition);
|
|
194
194
|
const headerProps = getHeaderProps(columnDefinition);
|
|
195
|
-
const combinedClassName = `${clickableHeaderClassName} ${headerProps.className ? styles
|
|
195
|
+
const combinedClassName = `${clickableHeaderClassName} ${headerProps.className ? styles[headerProps.className] : ''} ${rawColDef.headerClassName || ''}`.trim();
|
|
196
196
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
197
197
|
const { className } = headerProps, restHeaderProps = __rest(headerProps, ["className"]);
|
|
198
198
|
return (React.createElement("th", Object.assign({ key: colIndex, className: combinedClassName, style: Object.assign(Object.assign({}, headerProps.style), rawColDef.headerStyle) }, restHeaderProps, { onClick: onHeaderClick ? () => onHeaderClick(rawColDef.interactivity.id) : restHeaderProps.onClick }),
|
|
199
|
-
React.createElement("div", { className: styles
|
|
200
|
-
React.createElement("div", { className: styles
|
|
201
|
-
React.createElement("span", { className: styles
|
|
199
|
+
React.createElement("div", { className: styles.headerInnerWrapper },
|
|
200
|
+
React.createElement("div", { className: styles.headerContent }, getColumnDefinition(columnDefinition, 0).displayLabel),
|
|
201
|
+
React.createElement("span", { className: styles.sortIcon }))));
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
function TableBodyCell(props) {
|
|
@@ -210,12 +210,12 @@ function TableBodyCell(props) {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
function TableBodyRow(props) {
|
|
213
|
-
const { row, rowIndex, columnDefinitions, onRowClick, selectionProps, animationProps, } = props;
|
|
213
|
+
const { row, rowIndex, columnDefinitions, onRowClick, selectionProps, animationProps, expandCell, onMouseEnter, onMouseLeave, } = props;
|
|
214
214
|
const { getRowProps } = useTableContext();
|
|
215
215
|
const rowProps = getRowProps(row);
|
|
216
216
|
const isClickable = onRowClick || selectionProps;
|
|
217
217
|
const pluginOnClick = rowProps.onClick;
|
|
218
|
-
return (React.createElement("tr", { className: `${isClickable ? styles
|
|
218
|
+
return (React.createElement("tr", { className: `${isClickable ? styles.clickableRow : ''} ${(animationProps === null || animationProps === void 0 ? void 0 : animationProps.animateOnLoad) ? styles.animatedRow : ''} ${rowProps.className || ''}`.trim(), style: { animationDelay: `${rowIndex * 0.05}s` }, tabIndex: isClickable ? 0 : undefined, "aria-selected": rowProps['aria-selected'], onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onClickCapture: (e) => {
|
|
219
219
|
// Capture Phase: Check for the ignore attribute BEFORE child handlers run.
|
|
220
220
|
// This prevents issues where child handlers trigger a re-render/unmount
|
|
221
221
|
// that detaches the target from the DOM before the bubbling phase.
|
|
@@ -234,42 +234,45 @@ function TableBodyRow(props) {
|
|
|
234
234
|
if (onRowClick) {
|
|
235
235
|
onRowClick(row);
|
|
236
236
|
}
|
|
237
|
-
} },
|
|
238
|
-
|
|
237
|
+
} },
|
|
238
|
+
expandCell,
|
|
239
|
+
columnDefinitions.map((columnDefinition, colIndex) => (React.createElement("td", { key: colIndex },
|
|
240
|
+
React.createElement(TableBodyCell, { row: row, rowIndex: rowIndex, columnDefinition: columnDefinition }))))));
|
|
239
241
|
}
|
|
240
242
|
|
|
241
|
-
function DetailRow({ row, rowIndex, colSpan, expandRowRenderer, isExpanded, onToggle
|
|
243
|
+
function DetailRow({ row, rowIndex, colSpan, expandRowRenderer, isExpanded, onToggle }) {
|
|
242
244
|
const content = expandRowRenderer(row, rowIndex);
|
|
243
245
|
const hasContent = content != null;
|
|
244
246
|
const [everExpanded, setEverExpanded] = useState(false);
|
|
245
247
|
if (isExpanded && !everExpanded)
|
|
246
248
|
setEverExpanded(true);
|
|
247
249
|
const tdClass = [
|
|
248
|
-
styles
|
|
249
|
-
hasContent ? styles
|
|
250
|
-
isExpanded ? styles
|
|
250
|
+
styles.detailCell,
|
|
251
|
+
hasContent ? styles.detailCellHasContent : '',
|
|
252
|
+
isExpanded ? styles.detailCellExpanded : '',
|
|
251
253
|
].join(' ').trim();
|
|
252
|
-
const
|
|
253
|
-
styles
|
|
254
|
-
isExpanded ? styles
|
|
255
|
-
expandChevronClassName !== null && expandChevronClassName !== void 0 ? expandChevronClassName : '',
|
|
254
|
+
const toggleBarClass = [
|
|
255
|
+
styles.detailToggleBar,
|
|
256
|
+
isExpanded ? styles.detailToggleBarExpanded : '',
|
|
256
257
|
].join(' ').trim();
|
|
258
|
+
const toggleAttrs = {
|
|
259
|
+
role: 'button',
|
|
260
|
+
tabIndex: 0,
|
|
261
|
+
'aria-expanded': isExpanded,
|
|
262
|
+
onClick: onToggle,
|
|
263
|
+
onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
|
|
264
|
+
e.preventDefault();
|
|
265
|
+
onToggle();
|
|
266
|
+
} },
|
|
267
|
+
'data-rt-ignore-row-click': true,
|
|
268
|
+
};
|
|
257
269
|
return (React.createElement("tr", null,
|
|
258
270
|
React.createElement("td", { colSpan: colSpan, className: tdClass },
|
|
259
|
-
React.createElement("div", Object.assign({ className:
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
|
|
265
|
-
e.preventDefault();
|
|
266
|
-
onToggle();
|
|
267
|
-
} },
|
|
268
|
-
'data-rt-ignore-row-click': true,
|
|
269
|
-
} : {})), hasContent && (React.createElement("span", { className: chevronClass },
|
|
270
|
-
React.createElement(MdArrowDropDown, null)))),
|
|
271
|
-
React.createElement("div", { className: `${styles$2.detailContentWrapper} ${isExpanded ? styles$2.detailContentWrapperExpanded : ''}` },
|
|
272
|
-
React.createElement("div", { className: styles$2.detailContentInner }, everExpanded && content)))));
|
|
271
|
+
isExpanded && (React.createElement("div", Object.assign({ className: toggleBarClass }, toggleAttrs),
|
|
272
|
+
React.createElement("span", { className: styles.detailToggleChevron },
|
|
273
|
+
React.createElement(MdArrowDropDown, null)))),
|
|
274
|
+
React.createElement("div", { className: `${styles.detailContentWrapper} ${isExpanded ? styles.detailContentWrapperExpanded : ''}` },
|
|
275
|
+
React.createElement("div", { className: styles.detailContentInner }, everExpanded && content)))));
|
|
273
276
|
}
|
|
274
277
|
|
|
275
278
|
const TableSentinel = ({ onIntersect, isLoading }) => {
|
|
@@ -303,6 +306,12 @@ function DesktopView(props) {
|
|
|
303
306
|
const { maxHeight, isHeaderSticky, tableContainerRef, headerRef, footerRows, renderPluginFooters, onScroll, } = props;
|
|
304
307
|
const { visibleColumns, originalColumnDefinitions, currentData, getRawColumnDefinition, onRowClick, selectionProps, animationProps, pagination, expandRowRenderer, expandChevronClassName, getRowId, } = useTableContext();
|
|
305
308
|
const [expandedIds, setExpandedIds] = useState(new Set());
|
|
309
|
+
const [hoveredRowId, setHoveredRowId] = useState(null);
|
|
310
|
+
const [greetingActive, setGreetingActive] = useState(true);
|
|
311
|
+
useEffect(() => {
|
|
312
|
+
const t = setTimeout(() => setGreetingActive(false), 3200);
|
|
313
|
+
return () => clearTimeout(t);
|
|
314
|
+
}, []);
|
|
306
315
|
const toggleExpanded = useCallback((id) => {
|
|
307
316
|
setExpandedIds(prev => {
|
|
308
317
|
const next = new Set(prev);
|
|
@@ -333,41 +342,60 @@ function DesktopView(props) {
|
|
|
333
342
|
}
|
|
334
343
|
return (React.createElement("tfoot", null, footerRows.map((row, rowIndex) => {
|
|
335
344
|
let currentOriginalIndex = 0;
|
|
336
|
-
return (React.createElement("tr", { key: rowIndex },
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
345
|
+
return (React.createElement("tr", { key: rowIndex },
|
|
346
|
+
expandRowRenderer && React.createElement("td", { className: styles.expandColumn }),
|
|
347
|
+
row.columns.map((col, colIndex) => {
|
|
348
|
+
const effectiveColSpan = getEffectiveColSpan(col, currentOriginalIndex);
|
|
349
|
+
currentOriginalIndex += (col.colSpan || 1);
|
|
350
|
+
if (effectiveColSpan === 0)
|
|
351
|
+
return null;
|
|
352
|
+
return (React.createElement("td", { key: colIndex, colSpan: effectiveColSpan, className: `${styles.footerCell} ${col.className || ''} ${col.onCellClick ? styles.clickableFooterCell : ''}`, onClick: col.onCellClick }, col.cellRenderer()));
|
|
353
|
+
})));
|
|
343
354
|
})));
|
|
344
|
-
}, [footerRows, getEffectiveColSpan]);
|
|
355
|
+
}, [footerRows, getEffectiveColSpan, expandRowRenderer]);
|
|
345
356
|
const useFixedHeaders = !!maxHeight;
|
|
346
357
|
const fixedHeadersStyle = useFixedHeaders
|
|
347
358
|
? { maxHeight, overflowY: 'auto' }
|
|
348
359
|
: {};
|
|
349
360
|
const headerClassName = useFixedHeaders
|
|
350
|
-
? styles
|
|
351
|
-
: (isHeaderSticky ? styles
|
|
352
|
-
return (React.createElement("div", { className: styles
|
|
353
|
-
React.createElement("table", { className: styles
|
|
361
|
+
? styles.internalStickyHeader
|
|
362
|
+
: (isHeaderSticky ? styles.stickyHeader : '');
|
|
363
|
+
return (React.createElement("div", { className: styles.tableContainer, style: fixedHeadersStyle, ref: tableContainerRef, onScroll: onScroll },
|
|
364
|
+
React.createElement("table", { className: styles['responsiveTable'] },
|
|
354
365
|
React.createElement("thead", { ref: headerRef, className: headerClassName },
|
|
355
|
-
React.createElement("tr", null,
|
|
366
|
+
React.createElement("tr", null,
|
|
367
|
+
expandRowRenderer && React.createElement("th", { className: styles.expandColumn }),
|
|
368
|
+
visibleColumns.map((columnDefinition, colIndex) => (React.createElement(TableHeaderCell, { key: colIndex, columnDefinition: columnDefinition, colIndex: colIndex }))))),
|
|
356
369
|
React.createElement("tbody", null, currentData.map((row, rowIndex) => {
|
|
357
370
|
const rowId = getRowId(row, rowIndex);
|
|
371
|
+
const isExpanded = expandedIds.has(rowId);
|
|
372
|
+
const isHovered = hoveredRowId === rowId;
|
|
373
|
+
const rowContent = expandRowRenderer === null || expandRowRenderer === void 0 ? void 0 : expandRowRenderer(row, rowIndex);
|
|
374
|
+
const rowHasContent = rowContent != null;
|
|
375
|
+
const chevronClasses = [
|
|
376
|
+
styles.expandChevron,
|
|
377
|
+
greetingActive && rowHasContent ? styles.expandChevronGreeting : '',
|
|
378
|
+
isExpanded ? styles.expandChevronExpanded : '',
|
|
379
|
+
isHovered && !isExpanded ? styles.expandChevronHovered : '',
|
|
380
|
+
expandChevronClassName !== null && expandChevronClassName !== void 0 ? expandChevronClassName : '',
|
|
381
|
+
].filter(Boolean).join(' ').trim();
|
|
358
382
|
return (React.createElement(React.Fragment, { key: rowId },
|
|
359
|
-
React.createElement(TableBodyRow, { row: row, rowIndex: rowIndex, columnDefinitions: visibleColumns, onRowClick: onRowClick, selectionProps: selectionProps, animationProps: animationProps }),
|
|
360
|
-
|
|
383
|
+
React.createElement(TableBodyRow, { row: row, rowIndex: rowIndex, columnDefinitions: visibleColumns, onRowClick: onRowClick, selectionProps: selectionProps, animationProps: animationProps, expandCell: expandRowRenderer ? (React.createElement("td", { className: styles.expandColumn, style: { '--row-idx': rowIndex } }, rowHasContent && (React.createElement("span", { className: chevronClasses, role: "button", tabIndex: 0, "aria-expanded": isExpanded, onClick: (e) => { e.stopPropagation(); toggleExpanded(rowId); }, onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
|
|
384
|
+
e.preventDefault();
|
|
385
|
+
toggleExpanded(rowId);
|
|
386
|
+
} }, "data-rt-ignore-row-click": true },
|
|
387
|
+
React.createElement(MdArrowDropDown, null))))) : undefined, onMouseEnter: () => expandRowRenderer && setHoveredRowId(rowId), onMouseLeave: () => expandRowRenderer && setHoveredRowId(null) }),
|
|
388
|
+
expandRowRenderer && rowHasContent && (React.createElement(DetailRow, { row: row, rowIndex: rowIndex, colSpan: visibleColumns.length + 1, expandRowRenderer: expandRowRenderer, isExpanded: isExpanded, onToggle: () => toggleExpanded(rowId) }))));
|
|
361
389
|
})),
|
|
362
390
|
tableFooter),
|
|
363
391
|
(pagination === null || pagination === void 0 ? void 0 : pagination.hasMore) && (React.createElement(TableSentinel, { onIntersect: () => pagination.loadNextPage(), isLoading: pagination.isFetchingMore })),
|
|
364
|
-
(pagination === null || pagination === void 0 ? void 0 : pagination.isFetchingMore) && (React.createElement("div", { className: styles
|
|
365
|
-
React.createElement("div", { className: styles
|
|
392
|
+
(pagination === null || pagination === void 0 ? void 0 : pagination.isFetchingMore) && (React.createElement("div", { className: styles.infoContainer },
|
|
393
|
+
React.createElement("div", { className: styles.spinner }),
|
|
366
394
|
React.createElement("span", null, "Loading more items..."))),
|
|
367
395
|
renderPluginFooters()));
|
|
368
396
|
}
|
|
369
397
|
|
|
370
|
-
function MobileDetailSection({ row, rowIndex, expandRowRenderer, isExpanded, onToggle
|
|
398
|
+
function MobileDetailSection({ row, rowIndex, expandRowRenderer, isExpanded, onToggle }) {
|
|
371
399
|
const content = expandRowRenderer(row, rowIndex);
|
|
372
400
|
const hasContent = content != null;
|
|
373
401
|
const [everExpanded, setEverExpanded] = useState(false);
|
|
@@ -375,31 +403,44 @@ function MobileDetailSection({ row, rowIndex, expandRowRenderer, isExpanded, onT
|
|
|
375
403
|
setEverExpanded(true);
|
|
376
404
|
if (!hasContent)
|
|
377
405
|
return null;
|
|
378
|
-
const chevronClass = [
|
|
379
|
-
styles$2.detailChevron,
|
|
380
|
-
isExpanded ? styles$2.detailChevronExpanded : '',
|
|
381
|
-
expandChevronClassName !== null && expandChevronClassName !== void 0 ? expandChevronClassName : '',
|
|
382
|
-
].join(' ').trim();
|
|
383
406
|
const outerClass = [
|
|
384
|
-
styles
|
|
385
|
-
styles
|
|
386
|
-
isExpanded ? styles
|
|
407
|
+
styles.mobileDetailOuter,
|
|
408
|
+
styles.detailCellHasContent,
|
|
409
|
+
isExpanded ? styles.detailCellExpanded : '',
|
|
410
|
+
].join(' ').trim();
|
|
411
|
+
const toggleBarClass = [
|
|
412
|
+
styles.detailToggleBar,
|
|
413
|
+
isExpanded ? styles.detailToggleBarExpanded : '',
|
|
387
414
|
].join(' ').trim();
|
|
415
|
+
const toggleAttrs = {
|
|
416
|
+
role: 'button',
|
|
417
|
+
tabIndex: 0,
|
|
418
|
+
'aria-expanded': isExpanded,
|
|
419
|
+
onClick: onToggle,
|
|
420
|
+
onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
|
|
421
|
+
e.preventDefault();
|
|
422
|
+
onToggle();
|
|
423
|
+
} },
|
|
424
|
+
'data-rt-ignore-row-click': true,
|
|
425
|
+
};
|
|
388
426
|
return (React.createElement("div", { className: outerClass },
|
|
389
|
-
React.createElement("div", { className:
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
React.createElement("
|
|
394
|
-
React.createElement(MdArrowDropDown, null))),
|
|
395
|
-
React.createElement("div", { className: `${styles$2.detailContentWrapper} ${isExpanded ? styles$2.detailContentWrapperExpanded : ''}` },
|
|
396
|
-
React.createElement("div", { className: styles$2.detailContentInner }, everExpanded && content))));
|
|
427
|
+
isExpanded && (React.createElement("div", Object.assign({ className: toggleBarClass }, toggleAttrs),
|
|
428
|
+
React.createElement("span", { className: styles.detailToggleChevron },
|
|
429
|
+
React.createElement(MdArrowDropDown, null)))),
|
|
430
|
+
React.createElement("div", { className: `${styles.detailContentWrapper} ${isExpanded ? styles.detailContentWrapperExpanded : ''}` },
|
|
431
|
+
React.createElement("div", { className: styles.detailContentInner }, everExpanded && content))));
|
|
397
432
|
}
|
|
398
433
|
function MobileView(props) {
|
|
399
434
|
const { mobileFooter } = props;
|
|
400
435
|
const { currentData, visibleColumns, onRowClick, selectionProps, animationProps, getRowProps, getRowId, getColumnDefinition, onHeaderClickCallback, getClickableHeaderClassName, pagination, mobileCardClassName, expandRowRenderer, expandChevronClassName, } = useTableContext();
|
|
401
436
|
const isClickable = onRowClick || selectionProps;
|
|
402
437
|
const [expandedIds, setExpandedIds] = useState(new Set());
|
|
438
|
+
const [hoveredRowId, setHoveredRowId] = useState(null);
|
|
439
|
+
const [greetingActive, setGreetingActive] = useState(true);
|
|
440
|
+
useEffect(() => {
|
|
441
|
+
const t = setTimeout(() => setGreetingActive(false), 3200);
|
|
442
|
+
return () => clearTimeout(t);
|
|
443
|
+
}, []);
|
|
403
444
|
const toggleExpanded = useCallback((id) => {
|
|
404
445
|
setExpandedIds(prev => {
|
|
405
446
|
const next = new Set(prev);
|
|
@@ -440,19 +481,30 @@ function MobileView(props) {
|
|
|
440
481
|
};
|
|
441
482
|
const getTypeClassName = (dataType) => {
|
|
442
483
|
switch (dataType) {
|
|
443
|
-
case 'number': return styles
|
|
444
|
-
case 'date': return styles
|
|
445
|
-
case 'image': return styles
|
|
446
|
-
case 'input': return styles
|
|
484
|
+
case 'number': return styles.numberValue;
|
|
485
|
+
case 'date': return styles.dateValue;
|
|
486
|
+
case 'image': return styles.imageValue;
|
|
487
|
+
case 'input': return styles.inputValue;
|
|
447
488
|
default: return '';
|
|
448
489
|
}
|
|
449
490
|
};
|
|
450
|
-
return (React.createElement("div", { className: styles
|
|
491
|
+
return (React.createElement("div", { className: styles.cardContainer },
|
|
451
492
|
currentData.map((row, rowIndex) => {
|
|
452
493
|
const rowProps = getRowProps(row);
|
|
453
494
|
const pluginOnClick = rowProps.onClick;
|
|
454
|
-
|
|
455
|
-
|
|
495
|
+
const rowId = getRowId(row, rowIndex);
|
|
496
|
+
const isExpanded = expandedIds.has(rowId);
|
|
497
|
+
const rowContent = expandRowRenderer === null || expandRowRenderer === void 0 ? void 0 : expandRowRenderer(row, rowIndex);
|
|
498
|
+
const rowHasContent = rowContent != null;
|
|
499
|
+
const chevronClasses = [
|
|
500
|
+
styles.expandChevron,
|
|
501
|
+
greetingActive && rowHasContent ? styles.expandChevronGreeting : '',
|
|
502
|
+
isExpanded ? styles.expandChevronExpanded : '',
|
|
503
|
+
hoveredRowId === rowId && !isExpanded ? styles.expandChevronHovered : '',
|
|
504
|
+
expandChevronClassName !== null && expandChevronClassName !== void 0 ? expandChevronClassName : '',
|
|
505
|
+
].filter(Boolean).join(' ').trim();
|
|
506
|
+
return (React.createElement(React.Fragment, { key: rowId },
|
|
507
|
+
React.createElement("div", { className: `${styles.card} ${isClickable ? styles.clickableRow : ''} ${(animationProps === null || animationProps === void 0 ? void 0 : animationProps.animateOnLoad) ? styles.animatedRow : ''} ${rowProps.className || ''} ${mobileCardClassName || ''}`.trim(), style: { animationDelay: `${rowIndex * 0.05}s` }, tabIndex: isClickable ? 0 : undefined, "aria-selected": rowProps['aria-selected'], onMouseEnter: () => expandRowRenderer && setHoveredRowId(rowId), onMouseLeave: () => expandRowRenderer && setHoveredRowId(null), onClickCapture: (e) => {
|
|
456
508
|
const target = e.target;
|
|
457
509
|
if (target.closest('[data-rt-ignore-row-click]')) {
|
|
458
510
|
e.nativeEvent._rtIgnoreRowClick = true;
|
|
@@ -466,7 +518,13 @@ function MobileView(props) {
|
|
|
466
518
|
if (onRowClick)
|
|
467
519
|
onRowClick(row);
|
|
468
520
|
} },
|
|
469
|
-
React.createElement("div", { className: styles
|
|
521
|
+
expandRowRenderer && rowHasContent && (React.createElement("div", { className: styles.mobileExpandRow, style: { '--row-idx': rowIndex } },
|
|
522
|
+
React.createElement("span", { className: chevronClasses, role: "button", tabIndex: 0, "aria-expanded": isExpanded, onClick: (e) => { e.stopPropagation(); toggleExpanded(rowId); }, onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
|
|
523
|
+
e.preventDefault();
|
|
524
|
+
toggleExpanded(rowId);
|
|
525
|
+
} }, "data-rt-ignore-row-click": true },
|
|
526
|
+
React.createElement(MdArrowDropDown, null)))),
|
|
527
|
+
React.createElement("div", { className: styles['card-body'] }, visibleColumns.map((columnDefinition, colIndex) => {
|
|
470
528
|
const colDef = getColumnDefinition(columnDefinition, rowIndex);
|
|
471
529
|
const onHeaderClick = onHeaderClickCallback(columnDefinition);
|
|
472
530
|
const clickableHeaderClassName = getClickableHeaderClassName(onHeaderClick, columnDefinition);
|
|
@@ -475,21 +533,21 @@ function MobileView(props) {
|
|
|
475
533
|
const sampleValue = colDef.dataKey ? row[colDef.dataKey] : null;
|
|
476
534
|
const dataType = inferDataType(colDef, sampleValue);
|
|
477
535
|
const typeClassName = getTypeClassName(dataType);
|
|
478
|
-
return (React.createElement("div", { key: colIndex, className: `${styles
|
|
479
|
-
React.createElement("span", { className: `${styles
|
|
536
|
+
return (React.createElement("div", { key: colIndex, className: `${styles['card-row']} ${styles.stacked}` },
|
|
537
|
+
React.createElement("span", { className: `${styles['card-label']} ${clickableHeaderClassName} ${colDef.headerClassName || ''}`, style: colDef.headerStyle, onClick: (e) => {
|
|
480
538
|
if (onHeaderClick) {
|
|
481
539
|
e.stopPropagation();
|
|
482
540
|
onHeaderClick(colDef.interactivity.id);
|
|
483
541
|
}
|
|
484
542
|
} }, colDef.displayLabel),
|
|
485
|
-
React.createElement("span", { className: `${styles
|
|
543
|
+
React.createElement("span", { className: `${styles['card-value']} ${typeClassName} ${colDef.cellClassName || ''}`, style: colDef.cellStyle },
|
|
486
544
|
React.createElement(TableBodyCell, { row: row, rowIndex: rowIndex, columnDefinition: columnDefinition }))));
|
|
487
545
|
}))),
|
|
488
|
-
expandRowRenderer && (React.createElement(MobileDetailSection, { row: row, rowIndex: rowIndex, expandRowRenderer: expandRowRenderer, isExpanded:
|
|
546
|
+
expandRowRenderer && rowHasContent && (React.createElement(MobileDetailSection, { row: row, rowIndex: rowIndex, expandRowRenderer: expandRowRenderer, isExpanded: isExpanded, onToggle: () => toggleExpanded(rowId) }))));
|
|
489
547
|
}),
|
|
490
548
|
(pagination === null || pagination === void 0 ? void 0 : pagination.hasMore) && (React.createElement(TableSentinel, { onIntersect: () => pagination.loadNextPage(), isLoading: pagination.isFetchingMore })),
|
|
491
|
-
(pagination === null || pagination === void 0 ? void 0 : pagination.isFetchingMore) && (React.createElement("div", { className: styles
|
|
492
|
-
React.createElement("div", { className: styles
|
|
549
|
+
(pagination === null || pagination === void 0 ? void 0 : pagination.isFetchingMore) && (React.createElement("div", { className: styles.infoContainer },
|
|
550
|
+
React.createElement("div", { className: styles.spinner }),
|
|
493
551
|
React.createElement("span", null, "Loading more items..."))),
|
|
494
552
|
mobileFooter));
|
|
495
553
|
}
|
|
@@ -499,35 +557,16 @@ function SkeletonView(props) {
|
|
|
499
557
|
const skeletonRowCount = 5;
|
|
500
558
|
const columnCount = columnDefinitions.length;
|
|
501
559
|
if (isMobile) {
|
|
502
|
-
return (React.createElement("div", null, [...Array(skeletonRowCount)].map((_, i) => (React.createElement("div", { key: i, className: styles
|
|
560
|
+
return (React.createElement("div", null, [...Array(skeletonRowCount)].map((_, i) => (React.createElement("div", { key: i, className: styles.skeletonCard }, [...Array(columnCount)].map((_, j) => (React.createElement("div", { key: j, className: `${styles.skeleton} ${styles.skeletonText}`, style: { marginBottom: '0.5rem' } }))))))));
|
|
503
561
|
}
|
|
504
|
-
return (React.createElement("table", { className: styles
|
|
562
|
+
return (React.createElement("table", { className: styles.responsiveTable },
|
|
505
563
|
React.createElement("thead", null,
|
|
506
564
|
React.createElement("tr", null, [...Array(columnCount)].map((_, i) => (React.createElement("th", { key: i },
|
|
507
|
-
React.createElement("div", { className: `${styles
|
|
565
|
+
React.createElement("div", { className: `${styles.skeleton} ${styles.skeletonText}` })))))),
|
|
508
566
|
React.createElement("tbody", null, [...Array(skeletonRowCount)].map((_, i) => (React.createElement("tr", { key: i }, [...Array(columnCount)].map((_, j) => (React.createElement("td", { key: j },
|
|
509
|
-
React.createElement("div", { className: `${styles
|
|
567
|
+
React.createElement("div", { className: `${styles.skeleton} ${styles.skeletonText}` }))))))))));
|
|
510
568
|
}
|
|
511
569
|
|
|
512
|
-
var css_248z$1 = ".LoadingSpinner-module_spinner__F9V3x{animation:LoadingSpinner-module_spin__VkBDO .8s cubic-bezier(.4,0,.2,1) infinite;border:3px solid rgba(0,0,0,.05);border-left:3px solid var(--primary-color,#007bff);border-radius:50%;display:inline-block;height:28px;vertical-align:middle;width:28px}@keyframes LoadingSpinner-module_spin__VkBDO{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}";
|
|
513
|
-
var styles$1 = {"spinner":"LoadingSpinner-module_spinner__F9V3x"};
|
|
514
|
-
styleInject(css_248z$1);
|
|
515
|
-
|
|
516
|
-
var css_248z = ".NoMoreDataMessage-module_infoContainer__dk1r5{align-items:center;background-color:var(--table-header-bg,#f8f9fa);border-top:1px solid var(--table-border-color,#e0e0e0);color:var(--text-color-muted,#6c757d);display:flex;font-size:.85rem;gap:.75rem;justify-content:center;padding:2rem;width:100%}.NoMoreDataMessage-module_infoContainer__dk1r5.NoMoreDataMessage-module_noMoreData__ATuIg{font-weight:600;letter-spacing:.02em}";
|
|
517
|
-
var styles = {"infoContainer":"NoMoreDataMessage-module_infoContainer__dk1r5","noMoreData":"NoMoreDataMessage-module_noMoreData__ATuIg"};
|
|
518
|
-
styleInject(css_248z);
|
|
519
|
-
|
|
520
|
-
const LoadingSpinner = () => {
|
|
521
|
-
return (React.createElement("div", { className: styles.infoContainer },
|
|
522
|
-
React.createElement("div", { className: styles$1.spinner }),
|
|
523
|
-
React.createElement("span", null, "Loading more items...")));
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
const NoMoreDataMessage = () => {
|
|
527
|
-
return (React.createElement("div", { className: `${styles.infoContainer} ${styles.noMoreData}` },
|
|
528
|
-
React.createElement("p", null, "You've reached the end!")));
|
|
529
|
-
};
|
|
530
|
-
|
|
531
570
|
function debounce(func, delay) {
|
|
532
571
|
let timeout;
|
|
533
572
|
return function (...args) {
|
|
@@ -742,7 +781,7 @@ class SelectionPlugin {
|
|
|
742
781
|
const rowId = this.getRowId(row);
|
|
743
782
|
const isSelected = selectedIds.has(rowId);
|
|
744
783
|
const combinedClassName = [
|
|
745
|
-
isSelected ? styles
|
|
784
|
+
isSelected ? styles.selectedRow : '',
|
|
746
785
|
isSelected ? selectedRowClassName : ''
|
|
747
786
|
].filter(Boolean).join(' ');
|
|
748
787
|
return {
|
|
@@ -887,7 +926,7 @@ class SortPlugin {
|
|
|
887
926
|
}
|
|
888
927
|
|
|
889
928
|
const useTablePlugins = (props) => {
|
|
890
|
-
const { data, plugins, filterProps, selectionProps, sortProps, columnDefinitions, getScrollableElement,
|
|
929
|
+
const { data, plugins, filterProps, selectionProps, sortProps, columnDefinitions, getScrollableElement, onFilterChange, } = props;
|
|
891
930
|
const [processedData, setProcessedData] = useState(data);
|
|
892
931
|
const [activePlugins, setActivePlugins] = useState([]);
|
|
893
932
|
// Persist internal plugins using refs to prevent state loss
|
|
@@ -957,7 +996,6 @@ const useTablePlugins = (props) => {
|
|
|
957
996
|
getData: () => data,
|
|
958
997
|
forceUpdate: forceUpdatePlugins,
|
|
959
998
|
getScrollableElement: getScrollableElement,
|
|
960
|
-
infiniteScrollProps: infiniteScrollProps,
|
|
961
999
|
filterProps: filterProps,
|
|
962
1000
|
selectionProps: selectionProps,
|
|
963
1001
|
columnDefinitions: columnDefinitions,
|
|
@@ -985,7 +1023,6 @@ const useTablePlugins = (props) => {
|
|
|
985
1023
|
sortProps,
|
|
986
1024
|
columnDefinitions,
|
|
987
1025
|
getScrollableElement,
|
|
988
|
-
infiniteScrollProps,
|
|
989
1026
|
getRawColumnDefinition,
|
|
990
1027
|
onFilterChange,
|
|
991
1028
|
]);
|
|
@@ -999,157 +1036,6 @@ const useTablePlugins = (props) => {
|
|
|
999
1036
|
return { processedData, activePlugins, visibleColumns, forceUpdatePlugins };
|
|
1000
1037
|
};
|
|
1001
1038
|
|
|
1002
|
-
function InfiniteTable(props) {
|
|
1003
|
-
const { columnDefinitions, data, noDataComponent, maxHeight, onRowClick, footerRows, mobileBreakpoint, plugins, enablePageLevelStickyHeader, infiniteScrollProps, filterProps, selectionProps, animationProps, sortProps, } = props;
|
|
1004
|
-
const tableContainerRef = useRef(null);
|
|
1005
|
-
const headerRef = useRef(null);
|
|
1006
|
-
const { isMobile, isHeaderSticky, debouncedScrollHandler } = useResponsiveTable({
|
|
1007
|
-
mobileBreakpoint,
|
|
1008
|
-
enablePageLevelStickyHeader,
|
|
1009
|
-
maxHeight,
|
|
1010
|
-
headerRef,
|
|
1011
|
-
scrollableRef: tableContainerRef,
|
|
1012
|
-
});
|
|
1013
|
-
const [internalData, setInternalData] = useState(data || []);
|
|
1014
|
-
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
1015
|
-
const [internalHasMore, setInternalHasMore] = useState(true);
|
|
1016
|
-
const getScrollableElement = useCallback(() => tableContainerRef.current, []);
|
|
1017
|
-
const { processedData, activePlugins, visibleColumns } = useTablePlugins({
|
|
1018
|
-
data: internalData,
|
|
1019
|
-
plugins,
|
|
1020
|
-
filterProps,
|
|
1021
|
-
selectionProps,
|
|
1022
|
-
sortProps,
|
|
1023
|
-
columnDefinitions,
|
|
1024
|
-
getScrollableElement,
|
|
1025
|
-
infiniteScrollProps,
|
|
1026
|
-
});
|
|
1027
|
-
const currentHasMore = (infiniteScrollProps === null || infiniteScrollProps === void 0 ? void 0 : infiniteScrollProps.hasMore) !== undefined
|
|
1028
|
-
? infiniteScrollProps.hasMore
|
|
1029
|
-
: internalHasMore;
|
|
1030
|
-
const hasData = useMemo(() => processedData.length > 0, [processedData]);
|
|
1031
|
-
const noDataComponentNode = noDataComponent || React.createElement("div", { className: styles$2.noData }, "No data");
|
|
1032
|
-
const defaultLoadingComponent = React.createElement(LoadingSpinner, null);
|
|
1033
|
-
const defaultNoMoreDataComponent = React.createElement(NoMoreDataMessage, null);
|
|
1034
|
-
const loadMoreData = useCallback(() => __awaiter(this, void 0, void 0, function* () {
|
|
1035
|
-
var _a;
|
|
1036
|
-
if (!infiniteScrollProps || isLoadingMore)
|
|
1037
|
-
return;
|
|
1038
|
-
setIsLoadingMore(true);
|
|
1039
|
-
try {
|
|
1040
|
-
const newItems = yield ((_a = infiniteScrollProps.onLoadMore) === null || _a === void 0 ? void 0 : _a.call(infiniteScrollProps, internalData));
|
|
1041
|
-
if (infiniteScrollProps.hasMore === undefined) {
|
|
1042
|
-
if (!newItems || newItems.length === 0) {
|
|
1043
|
-
setInternalHasMore(false);
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
if (newItems && newItems.length > 0) {
|
|
1047
|
-
setInternalData(prevData => [...prevData, ...newItems]);
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
catch (error) {
|
|
1051
|
-
console.error("Failed to load more items for infinite scroll:", error);
|
|
1052
|
-
}
|
|
1053
|
-
finally {
|
|
1054
|
-
setIsLoadingMore(false);
|
|
1055
|
-
}
|
|
1056
|
-
}), [infiniteScrollProps, isLoadingMore, internalData]);
|
|
1057
|
-
useEffect(() => {
|
|
1058
|
-
setInternalData(data || []);
|
|
1059
|
-
}, [data]);
|
|
1060
|
-
useEffect(() => {
|
|
1061
|
-
if (data.length === 0) {
|
|
1062
|
-
loadMoreData();
|
|
1063
|
-
}
|
|
1064
|
-
}, [data.length, loadMoreData]);
|
|
1065
|
-
const handleScrollForInfinite = useCallback((currentTarget) => {
|
|
1066
|
-
if (!currentTarget)
|
|
1067
|
-
return;
|
|
1068
|
-
const { scrollHeight, scrollTop, clientHeight } = currentTarget;
|
|
1069
|
-
if (currentHasMore && !isLoadingMore && scrollHeight - scrollTop - clientHeight < 100) {
|
|
1070
|
-
loadMoreData();
|
|
1071
|
-
}
|
|
1072
|
-
}, [currentHasMore, isLoadingMore, loadMoreData]);
|
|
1073
|
-
const mobileFooter = useMemo(() => {
|
|
1074
|
-
if (!footerRows || footerRows.length === 0) {
|
|
1075
|
-
return null;
|
|
1076
|
-
}
|
|
1077
|
-
// Helper to get raw column definition in this context
|
|
1078
|
-
const getRaw = (colDef) => {
|
|
1079
|
-
if (typeof colDef === 'function') {
|
|
1080
|
-
return processedData.length > 0 ? colDef(processedData[0], 0) : { displayLabel: '', cellRenderer: () => '' };
|
|
1081
|
-
}
|
|
1082
|
-
return colDef;
|
|
1083
|
-
};
|
|
1084
|
-
return (React.createElement("div", { className: styles$2.footerCard },
|
|
1085
|
-
React.createElement("div", { className: styles$2['footer-card-body'] }, footerRows.map((row, rowIndex) => {
|
|
1086
|
-
let currentColumnIndex = 0;
|
|
1087
|
-
return (React.createElement("div", { key: rowIndex }, row.columns.map((col, colIndex) => {
|
|
1088
|
-
let label = col.displayLabel;
|
|
1089
|
-
if (!label && col.colSpan === 1) {
|
|
1090
|
-
const header = columnDefinitions[currentColumnIndex];
|
|
1091
|
-
if (header) {
|
|
1092
|
-
label = getRaw(header).displayLabel;
|
|
1093
|
-
}
|
|
1094
|
-
}
|
|
1095
|
-
currentColumnIndex += col.colSpan;
|
|
1096
|
-
return (React.createElement("p", { key: colIndex, className: `${styles$2['footer-card-row']} ${col.className || ''} ${col.onCellClick ? styles$2.clickableFooterCell : ''}`, onClick: col.onCellClick },
|
|
1097
|
-
label && React.createElement("span", { className: styles$2['card-label'] }, label),
|
|
1098
|
-
React.createElement("span", { className: styles$2['card-value'] }, col.cellRenderer())));
|
|
1099
|
-
})));
|
|
1100
|
-
}))));
|
|
1101
|
-
}, [footerRows, columnDefinitions, processedData]);
|
|
1102
|
-
const renderPluginHeaders = useCallback(() => {
|
|
1103
|
-
if (!activePlugins) {
|
|
1104
|
-
return null;
|
|
1105
|
-
}
|
|
1106
|
-
return activePlugins.map((plugin) => {
|
|
1107
|
-
if (plugin.renderHeader) {
|
|
1108
|
-
if (plugin.id === 'sort' && !isMobile) {
|
|
1109
|
-
return null;
|
|
1110
|
-
}
|
|
1111
|
-
return React.createElement("div", { key: plugin.id }, plugin.renderHeader());
|
|
1112
|
-
}
|
|
1113
|
-
return null;
|
|
1114
|
-
});
|
|
1115
|
-
}, [activePlugins, isMobile]);
|
|
1116
|
-
const renderPluginFooters = useCallback(() => {
|
|
1117
|
-
if (!plugins) {
|
|
1118
|
-
return null;
|
|
1119
|
-
}
|
|
1120
|
-
return plugins.map((plugin) => {
|
|
1121
|
-
if (plugin.renderFooter) {
|
|
1122
|
-
return React.createElement("div", { key: plugin.id + '-footer' }, plugin.renderFooter());
|
|
1123
|
-
}
|
|
1124
|
-
return null;
|
|
1125
|
-
});
|
|
1126
|
-
}, [plugins]);
|
|
1127
|
-
const infiniteStatusUI = (React.createElement(React.Fragment, null,
|
|
1128
|
-
isLoadingMore && ((infiniteScrollProps === null || infiniteScrollProps === void 0 ? void 0 : infiniteScrollProps.loadingMoreComponent) || defaultLoadingComponent),
|
|
1129
|
-
!isLoadingMore && !currentHasMore && ((infiniteScrollProps === null || infiniteScrollProps === void 0 ? void 0 : infiniteScrollProps.noMoreDataComponent) || defaultNoMoreDataComponent)));
|
|
1130
|
-
if ((animationProps === null || animationProps === void 0 ? void 0 : animationProps.isLoading) && !hasData) {
|
|
1131
|
-
return React.createElement(SkeletonView, { isMobile: isMobile, columnDefinitions: visibleColumns });
|
|
1132
|
-
}
|
|
1133
|
-
return (React.createElement(TableProvider, { value: {
|
|
1134
|
-
data: internalData,
|
|
1135
|
-
processedData,
|
|
1136
|
-
visibleColumns,
|
|
1137
|
-
originalColumnDefinitions: columnDefinitions,
|
|
1138
|
-
activePlugins,
|
|
1139
|
-
onRowClick,
|
|
1140
|
-
selectionProps,
|
|
1141
|
-
animationProps,
|
|
1142
|
-
} },
|
|
1143
|
-
React.createElement("div", null,
|
|
1144
|
-
React.createElement("div", { style: { display: 'flex', justifyContent: 'flex-end' } }, renderPluginHeaders()),
|
|
1145
|
-
!hasData && noDataComponentNode,
|
|
1146
|
-
hasData && (isMobile ? (React.createElement(MobileView, { mobileFooter: mobileFooter })) : (React.createElement(DesktopView, { maxHeight: maxHeight, isHeaderSticky: isHeaderSticky, tableContainerRef: tableContainerRef, headerRef: headerRef, footerRows: footerRows, renderPluginFooters: renderPluginFooters, onScroll: (e) => {
|
|
1147
|
-
debouncedScrollHandler(e.currentTarget); // For sticky header
|
|
1148
|
-
handleScrollForInfinite(e.currentTarget); // For infinite scroll
|
|
1149
|
-
} }))),
|
|
1150
|
-
hasData && infiniteStatusUI)));
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
1039
|
const useTableDataSource = (props) => {
|
|
1154
1040
|
const { dataSource, pageSize = 20, initialData = [], sort, filter } = props;
|
|
1155
1041
|
const [data, setData] = useState(initialData);
|
|
@@ -1251,7 +1137,7 @@ const useTableDataSource = (props) => {
|
|
|
1251
1137
|
* Supports static data or async data sources with built-in infinite scroll.
|
|
1252
1138
|
*/
|
|
1253
1139
|
function ResponsiveTableInner(props, ref) {
|
|
1254
|
-
const { columnDefinitions, data: initialData, dataSource, pageSize, noDataComponent, maxHeight, onRowClick, footerRows, mobileBreakpoint, plugins, enablePageLevelStickyHeader,
|
|
1140
|
+
const { columnDefinitions, data: initialData, dataSource, pageSize, noDataComponent, maxHeight, onRowClick, footerRows, mobileBreakpoint, plugins, enablePageLevelStickyHeader, filterProps, selectionProps, animationProps, sortProps, mobileCardClassName, onDataSourceStateChange, onPageChange, onDataSourceError, expandRowRenderer, expandChevronClassName, } = props;
|
|
1255
1141
|
const tableContainerRef = useRef(null);
|
|
1256
1142
|
const headerRef = useRef(null);
|
|
1257
1143
|
const { isMobile, isHeaderSticky } = useResponsiveTable({
|
|
@@ -1311,7 +1197,6 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1311
1197
|
sortProps,
|
|
1312
1198
|
columnDefinitions,
|
|
1313
1199
|
getScrollableElement,
|
|
1314
|
-
infiniteScrollProps,
|
|
1315
1200
|
});
|
|
1316
1201
|
// Fire onDataSourceStateChange when dataSource state changes
|
|
1317
1202
|
useEffect(() => {
|
|
@@ -1342,9 +1227,9 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1342
1227
|
const hasData = useMemo(() => processedData.length > 0, [processedData]);
|
|
1343
1228
|
const noDataSvg = (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "#ccc", height: "40", width: "40", viewBox: "0 0 24 24" },
|
|
1344
1229
|
React.createElement("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-14h2v6h-2zm0 8h2v2h-2z" })));
|
|
1345
|
-
const noDataComponentNode = noDataComponent || (React.createElement("div", { className: styles
|
|
1230
|
+
const noDataComponentNode = noDataComponent || (React.createElement("div", { className: styles.noDataWrapper },
|
|
1346
1231
|
noDataSvg,
|
|
1347
|
-
React.createElement("div", { className: styles
|
|
1232
|
+
React.createElement("div", { className: styles.noData }, "No data")));
|
|
1348
1233
|
const mobileFooter = useMemo(() => {
|
|
1349
1234
|
if (!footerRows || footerRows.length === 0) {
|
|
1350
1235
|
return null;
|
|
@@ -1356,8 +1241,8 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1356
1241
|
}
|
|
1357
1242
|
return colDef;
|
|
1358
1243
|
};
|
|
1359
|
-
return (React.createElement("div", { className: styles
|
|
1360
|
-
React.createElement("div", { className: styles
|
|
1244
|
+
return (React.createElement("div", { className: styles.footerCard },
|
|
1245
|
+
React.createElement("div", { className: styles['footer-card-body'] }, footerRows.map((row, rowIndex) => {
|
|
1361
1246
|
let currentColumnIndex = 0;
|
|
1362
1247
|
return (React.createElement("div", { key: rowIndex }, row.columns.map((col, colIndex) => {
|
|
1363
1248
|
let label = col.displayLabel;
|
|
@@ -1368,9 +1253,9 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1368
1253
|
}
|
|
1369
1254
|
}
|
|
1370
1255
|
currentColumnIndex += col.colSpan;
|
|
1371
|
-
return (React.createElement("p", { key: colIndex, className: `${styles
|
|
1372
|
-
label && React.createElement("span", { className: styles
|
|
1373
|
-
React.createElement("span", { className: styles
|
|
1256
|
+
return (React.createElement("p", { key: colIndex, className: `${styles['footer-card-row']} ${col.className || ''} ${col.onCellClick ? styles.clickableFooterCell : ''}`, onClick: col.onCellClick },
|
|
1257
|
+
label && React.createElement("span", { className: styles['card-label'] }, label),
|
|
1258
|
+
React.createElement("span", { className: styles['card-value'] }, col.cellRenderer())));
|
|
1374
1259
|
})));
|
|
1375
1260
|
}))));
|
|
1376
1261
|
}, [footerRows, columnDefinitions, processedData]);
|
|
@@ -1404,9 +1289,6 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1404
1289
|
animateOnLoad: animationProps === null || animationProps === void 0 ? void 0 : animationProps.animateOnLoad,
|
|
1405
1290
|
isLoading,
|
|
1406
1291
|
}), [animationProps === null || animationProps === void 0 ? void 0 : animationProps.animateOnLoad, animationProps === null || animationProps === void 0 ? void 0 : animationProps.isLoading, isLoading]);
|
|
1407
|
-
if (infiniteScrollProps) {
|
|
1408
|
-
return React.createElement(InfiniteTable, Object.assign({}, props));
|
|
1409
|
-
}
|
|
1410
1292
|
if (isLoading && !hasData) {
|
|
1411
1293
|
return React.createElement(SkeletonView, { isMobile: isMobile, columnDefinitions: visibleColumns });
|
|
1412
1294
|
}
|
|
@@ -1467,58 +1349,5 @@ function ResponsiveTableInner(props, ref) {
|
|
|
1467
1349
|
}
|
|
1468
1350
|
const ResponsiveTable = forwardRef(ResponsiveTableInner);
|
|
1469
1351
|
|
|
1470
|
-
|
|
1471
|
-
constructor() {
|
|
1472
|
-
this.id = 'infinite-scroll';
|
|
1473
|
-
this.isLoadingMore = false;
|
|
1474
|
-
this.onPluginInit = (api) => {
|
|
1475
|
-
this.api = api;
|
|
1476
|
-
this.attachScrollListener();
|
|
1477
|
-
};
|
|
1478
|
-
this.attachScrollListener = () => {
|
|
1479
|
-
var _a, _b;
|
|
1480
|
-
const scrollableElement = (_b = (_a = this.api).getScrollableElement) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
1481
|
-
if (scrollableElement) {
|
|
1482
|
-
scrollableElement.addEventListener('scroll', this.handleScroll);
|
|
1483
|
-
}
|
|
1484
|
-
};
|
|
1485
|
-
this.handleScroll = () => __awaiter(this, void 0, void 0, function* () {
|
|
1486
|
-
var _a, _b, _c, _d;
|
|
1487
|
-
const scrollableElement = (_b = (_a = this.api).getScrollableElement) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
1488
|
-
if (!scrollableElement || !this.api.infiniteScrollProps) {
|
|
1489
|
-
return;
|
|
1490
|
-
}
|
|
1491
|
-
const { scrollTop, scrollHeight, clientHeight } = scrollableElement;
|
|
1492
|
-
const scrollThreshold = 200; // Load more data when 200px from the bottom
|
|
1493
|
-
if (scrollHeight - scrollTop - clientHeight < scrollThreshold &&
|
|
1494
|
-
this.api.infiniteScrollProps.hasMore &&
|
|
1495
|
-
!this.isLoadingMore) {
|
|
1496
|
-
this.isLoadingMore = true;
|
|
1497
|
-
this.api.forceUpdate(); // Trigger re-render to show loading component
|
|
1498
|
-
yield ((_d = (_c = this.api.infiniteScrollProps).onLoadMore) === null || _d === void 0 ? void 0 : _d.call(_c, this.api.getData()));
|
|
1499
|
-
this.isLoadingMore = false;
|
|
1500
|
-
this.api.forceUpdate(); // Trigger re-render to hide loading component
|
|
1501
|
-
}
|
|
1502
|
-
});
|
|
1503
|
-
this.processData = (data) => {
|
|
1504
|
-
// This plugin doesn't modify the data directly, but rather triggers loading more.
|
|
1505
|
-
// The main component's data prop should be updated by the consumer of the table.
|
|
1506
|
-
return data;
|
|
1507
|
-
};
|
|
1508
|
-
this.renderFooter = () => {
|
|
1509
|
-
if (!this.api.infiniteScrollProps) {
|
|
1510
|
-
return null;
|
|
1511
|
-
}
|
|
1512
|
-
if (this.isLoadingMore) {
|
|
1513
|
-
return this.api.infiniteScrollProps.loadingMoreComponent || React.createElement("div", null, "Loading more...");
|
|
1514
|
-
}
|
|
1515
|
-
else if (!this.api.infiniteScrollProps.hasMore) {
|
|
1516
|
-
return this.api.infiniteScrollProps.noMoreDataComponent || React.createElement("div", null, "No more data.");
|
|
1517
|
-
}
|
|
1518
|
-
return null;
|
|
1519
|
-
};
|
|
1520
|
-
}
|
|
1521
|
-
}
|
|
1522
|
-
|
|
1523
|
-
export { FilterPlugin, InfiniteScrollPlugin, SelectionPlugin, SortPlugin, ResponsiveTable as default, useTableContext };
|
|
1352
|
+
export { FilterPlugin, SelectionPlugin, SortPlugin, ResponsiveTable as default, useTableContext };
|
|
1524
1353
|
//# sourceMappingURL=index.es.js.map
|