UNPKG

tw-table

Version:

table designed with tailwind and tanstack-table.

843 lines (805 loc) 44.6 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var React__default = _interopDefault(React); var clsx = _interopDefault(require('clsx')); var reactTable = require('@tanstack/react-table'); function styleInject(css, ref) { if ( ref === void 0 ) ref = {}; var insertAt = ref.insertAt; if (!css || typeof document === 'undefined') { return; } var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; if (insertAt === 'top') { if (head.firstChild) { head.insertBefore(style, head.firstChild); } else { head.appendChild(style); } } else { head.appendChild(style); } if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } } var css_248z = "*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.15 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:\"\"}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.bottom-2{bottom:.5rem}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.z-\\[9999\\]{z-index:9999}.col-span-4{grid-column:span 4/span 4}.col-span-8{grid-column:span 8/span 8}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-bottom:.5rem;margin-top:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2\\.5{margin-top:.625rem}.block{display:block}.flex{display:flex}.\\!table{display:table!important}.table{display:table}.grid{display:grid}.hidden{display:none}.h-14{height:3.5rem}.h-2\\.5{height:.625rem}.h-3{height:.75rem}.h-32{height:8rem}.h-\\[40px\\]{height:40px}.h-full{height:100%}.h-px{height:1px}.min-h-screen{min-height:100vh}.w-3{width:.75rem}.w-5\\/6{width:83.333333%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-48{min-width:12rem}.min-w-full{min-width:100%}.max-w-48{max-width:12rem}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity,1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-y{border-top-width:1px}.border-b,.border-y{border-bottom-width:1px}.border-none{border-style:none}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.pl-8{padding-left:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.before\\:float-left:before{content:var(--tw-content);float:left}.before\\:font-bold:before{content:var(--tw-content);font-weight:700}.before\\:content-\\[attr\\(data-label\\)\\]:before{--tw-content:attr(data-label);content:var(--tw-content)}.hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.focus\\:border-sky-500:focus{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity,1))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\:ring-sky-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity,1))}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-gray-200:disabled{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}@media (min-width:640px){.sm\\:static{position:static}.sm\\:mb-0{margin-bottom:0}.sm\\:mr-2{margin-right:.5rem}.sm\\:mt-0{margin-top:0}.sm\\:table-cell{display:table-cell}.sm\\:table-row{display:table-row}.sm\\:hidden{display:none}.sm\\:rounded-lg{border-radius:.5rem}.sm\\:border-none{border-style:none}.sm\\:pl-3\\.5{padding-left:.875rem}.sm\\:text-left{text-align:left}.sm\\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\\:before\\:float-none:before{content:var(--tw-content);float:none}.sm\\:before\\:font-normal:before{content:var(--tw-content);font-weight:400}.sm\\:before\\:content-\\[\\'\\'\\]:before{--tw-content:\"\";content:var(--tw-content)}}.dark\\:divide-gray-600:where(.dark,.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(75 85 99/var(--tw-divide-opacity,1))}.dark\\:border-gray-600:where(.dark,.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\\:bg-gray-600:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\\:bg-gray-700:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\\:bg-gray-800:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\\:bg-gray-900:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\\:text-gray-300:where(.dark,.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\\:hover\\:bg-gray-700:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\\:hover\\:bg-gray-900:hover:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\\:disabled\\:bg-gray-500:disabled:where(.dark,.dark *){--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}"; styleInject(css_248z,{"insertAt":"top"}); var CARD_TABLE_HEAD_CLASSNAMES = 'border-none h-px m-negative-1 overflow-hidden p-0 absolute w-px'; var CARD_TABLE_ROW_CLASSNAMES = 'border block mt-2.5'; var CARD_TABLE_DESCRIPTiON_CLASSNAMES = 'border-b flex justify-between items-center text-right before:content-[attr(data-label)] before:float-left before:font-bold pl-8'; var SCROLL_TABLE_HEAD_CLASSNAMES = 'border-none'; var SCROLL_TABLE_DESCRIPTION_CLASSNAMES = 'border-b'; var CARD_CHECKBOX_CLASSNAMES = 'absolute left-2'; var SCROLL_CHECKBOX_CLASSNAMES = 'mr-2'; var TABLE_HEAD_CLASSNAMES = { card: CARD_TABLE_HEAD_CLASSNAMES, scroll: SCROLL_TABLE_HEAD_CLASSNAMES }; var TABLE_ROW_CLASSNAMES = { card: CARD_TABLE_ROW_CLASSNAMES, scroll: '' }; var TABLE_DESCRIPTION_CLASSNAMES = { card: CARD_TABLE_DESCRIPTiON_CLASSNAMES, scroll: SCROLL_TABLE_DESCRIPTION_CLASSNAMES }; var TABLE_ROW_CHECKBOX_CLASSNAMES = { card: CARD_CHECKBOX_CLASSNAMES, scroll: SCROLL_CHECKBOX_CLASSNAMES }; var RESPONSIVE_TABLE_HEAD_CLASSNAMES = { card: CARD_TABLE_HEAD_CLASSNAMES + ' sm:static', scroll: '' }; var RESPONSIVE_TABLE_ROW_CLASSNAMES = { card: CARD_TABLE_ROW_CLASSNAMES + ' sm:border-none sm:table-row sm:mt-0', scroll: '' }; var RESPONSIVE_TABLE_DESCRIPTION_CLASSNAMES = { card: CARD_TABLE_DESCRIPTiON_CLASSNAMES + " sm:table-cell sm:text-left sm:before:content-[''] sm:before:float-none sm:before:font-normal sm:pl-3.5", scroll: '' }; var RESPONSIVE_TABLE_ROW_CHECKBOX_CLASSNAMES = { card: CARD_CHECKBOX_CLASSNAMES + ' sm:static sm:mr-2', scroll: '' }; var TableRow = function TableRow(_ref) { var row = _ref.row, responsivenessType = _ref.responsivenessType, viewType = _ref.viewType; return React__default.createElement("tr", { className: clsx('border-gray-200 dark:border-gray-600', row.getCanSelect() && row.getIsSelected() && 'bg-gray-100 dark:bg-gray-600', responsivenessType && !viewType && RESPONSIVE_TABLE_ROW_CLASSNAMES[responsivenessType], viewType && TABLE_ROW_CLASSNAMES[viewType]) }, row.getVisibleCells().map(function (cell, idx) { return React__default.createElement("td", { key: cell.id, "data-label": cell.column.columnDef.header, className: clsx('px-3.5 py-2 min-w-48 text-wrap border-gray-300 dark:border-gray-600', responsivenessType && !viewType && RESPONSIVE_TABLE_DESCRIPTION_CLASSNAMES[responsivenessType], viewType && TABLE_DESCRIPTION_CLASSNAMES[viewType]) }, idx === 0 && row.getCanSelect() && React__default.createElement("input", { type: "checkbox", className: clsx(responsivenessType && !viewType && RESPONSIVE_TABLE_ROW_CHECKBOX_CLASSNAMES[responsivenessType], viewType && TABLE_ROW_CHECKBOX_CLASSNAMES[viewType]), checked: row.getIsSelected(), onChange: row.getToggleSelectedHandler() }), reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())); })); }; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; } var _excluded = ["id", "type", "placeholder", "defaultValue", "required", "onChange", "isLoading", "onKeyDown", "autoFocus"]; var Input = /*#__PURE__*/React.forwardRef(function (_ref, refProp) { var id = _ref.id, type = _ref.type, placeholder = _ref.placeholder, _ref$defaultValue = _ref.defaultValue, defaultValue = _ref$defaultValue === void 0 ? '' : _ref$defaultValue, _ref$required = _ref.required, required = _ref$required === void 0 ? false : _ref$required, _onChange = _ref.onChange, _ref$isLoading = _ref.isLoading, isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading, _onKeyDown = _ref.onKeyDown, _ref$autoFocus = _ref.autoFocus, autoFocus = _ref$autoFocus === void 0 ? false : _ref$autoFocus, rest = _objectWithoutPropertiesLoose(_ref, _excluded); var localRef = React.useRef(null); var ref = refProp || localRef; var _useState = React.useState(defaultValue), inputValue = _useState[0], setInputValue = _useState[1]; React.useEffect(function () { setInputValue(defaultValue); }, [defaultValue]); if (isLoading) { return React__default.createElement("input", { className: "block w-full px-3 py-2 border-2 border-gray-300 rounded-md skeleton", disabled: true }); } return React__default.createElement("input", Object.assign({ id: id, name: id, type: type, placeholder: placeholder, autoComplete: id, value: inputValue, required: required, onChange: function onChange(e) { setInputValue(e.target.value); _onChange && _onChange(e); }, onKeyDown: function onKeyDown(e) { _onKeyDown && _onKeyDown(e); }, ref: ref, autoFocus: autoFocus }, rest, { className: "bg-gray-100 dark:bg-gray-700 block w-full px-3 py-2 placeholder-gray-400 rounded-md shadow-sm focus:outline-none focus:ring-sky-500 focus:border-sky-500 sm:text-sm" })); }); function TableFilter(_ref) { var _column$columnDef$met, _columnFilterValue$to; var column = _ref.column; var columnFilterValue = column.getFilterValue(); var _ref2 = (_column$columnDef$met = column.columnDef.meta) != null ? _column$columnDef$met : {}, filterVariant = _ref2.filterVariant; console.log('columnFilterValue', columnFilterValue); return filterVariant === 'range' ? React__default.createElement("div", null, React__default.createElement("p", null, "not implemented")) : filterVariant === 'select' ? React__default.createElement("select", { onChange: function onChange(e) { return column.setFilterValue(e.target.value); }, value: columnFilterValue == null ? void 0 : columnFilterValue.toString() }, React__default.createElement("option", { value: "" }, "not implemented")) : React__default.createElement(Input, { onChange: function onChange(e) { column.setFilterValue(e.target.value); }, placeholder: column.columnDef.header + "...", type: "text", value: (_columnFilterValue$to = columnFilterValue == null ? void 0 : columnFilterValue.toString()) != null ? _columnFilterValue$to : '', autoFocus: true }); } var ChevronLeft = function ChevronLeft(_ref) { var className = _ref.className; return React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: className }, React__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 19.5 8.25 12l7.5-7.5" })); }; var ChevronRight = function ChevronRight(_ref) { var className = _ref.className; return React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: className }, React__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m8.25 4.5 7.5 7.5-7.5 7.5" })); }; var ChevronUp = function ChevronUp(_ref) { var className = _ref.className; return React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: className }, React__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m4.5 15.75 7.5-7.5 7.5 7.5" })); }; var ChevronDown = function ChevronDown(_ref) { var className = _ref.className; return React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: className }, React__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m19.5 8.25-7.5 7.5-7.5-7.5" })); }; var MagnifyingGlass = function MagnifyingGlass(_ref) { var className = _ref.className; return React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: className }, React__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" })); }; var Dash = function Dash(_ref) { var className = _ref.className; return React__default.createElement("svg", { className: className, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", fill: "currentColor", strokeWidth: 1.5, stroke: "currentColor" }, React__default.createElement("path", { d: "M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z" })); }; var _excluded$1 = ["name"]; var Icon = function Icon(props) { var name = props.name, svgProps = _objectWithoutPropertiesLoose(props, _excluded$1); var icons = { 'chevron-left': React__default.createElement(ChevronLeft, Object.assign({}, svgProps)), 'chevron-right': React__default.createElement(ChevronRight, Object.assign({}, svgProps)), 'chevron-up': React__default.createElement(ChevronUp, Object.assign({}, svgProps)), 'chevron-down': React__default.createElement(ChevronDown, Object.assign({}, svgProps)), 'magnifying-glass': React__default.createElement(MagnifyingGlass, Object.assign({}, svgProps)), 'dash': React__default.createElement(Dash, Object.assign({}, svgProps)) }; return icons[name]; }; var TableHead = function TableHead(_ref) { var headerGroup = _ref.headerGroup, enableMultiRowSelection = _ref.enableMultiRowSelection, isAllRowsSelected = _ref.isAllRowsSelected, toggleAllRowsSelectedHandler = _ref.toggleAllRowsSelectedHandler; var _useState = React.useState(null), targetSearchCol = _useState[0], setTargetSearchCol = _useState[1]; return React__default.createElement(React__default.Fragment, null, React__default.createElement("tr", { key: headerGroup.id, className: clsx('w-full') }, headerGroup.headers.map(function (header, idx) { var _header$column$column; return React__default.createElement("th", { key: header.id, className: "px-3.5 py-2 text-left min-w-48 max-w-48 h-14 dark:bg-gray-800 dark:text-gray-300", onBlur: function onBlur() { if (header.column.getFilterValue()) return; setTargetSearchCol(null); }, scope: "col", title: (_header$column$column = header.column.columnDef.header) == null ? void 0 : _header$column$column.toString() }, targetSearchCol !== header.id && React__default.createElement("div", { className: "flex justify-between items-center" }, idx === 0 && enableMultiRowSelection && toggleAllRowsSelectedHandler && React__default.createElement("div", { className: "flex items-center mr-2" }, React__default.createElement("input", { type: "checkbox", className: "mr-2", checked: isAllRowsSelected || false, onChange: toggleAllRowsSelectedHandler })), React__default.createElement("div", { className: "truncate mr-2" }, reactTable.flexRender(header.column.columnDef.header, header.getContext())), React__default.createElement("div", { className: "flex space-x-2" }, header.column.getCanFilter() && React__default.createElement("button", { className: "p-2 rounded-full shadow-md hover:bg-gray-100 dark:hover:bg-gray-900", onClick: function onClick() { return header.column.getCanFilter() && setTargetSearchCol(header.id); } }, React__default.createElement(Icon, { name: "magnifying-glass", className: "h-3 w-3" })), header.column.getCanSort() && React__default.createElement("div", { className: "flex flex-col" }, React__default.createElement("button", { className: "p-2 rounded-full shadow-md hover:bg-gray-100 dark:hover:bg-gray-900", onClick: function onClick() { return header.column.toggleSorting(); } }, header.column.getIsSorted() === false ? React__default.createElement(Icon, { name: "dash", className: "h-3 w-3" }) : header.column.getIsSorted() === 'desc' ? React__default.createElement(Icon, { name: "chevron-down", className: "h-3 w-3" }) : React__default.createElement(Icon, { name: "chevron-up", className: "h-3 w-3" }))))), targetSearchCol === header.id && header.column.getCanFilter() && React__default.createElement(TableFilter, { column: header.column })); }))); }; var className = "px-3 py-1 border border-transparent rounded-full bg-gray-50 dark:bg-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:bg-gray-200 dark:disabled:bg-gray-500 disabled:cursor-not-allowed"; var PageControls = function PageControls(_ref) { var table = _ref.table; return React__default.createElement(React__default.Fragment, null, React__default.createElement("button", { className: "flex " + className, onClick: function onClick() { return table.firstPage(); }, disabled: !table.getCanPreviousPage() }, React__default.createElement(Icon, { name: "chevron-left", className: "h-3 w-3" }), React__default.createElement(Icon, { name: "chevron-left", className: "h-3 w-3" })), React__default.createElement("button", { className: "" + className, onClick: function onClick() { return table.previousPage(); }, disabled: !table.getCanPreviousPage() }, React__default.createElement(Icon, { name: "chevron-left", className: "h-3 w-3" })), React__default.createElement("button", { className: "" + className, onClick: function onClick() { return table.nextPage(); }, disabled: !table.getCanNextPage() }, React__default.createElement(Icon, { name: "chevron-right", className: "h-3 w-3" })), React__default.createElement("button", { className: "flex " + className, onClick: function onClick() { return table.lastPage(); }, disabled: !table.getCanNextPage() }, React__default.createElement(Icon, { name: "chevron-right", className: "h-3 w-3" }), React__default.createElement(Icon, { name: "chevron-right", className: "h-3 w-3" }))); }; var uiTexts = { empty: "Empty", sort: { by: "Sort by", dir: "Sort direction", desc: "Desc", asc: "Asc" }, search: { label: "Search", placeholder: "Search..." }, pagination: { previous: "Previous", next: "Next", page: "Page", of: "of", show: "Show", showing: "Showing", rows: "rows" } }; var LabelsContext = /*#__PURE__*/React.createContext({ texts: uiTexts }); var useLabels = function useLabels() { return React.useContext(LabelsContext); }; var LabelsProvider = function LabelsProvider(_ref) { var children = _ref.children, texts = _ref.texts; return React__default.createElement(LabelsContext.Provider, { value: { texts: texts } }, children); }; var PageSizeControls = function PageSizeControls(_ref) { var table = _ref.table; var _useLabels = useLabels(), texts = _useLabels.texts; return React__default.createElement("div", { className: "space-x-2" }, React__default.createElement("span", null, texts.pagination.show), React__default.createElement("select", { value: table.getState().pagination.pageSize, onChange: function onChange(e) { table.setPageSize(Number(e.target.value)); }, className: "bg-white dark:bg-gray-700 rounded px-2 py-1 text-sm outline-none" }, [10, 20, 30, 40, 50].map(function (pageSize) { return React__default.createElement("option", { key: pageSize, value: pageSize }, pageSize); }))); }; var Info = function Info(_ref) { var table = _ref.table; var _useLabels = useLabels(), texts = _useLabels.texts; return React__default.createElement("div", { className: "flex justify-between" }, React__default.createElement("div", { className: "text-sm" }, texts.pagination.showing, " ", table.getRowModel().rows.length.toLocaleString(), " ", texts.pagination.of, ' ', table.getRowCount().toLocaleString(), " ", texts.pagination.rows), React__default.createElement("div", null, React__default.createElement("span", { className: "flex items-center gap-1 text-sm" }, React__default.createElement("div", null, texts.pagination.page), React__default.createElement("strong", null, table.getState().pagination.pageIndex + 1, " ", texts.pagination.of, ' ', table.getPageCount().toLocaleString())))); }; var Pagination = function Pagination(_ref) { var table = _ref.table; return React__default.createElement("div", { className: "py-2" }, React__default.createElement("div", { className: "flex items-center justify-between gap-4 mb-4" }, React__default.createElement("div", { className: "flex items-center gap-2" }, React__default.createElement(PageControls, { table: table })), React__default.createElement(PageSizeControls, { table: table })), React__default.createElement(Info, { table: table })); }; var _excluded$2 = ["label", "id", "options"]; var Select = function Select(_ref) { var label = _ref.label, id = _ref.id, options = _ref.options, rest = _objectWithoutPropertiesLoose(_ref, _excluded$2); return React__default.createElement("div", null, label && React__default.createElement("label", { htmlFor: id, className: "block text-sm font-medium truncate" }, label), React__default.createElement("select", Object.assign({ id: id, name: id, autoComplete: id, className: "bg-gray-100 dark:bg-gray-700 w-full focus:ring-sky-500 focus:border-sky-500 h-full px-2 py-2 sm:text-sm rounded-md outline-none appearance-none" }, rest), options.map(function (option) { return React__default.createElement("option", { key: option.value, value: option.value }, option.label); }))); }; var _excluded$3 = ["id", "label", "options", "placeholder", "onChange"]; function InputWithSelect(_ref) { var id = _ref.id, label = _ref.label, options = _ref.options, placeholder = _ref.placeholder, onChange = _ref.onChange, rest = _objectWithoutPropertiesLoose(_ref, _excluded$3); var _useState = React.useState(null), selectedId = _useState[0], setSelectedId = _useState[1]; var _useState2 = React.useState(''), inputValue = _useState2[0], setInputValue = _useState2[1]; var isOptionsEmpty = options.length === 0; React.useEffect(function () { if (!selectedId) return; onChange(selectedId, inputValue); }, [inputValue, selectedId, setSelectedId]); React.useEffect(function () { if (isOptionsEmpty || selectedId) return; setSelectedId(options[0].value); }, [options]); return React__default.createElement("div", null, React__default.createElement("label", { htmlFor: id, className: "block text-sm font-medium" }, label), React__default.createElement("div", { className: "mt-1 relative rounded-md shadow-sm grid grid-cols-12 gap-2" }, React__default.createElement("div", { className: "col-span-4" }, React__default.createElement(Select, { id: id, options: options, onChange: function onChange(e) { setSelectedId(e.target.value); } })), React__default.createElement("div", { className: "col-span-8" }, React__default.createElement(Input, Object.assign({ type: "text", name: id, id: id, placeholder: placeholder, onChange: function onChange(e) { return setInputValue(e.target.value); } }, rest))))); } function isObject(item) { return item !== null && typeof item === 'object'; } function deepMerge(target, source) { var result = _extends({}, target); for (var key in source) { if (isObject(source[key]) && isObject(target[key])) { // Recursively merge if both target and source have the same key and it's an object result[key] = deepMerge(target[key], source[key]); } else { // Otherwise, directly copy the source property result[key] = source[key]; } } return result; } function isNumeric(val) { return !isNaN(parseFloat(val)) && isFinite(parseFloat(val)); } /** * Renders a mobile version of the table filter. * * @param props - The component props. * @returns The rendered mobile table filter. */ var TableToolbarMobile = function TableToolbarMobile(_ref) { var table = _ref.table, _ref$forceHidden = _ref.forceHidden, forceHidden = _ref$forceHidden === void 0 ? false : _ref$forceHidden, _ref$forceShow = _ref.forceShow, forceShow = _ref$forceShow === void 0 ? false : _ref$forceShow; var _useLabels = useLabels(), texts = _useLabels.texts; var headerGroups = table.getHeaderGroups().map(function (headerGroup) { return headerGroup; }); var headers = headerGroups.flatMap(function (headerGroup) { return headerGroup.headers; }); var searchableColumns = headers.filter(function (header) { return header.column.getCanFilter(); }); var sortableColumns = headers.filter(function (header) { return header.column.getCanSort(); }); var responsivenessClassname = forceShow ? 'block' : forceHidden ? 'hidden' : 'sm:hidden'; return React__default.createElement("div", { className: "w-full block " + responsivenessClassname + " space-y-2 my-2" }, React__default.createElement("div", { className: "w-full" }, React__default.createElement(InputWithSelect, { id: 'search', label: texts.search.label, placeholder: texts.search.placeholder, options: searchableColumns.map(function (header) { return { value: header.id, label: header.column.columnDef.header }; }), onChange: function onChange(selectedId, inputValue) { var header = searchableColumns.find(function (header) { return header.id === selectedId; }); if (header) { // since we don't support multi-column filtering yet, we clear the previous filters. table.setColumnFilters([]); var _inputValue = isNumeric(inputValue) ? Number(inputValue) : inputValue; header.column.setFilterValue(_inputValue); } } })), React__default.createElement("div", { className: "w-full grid grid-cols-12 gap-2" }, React__default.createElement("div", { className: "col-span-4" }, React__default.createElement(Select, { id: "sort_direction", label: texts.sort.dir, options: [{ value: 'asc', label: texts.sort.asc }, { value: 'desc', label: texts.sort.desc }], onChange: function onChange(e) { table.setSorting(function (old) { var newSorting = old.map(function (sort) { return { id: sort.id ? sort.id : sortableColumns[0].id, desc: e.target.value === 'desc' }; }); return newSorting; }); } })), React__default.createElement("div", { className: "col-span-8" }, React__default.createElement(Select, { id: "sort", label: texts.sort.by, options: [{ value: 'None', label: 'None' }].concat(sortableColumns.map(function (header) { return { value: header.id, label: header.column.columnDef.header }; })), onChange: function onChange(e) { table.setSorting(function (updater) { return [{ id: e.target.value, desc: updater.length ? updater[0].desc : false }]; }); } })))); }; var TableRowSkeleton = function TableRowSkeleton(props) { return React__default.createElement("tr", { className: "flex flex-col w-full mb-5 flex-no wrap sm:table-row sm:mb-0" }, Array.from(Array(props.colsLength).keys()).map(function (_, idx) { return React__default.createElement("td", { key: idx, className: "h-[40px] px-1 py-2 whitespace-nowrap text-sm text-gray-900 border-y border-slate-200 text-center" }, React__default.createElement("p", { className: 'h-2.5 bg-gray-200 rounded-full w-5/6 animate-pulse' })); })); }; function numericFilterFn(row, columnId, filterValue) { var rowValue = row.getValue(columnId); if (filterValue == null || filterValue === '') return true; // No filter applied return String(rowValue).includes(filterValue); // Number(rowValue) === Number(filterValue); // Adjust logic as needed } var TwTable = function TwTable(_ref) { var columns = _ref.columns, data = _ref.data, _ref$responsivenessTy = _ref.responsivenessType, responsivenessType = _ref$responsivenessTy === void 0 ? 'card' : _ref$responsivenessTy, _ref$serverSide = _ref.serverSide, serverSide = _ref$serverSide === void 0 ? false : _ref$serverSide, pagination = _ref.pagination, setPagination = _ref.setPagination, _ref$rowCount = _ref.rowCount, rowCount = _ref$rowCount === void 0 ? 0 : _ref$rowCount, columnFilters = _ref.columnFilters, setColumnFilters = _ref.setColumnFilters, rowSelection = _ref.rowSelection, setRowSelection = _ref.setRowSelection, enableMultiRowSelection = _ref.enableMultiRowSelection, sorting = _ref.sorting, setSorting = _ref.setSorting, _ref$texts = _ref.texts, texts = _ref$texts === void 0 ? uiTexts : _ref$texts, _ref$isLoading = _ref.isLoading, isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading, viewType = _ref.viewType, columnVisibility = _ref.columnVisibility; // states prefixed with undescore are used for client-side features. var _React$useState = React__default.useState([]), _columnFilters = _React$useState[0], _setColumnFilters = _React$useState[1]; var _React$useState2 = React__default.useState([]), _sorting = _React$useState2[0], _setSorting = _React$useState2[1]; var _React$useState3 = React__default.useState({ pageIndex: 0, pageSize: 10 }), _pagination = _React$useState3[0], _setPagination = _React$useState3[1]; var _texts = deepMerge(uiTexts, texts); var table = reactTable.useReactTable({ columns: columns, data: data, filterFns: {}, onColumnFiltersChange: !serverSide ? _setColumnFilters : setColumnFilters || _setColumnFilters, getCoreRowModel: reactTable.getCoreRowModel(), getFilteredRowModel: !serverSide ? reactTable.getFilteredRowModel() : undefined, getSortedRowModel: !serverSide ? reactTable.getSortedRowModel() : undefined, getPaginationRowModel: !serverSide ? reactTable.getPaginationRowModel() : undefined, onSortingChange: !serverSide ? _setSorting : setSorting || _setSorting, onPaginationChange: !serverSide ? _setPagination : setPagination || _setPagination, onRowSelectionChange: setRowSelection, state: { sorting: !serverSide ? _sorting : sorting || _sorting, pagination: !serverSide ? _pagination : pagination || _pagination, columnFilters: !serverSide ? _columnFilters : columnFilters || _columnFilters, rowSelection: rowSelection, columnVisibility: columnVisibility }, rowCount: !serverSide ? undefined : rowCount, enableSortingRemoval: false, manualPagination: serverSide, enableRowSelection: rowSelection ? true : false, enableMultiRowSelection: enableMultiRowSelection, defaultColumn: { filterFn: function filterFn(row, columnId, filterValue) { var rowValue = row.getValue(columnId); // Check if the value is numeric if (typeof rowValue === 'number') { return numericFilterFn(row, columnId, filterValue); } // Fallback to default behavior (string filtering) return String(rowValue).toLowerCase().includes(String(filterValue).toLowerCase()); } } }); return React__default.createElement(LabelsProvider, { texts: _texts }, React__default.createElement("div", { className: "flex flex-col flex-end bg-white dark:bg-gray-900 text-black dark:text-gray-300" }, React__default.createElement("div", { className: "overflow-x-auto" }, React__default.createElement("div", { className: "shadow overflow-x-auto sm:rounded-lg" }, React__default.createElement(TableToolbarMobile, { table: table, forceHidden: viewType && viewType === 'scroll' || false, forceShow: viewType && viewType === 'card' || false }), React__default.createElement("table", { className: "min-w-full divide-y divide-gray-200 dark:divide-gray-600 relative" }, React__default.createElement("thead", { className: clsx('bg-gray-50 border', responsivenessType && !viewType && RESPONSIVE_TABLE_HEAD_CLASSNAMES[responsivenessType], viewType && TABLE_HEAD_CLASSNAMES[viewType]) }, table.getHeaderGroups().map(function (headerGroup) { return React__default.createElement(TableHead, { key: headerGroup.id, headerGroup: headerGroup, enableMultiRowSelection: enableMultiRowSelection, isAllRowsSelected: rowSelection && table.getIsAllRowsSelected(), toggleAllRowsSelectedHandler: rowSelection && table.getToggleAllRowsSelectedHandler() }); })), React__default.createElement("tbody", null, isLoading ? React__default.createElement(React__default.Fragment, null, Array.from(Array((pagination == null ? void 0 : pagination.pageSize) || _pagination.pageSize).keys()).map(function (_, idx) { return React__default.createElement(TableRowSkeleton, { colsLength: columns.length, key: idx }); })) : table.getRowModel().rows.length === 0 ? React__default.createElement("tr", { className: "text-center h-32" }, React__default.createElement("td", { colSpan: 12 }, _texts.empty)) : table.getRowModel().rows.map(function (row) { return React__default.createElement(TableRow, { key: row.id, row: row, viewType: viewType, responsivenessType: responsivenessType }); }))))), React__default.createElement(Pagination, { table: table }))); }; exports.TwTable = TwTable; //# sourceMappingURL=tw-table.cjs.development.js.map