UNPKG

201 kBSource Map (JSON)View Raw
1{"version":3,"file":"gridjs.js","sources":["../node_modules/preact/dist/preact.mjs","../src/util/id.ts","../src/base.ts","../src/i18n/en_US.ts","../src/i18n/language.ts","../src/view/base.tsx","../src/util/getConfig.ts","../src/view/htmlElement.tsx","../src/util/html.ts","../src/cell.ts","../src/pipeline/processor.ts","../src/row.ts","../src/tabular.ts","../src/util/array.ts","../src/util/eventEmitter.ts","../src/pipeline/filter/globalSearch.ts","../src/operator/search.ts","../src/util/className.ts","../src/view/base/store.ts","../src/plugin.ts","../src/view/plugin/search/store.ts","../src/view/base/actions.ts","../src/view/plugin/search/actions.ts","../src/pipeline/filter/serverGlobalSearch.ts","../src/util/log.ts","../src/view/plugin/search/search.tsx","../src/util/debounce.ts","../src/pipeline/limit/pagination.ts","../src/pipeline/limit/serverPagination.ts","../src/view/plugin/pagination.tsx","../src/util/width.ts","../src/view/table/shadow.tsx","../src/util/string.ts","../src/header.ts","../src/util/dispatcher.ts","../src/storage/storage.ts","../src/storage/memory.ts","../src/storage/server.ts","../src/storage/storageUtils.ts","../src/pipeline/pipeline.ts","../src/types.ts","../src/pipeline/extractor/storage.ts","../src/pipeline/transformer/arrayToTabular.ts","../src/pipeline/initiator/server.ts","../src/pipeline/transformer/storageResponseToArray.ts","../src/pipeline/pipelineUtils.ts","../src/config.ts","../node_modules/preact/hooks/dist/hooks.mjs","../src/view/table/td.tsx","../src/view/table/tr.tsx","../src/view/table/messageRow.tsx","../src/view/table/tbody.tsx","../src/pipeline/sort/native.ts","../src/view/plugin/sort/store.ts","../src/view/plugin/sort/actions.ts","../src/pipeline/sort/server.ts","../src/view/plugin/sort/sort.tsx","../src/view/plugin/resize/resize.tsx","../src/util/throttle.ts","../src/view/table/th.tsx","../src/view/table/thead.tsx","../src/util/table.ts","../src/view/table/table.tsx","../src/view/headerContainer.tsx","../src/view/footerContainer.tsx","../src/view/container.tsx","../src/grid.ts"],"sourcesContent":["var n,l,u,i,t,o,r={},f=[],e=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function c(n,l){for(var u in l)n[u]=l[u];return n}function s(n){var l=n.parentNode;l&&l.removeChild(n)}function a(n,l,u){var i,t,o,r=arguments,f={};for(o in l)\"key\"==o?i=l[o]:\"ref\"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o<arguments.length;o++)u.push(r[o]);if(null!=u&&(f.children=u),\"function\"==typeof n&&null!=n.defaultProps)for(o in n.defaultProps)void 0===f[o]&&(f[o]=n.defaultProps[o]);return v(n,f,i,t,null)}function v(l,u,i,t,o){var r={type:l,props:u,key:i,ref:t,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++n.__v:o};return null!=n.vnode&&n.vnode(r),r}function h(){return{current:null}}function y(n){return n.children}function p(n,l){this.props=n,this.context=l}function d(n,l){if(null==l)return n.__?d(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?d(n):null}function _(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return _(n)}}function k(l){(!l.__d&&(l.__d=!0)&&u.push(l)&&!b.__r++||t!==n.debounceRendering)&&((t=n.debounceRendering)||i)(b)}function b(){for(var n;b.__r=u.length;)n=u.sort(function(n,l){return n.__v.__b-l.__v.__b}),u=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=c({},t)).__v=t.__v+1,I(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?d(t):o,t.__h),T(u,t),t.__e!=o&&_(t)))})}function m(n,l,u,i,t,o,e,c,s,a){var h,p,_,k,b,m,w,A=i&&i.__k||f,P=A.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v(null,k,null,null,k):Array.isArray(k)?v(y,{children:k},null,null,null):k.__b>0?v(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(_=A[h])||_&&k.key==_.key&&k.type===_.type)A[h]=void 0;else for(p=0;p<P;p++){if((_=A[p])&&k.key==_.key&&k.type===_.type){A[p]=void 0;break}_=null}I(n,k,_=_||r,t,o,e,c,s,a),b=k.__e,(p=k.ref)&&_.ref!=p&&(w||(w=[]),_.ref&&w.push(_.ref,null,k),w.push(p,k.__c||b,k)),null!=b?(null==m&&(m=b),\"function\"==typeof k.type&&null!=k.__k&&k.__k===_.__k?k.__d=s=g(k,s,n):s=x(n,k,_,A,b,s),a||\"option\"!==u.type?\"function\"==typeof u.type&&(u.__d=s):n.value=\"\"):s&&_.__e==s&&s.parentNode!=n&&(s=d(_))}for(u.__e=m,h=P;h--;)null!=A[h]&&(\"function\"==typeof u.type&&null!=A[h].__e&&A[h].__e==u.__d&&(u.__d=d(i,h+1)),L(A[h],A[h]));if(w)for(h=0;h<w.length;h++)z(w[h],w[++h],w[++h])}function g(n,l,u){var i,t;for(i=0;i<n.__k.length;i++)(t=n.__k[i])&&(t.__=n,l=\"function\"==typeof t.type?g(t,l,u):x(u,t,t,n.__k,t.__e,l));return l}function w(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){w(n,l)}):l.push(n)),l}function x(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function A(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||C(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||C(n,o,l[o],u[o],i)}function P(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||e.test(l)?u:u+\"px\"}function C(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||P(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||P(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?H:$,o):n.removeEventListener(l,o?H:$,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink[H:h]/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function $(l){this.l[l.type+!1](n.event?n.event(l):l)}function H(l){this.l[l.type+!0](n.event?n.event(l):l)}function I(l,u,i,t,o,r,f,e,s){var a,v,h,d,_,k,b,g,w,x,A,P=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(s=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=n.__b)&&a(u);try{n:if(\"function\"==typeof P){if(g=u.props,w=(a=P.contextType)&&t[a.__c],x=a?w?w.props.value:a.__:t,i.__c?b=(v=u.__c=i.__c).__=v.__E:(\"prototype\"in P&&P.prototype.render?u.__c=v=new P(g,x):(u.__c=v=new p(g,x),v.constructor=P,v.render=M),w&&w.sub(v),v.props=g,v.state||(v.state={}),v.context=x,v.__n=t,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=P.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=c({},v.__s)),c(v.__s,P.getDerivedStateFromProps(g,v.__s))),d=v.props,_=v.state,h)null==P.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else{if(null==P.getDerivedStateFromProps&&g!==d&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(g,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(g,v.__s,x)||u.__v===i.__v){v.props=g,v.state=v.__s,u.__v!==i.__v&&(v.__d=!1),v.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),v.__h.length&&f.push(v);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(g,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(d,_,k)})}v.context=x,v.props=g,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(t=c(c({},t),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(k=v.getSnapshotBeforeUpdate(d,_)),A=null!=a&&a.type===y&&null==a.key?a.props.children:a,m(l,Array.isArray(A)?A:[A],u,i,t,o,r,f,e,s),v.base=u.__e,u.__h=null,v.__h.length&&f.push(v),b&&(v.__E=v.__=null),v.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=j(i.__e,u,i,t,o,r,f,s);(a=n.diffed)&&a(u)}catch(l){u.__v=null,(s||null!=r)&&(u.__e=e,u.__h=!!s,r[r.indexOf(e)]=null),n.__e(l,u,i)}}function T(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u)})}catch(l){n.__e(l,u.__v)}})}function j(n,l,u,i,t,o,e,c){var a,v,h,y,p=u.props,d=l.props,_=l.type,k=0;if(\"svg\"===_&&(t=!0),null!=o)for(;k<o.length;k++)if((a=o[k])&&(a===n||(_?a.localName==_:3==a.nodeType))){n=a,o[k]=null;break}if(null==n){if(null===_)return document.createTextNode(d);n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",_):document.createElement(_,d.is&&d),o=null,c=!1}if(null===_)p===d||c&&n.data===d||(n.data=d);else{if(o=o&&f.slice.call(n.childNodes),v=(p=u.props||r).dangerouslySetInnerHTML,h=d.dangerouslySetInnerHTML,!c){if(null!=o)for(p={},y=0;y<n.attributes.length;y++)p[n.attributes[y].name]=n.attributes[y].value;(h||v)&&(h&&(v&&h.__html==v.__html||h.__html===n.innerHTML)||(n.innerHTML=h&&h.__html||\"\"))}if(A(n,d,p,t,c),h)l.__k=[];else if(k=l.props.children,m(n,Array.isArray(k)?k:[k],l,u,i,t&&\"foreignObject\"!==_,o,e,n.firstChild,c),null!=o)for(k=o.length;k--;)null!=o[k]&&s(o[k]);c||(\"value\"in d&&void 0!==(k=d.value)&&(k!==n.value||\"progress\"===_&&!k)&&C(n,\"value\",k,p.value,!1),\"checked\"in d&&void 0!==(k=d.checked)&&k!==n.checked&&C(n,\"checked\",k,p.checked,!1))}return n}function z(l,u,i){try{\"function\"==typeof l?l(u):l.current=u}catch(l){n.__e(l,i)}}function L(l,u,i){var t,o,r;if(n.unmount&&n.unmount(l),(t=l.ref)&&(t.current&&t.current!==l.__e||z(t,null,u)),i||\"function\"==typeof l.type||(i=null!=(o=l.__e)),l.__e=l.__d=void 0,null!=(t=l.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(l){n.__e(l,u)}t.base=t.__P=null}if(t=l.__k)for(r=0;r<t.length;r++)t[r]&&L(t[r],u,i);null!=o&&s(o)}function M(n,l,u){return this.constructor(n,u)}function N(l,u,i){var t,o,e;n.__&&n.__(l,u),o=(t=\"function\"==typeof i)?null:i&&i.__k||u.__k,e=[],I(u,l=(!t&&i||u).__k=a(y,null,[l]),o||r,r,void 0!==u.ownerSVGElement,!t&&i?[i]:o?null:u.firstChild?f.slice.call(u.childNodes):null,e,!t&&i?i:o?o.__e:u.firstChild,t),T(e,l)}function O(n,l){N(n,l,O)}function S(n,l,u){var i,t,o,r=arguments,f=c({},n.props);for(o in l)\"key\"==o?i=l[o]:\"ref\"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o<arguments.length;o++)u.push(r[o]);return null!=u&&(f.children=u),v(n.type,f,i||n.key,t||n.ref,null)}function q(n,l){var u={__c:l=\"__cC\"+o++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(k)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n},__v:0},l=function(n){return null!=n&&void 0===n.constructor},p.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=c({},this.state),\"function\"==typeof n&&(n=n(c({},u),this.props)),n&&c(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),k(this))},p.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),k(this))},p.prototype.render=y,u=[],i=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,b.__r=0,o=0;export{N as render,O as hydrate,a as createElement,a as h,y as Fragment,h as createRef,l as isValidElement,p as Component,S as cloneElement,q as createContext,w as toChildArray,n as options};\n//# sourceMappingURL=preact.module.js.map\n","export type ID = string;\n\nexport function generateUUID(): ID {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import { generateUUID, ID } from './util/id';\n\nclass Base {\n private readonly _id: ID;\n\n constructor(id?: ID) {\n this._id = id || generateUUID();\n }\n\n get id(): ID {\n return this._id;\n }\n}\n\nexport default Base;\n","export default {\n search: {\n placeholder: 'Type a keyword...',\n },\n sort: {\n sortAsc: 'Sort column ascending',\n sortDesc: 'Sort column descending',\n },\n pagination: {\n previous: 'Previous',\n next: 'Next',\n navigate: (page, pages) => `Page ${page} of ${pages}`,\n page: (page) => `Page ${page}`,\n showing: 'Showing',\n of: 'of',\n to: 'to',\n results: 'results',\n },\n loading: 'Loading...',\n noRecordsFound: 'No matching records found',\n error: 'An error happened while fetching the data',\n};\n","import enUS from './en_US';\ntype MessageFormat = (...args) => string;\ntype Message = string | MessageFormat;\nexport type Language = { [key: string]: Message | Language };\n\nexport class Translator {\n private readonly _language: Language;\n private readonly _defaultLanguage: Language;\n\n constructor(language?: Language) {\n this._language = language;\n this._defaultLanguage = enUS;\n }\n\n /**\n * Tries to split the message with \".\" and find\n * the key in the given language\n *\n * @param message\n * @param lang\n */\n getString(message: string, lang: Language): MessageFormat {\n if (!lang || !message) return null;\n\n const splitted = message.split('.');\n const key = splitted[0];\n\n if (lang[key]) {\n const val = lang[key];\n\n if (typeof val === 'string') {\n return (): string => val;\n } else if (typeof val === 'function') {\n return val;\n } else {\n return this.getString(splitted.slice(1).join('.'), val);\n }\n }\n\n return null;\n }\n\n translate(message: string, ...args): string {\n const translated = this.getString(message, this._language);\n let messageFormat;\n\n if (translated) {\n messageFormat = translated;\n } else {\n messageFormat = this.getString(message, this._defaultLanguage);\n }\n\n if (messageFormat) {\n return messageFormat(...args);\n }\n\n return message;\n }\n}\n\nexport function useTranslator(translator: Translator) {\n return function (message: string, ...args): string {\n return translator.translate(message, ...args);\n };\n}\n","import { Component } from 'preact';\nimport { Config } from '../config';\nimport getConfig from '../util/getConfig';\nimport { useTranslator } from '../i18n/language';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface BaseProps {}\n\nexport abstract class BaseComponent<\n P extends BaseProps = unknown,\n S = unknown,\n> extends Component<P, S> {\n protected config: Config;\n protected _: (message: string, ...args) => string;\n\n constructor(props: P, context: any) {\n super(props, context);\n this.config = getConfig(context);\n\n if (this.config) {\n this._ = useTranslator(this.config.translator);\n }\n }\n}\n\nexport interface BaseComponent<P> {\n new (props: P, context?: any): Component<P>;\n}\n","import { Context } from 'preact';\nimport { Config } from '../config';\n\n/**\n * This is a hack to get the current global config from Preact context.\n * My assumption is that we only need one global context which is the ConfigContext\n *\n * @param context\n */\nexport default function getConfig(context: {\n [key: string]: Context<any>;\n}): Config {\n if (!context) return null;\n\n const keys = Object.keys(context);\n\n if (keys.length) {\n // TODO: can we use a better way to capture and return the Config context?\n const ctx: any = context[keys[0]];\n return ctx.props.value;\n }\n\n return null;\n}\n","import { h } from 'preact';\n\nimport { BaseComponent, BaseProps } from './base';\n\nexport interface HTMLContentProps extends BaseProps {\n content: string;\n parentElement?: string;\n}\n\nexport class HTMLElement extends BaseComponent<HTMLContentProps> {\n static defaultProps = {\n parentElement: 'span',\n };\n\n render() {\n return h(this.props.parentElement, {\n dangerouslySetInnerHTML: { __html: this.props.content },\n });\n }\n}\n","import { h, VNode } from 'preact';\nimport { HTMLElement } from '../view/htmlElement';\n\nexport function decode(content: string): string {\n const value = new DOMParser().parseFromString(content, 'text/html');\n return value.documentElement.textContent;\n}\n\nexport function html(content: string, parentElement?: string): VNode {\n return h(HTMLElement, { content: content, parentElement: parentElement });\n}\n","import Base from './base';\nimport { TCell } from './types';\nimport { html } from './util/html';\nimport { ComponentChild } from 'preact';\n\nclass Cell extends Base {\n // because a Cell is a subset of TCell type\n public data: number | string | boolean | ComponentChild;\n\n constructor(data: TCell) {\n super();\n\n this.update(data);\n }\n\n private cast(data: TCell): number | string | boolean | ComponentChild {\n if (data instanceof HTMLElement) {\n return html(data.outerHTML);\n }\n\n return data;\n }\n\n /**\n * Updates the Cell's data\n *\n * @param data\n */\n public update(data: TCell): Cell {\n this.data = this.cast(data);\n return this;\n }\n}\n\nexport default Cell;\n","// The order of enum items define the processing order of the processor type\n// e.g. Extractor = 0 will be processed before Transformer = 1\nimport { generateUUID, ID } from '../util/id';\nimport { EventEmitter } from '../util/eventEmitter';\n\nexport enum ProcessorType {\n Initiator,\n ServerFilter,\n ServerSort,\n ServerLimit,\n Extractor,\n Transformer,\n Filter,\n Sort,\n Limit,\n}\n\ninterface PipelineProcessorEvents<T, P> {\n propsUpdated: (processor: PipelineProcessor<T, P>) => void;\n beforeProcess: (...args) => void;\n afterProcess: (...args) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PipelineProcessorProps {}\n\nexport abstract class PipelineProcessor<\n T,\n P extends Partial<PipelineProcessorProps>,\n> extends EventEmitter<PipelineProcessorEvents<T, P>> {\n public readonly id: ID;\n private readonly _props: P;\n\n abstract get type(): ProcessorType;\n protected abstract _process(...args): T | Promise<T>;\n protected validateProps?(...args): void;\n\n constructor(props?: Partial<P>) {\n super();\n\n this._props = {} as P;\n this.id = generateUUID();\n\n if (props) this.setProps(props);\n }\n\n /**\n * process is used to call beforeProcess and afterProcess callbacks\n * This function is just a wrapper that calls _process()\n *\n * @param args\n */\n process(...args): T | Promise<T> {\n if (this.validateProps instanceof Function) {\n this.validateProps(...args);\n }\n\n this.emit('beforeProcess', ...args);\n const result = this._process(...args);\n this.emit('afterProcess', ...args);\n return result;\n }\n\n setProps(props: Partial<P>): this {\n Object.assign(this._props, props);\n this.emit('propsUpdated', this);\n return this;\n }\n\n get props(): P {\n return this._props;\n }\n}\n","import Cell from './cell';\nimport Base from './base';\nimport { TCell } from './types';\n\nclass Row extends Base {\n private _cells: Cell[];\n\n constructor(cells?: Cell[]) {\n super();\n\n this.cells = cells || [];\n }\n\n public cell(index: number): Cell {\n return this._cells[index];\n }\n\n public get cells(): Cell[] {\n return this._cells;\n }\n\n public set cells(cells: Cell[]) {\n this._cells = cells;\n }\n\n public toArray(): TCell[] {\n return this.cells.map((cell) => cell.data);\n }\n\n /**\n * Creates a new Row from an array of Cell(s)\n * This method generates a new ID for the Row and all nested elements\n *\n * @param cells\n * @returns Row\n */\n static fromCells(cells: Cell[]): Row {\n return new Row(cells.map((cell) => new Cell(cell.data)));\n }\n\n get length(): number {\n return this.cells.length;\n }\n}\n\nexport default Row;\n","import Base from './base';\nimport Row from './row';\nimport Cell from './cell';\nimport { OneDArray, TCell, TwoDArray } from './types';\nimport { oneDtoTwoD } from './util/array';\n\nclass Tabular extends Base {\n private _rows: Row[];\n private _length: number;\n\n constructor(rows?: Row[] | Row) {\n super();\n\n if (rows instanceof Array) {\n this.rows = rows;\n } else if (rows instanceof Row) {\n this.rows = [rows];\n } else {\n this.rows = [];\n }\n }\n\n get rows(): Row[] {\n return this._rows;\n }\n\n set rows(rows: Row[]) {\n this._rows = rows;\n }\n\n get length(): number {\n return this._length || this.rows.length;\n }\n\n // we want to sent the length when storage is ServerStorage\n set length(len: number) {\n this._length = len;\n }\n\n public toArray(): TCell[][] {\n return this.rows.map((row) => row.toArray());\n }\n\n /**\n * Creates a new Tabular from an array of Row(s)\n * This method generates a new ID for the Tabular and all nested elements\n *\n * @param rows\n * @returns Tabular\n */\n static fromRows(rows: Row[]): Tabular {\n return new Tabular(rows.map((row) => Row.fromCells(row.cells)));\n }\n\n /**\n * Creates a new Tabular from a 2D array\n * This method generates a new ID for the Tabular and all nested elements\n *\n * @param data\n * @returns Tabular\n */\n static fromArray<T extends TCell>(\n data: OneDArray<T> | TwoDArray<T>,\n ): Tabular {\n data = oneDtoTwoD(data);\n\n return new Tabular(\n data.map((row) => new Row(row.map((cell) => new Cell(cell)))),\n );\n }\n}\n\nexport default Tabular;\n","import { OneDArray, TwoDArray } from '../types';\n\nexport function oneDtoTwoD<T>(data: OneDArray<T> | TwoDArray<T>): TwoDArray<T> {\n if (data[0] && !(data[0] instanceof Array)) {\n return [data] as TwoDArray<T>;\n }\n\n return data as TwoDArray<T>;\n}\n\nexport function flatten<T>(arrays: TwoDArray<T>): OneDArray<T> {\n return arrays.reduce((prev, x) => prev.concat(x), []);\n}\n","type EventArgs<T> = [T] extends [(...args: infer U) => any]\n ? U\n : [T] extends [void]\n ? []\n : [T];\n\n/**\n * Example:\n *\n * export interface BaseEvents<P, S> {\n * SET_STATE: (component: BaseComponent<P, S>, state: S) => void;\n * }\n */\n\nexport interface EventEmitter<EventTypes> {\n addListener<EventName extends keyof EventTypes>(\n event: EventName,\n listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n ): EventEmitter<EventTypes>;\n\n on<EventName extends keyof EventTypes>(\n event: EventName,\n listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n ): EventEmitter<EventTypes>;\n\n off<EventName extends keyof EventTypes>(\n event: EventName,\n listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n ): EventEmitter<EventTypes>;\n\n emit<EventName extends keyof EventTypes>(\n event: EventName,\n ...args: EventArgs<EventTypes[EventName]>\n ): boolean;\n}\n\nexport class EventEmitter<EventTypes> {\n private callbacks: { [event: string]: ((...args) => void)[] };\n\n // because we are using EventEmitter as a mixin and the\n // constructor won't be called by the applyMixins function\n // see src/base.ts and src/util/applyMixin.ts\n private init(event?: string): void {\n if (!this.callbacks) {\n this.callbacks = {};\n }\n\n if (event && !this.callbacks[event]) {\n this.callbacks[event] = [];\n }\n }\n\n on<EventName extends keyof EventTypes>(\n event: EventName,\n listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n ): EventEmitter<EventTypes> {\n this.init(event as string);\n this.callbacks[event as string].push(listener);\n return this;\n }\n\n off<EventName extends keyof EventTypes>(\n event: EventName,\n listener: (...args: EventArgs<EventTypes[EventName]>) => void,\n ): EventEmitter<EventTypes> {\n const eventName = event as string;\n\n this.init();\n\n if (!this.callbacks[eventName] || this.callbacks[eventName].length === 0) {\n // there is no callbacks with this key\n return this;\n }\n\n this.callbacks[eventName] = this.callbacks[eventName].filter(\n (value) => value != listener,\n );\n\n return this;\n }\n\n emit<EventName extends keyof EventTypes>(\n event: EventName,\n ...args: EventArgs<EventTypes[EventName]>\n ): boolean {\n const eventName = event as string;\n\n this.init(eventName);\n\n if (this.callbacks[eventName].length > 0) {\n this.callbacks[eventName].forEach((value) => value(...args));\n return true;\n }\n\n return false;\n }\n}\n","import search from '../../operator/search';\nimport Tabular from '../../tabular';\nimport {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { OneDArray, TCell, TColumn } from '../../types';\n\ninterface GlobalSearchFilterProps extends PipelineProcessorProps {\n keyword: string;\n columns: OneDArray<TColumn>;\n ignoreHiddenColumns: boolean;\n selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string;\n}\n\nclass GlobalSearchFilter extends PipelineProcessor<\n Tabular,\n GlobalSearchFilterProps\n> {\n get type(): ProcessorType {\n return ProcessorType.Filter;\n }\n\n _process(data: Tabular): Tabular {\n if (this.props.keyword) {\n return search(\n String(this.props.keyword).trim(),\n this.props.columns,\n this.props.ignoreHiddenColumns,\n data,\n this.props.selector,\n );\n }\n\n return data;\n }\n}\n\nexport default GlobalSearchFilter;\n","import Tabular from '../tabular';\nimport { VNode } from 'preact';\nimport { HTMLContentProps } from '../view/htmlElement';\nimport { OneDArray, TCell, TColumn } from '../types';\n\nexport default function (\n keyword: string,\n columns: OneDArray<TColumn>,\n ignoreHiddenColumns: boolean,\n tabular: Tabular,\n selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string,\n): Tabular {\n // escape special regex chars\n keyword = keyword.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\n return new Tabular(\n tabular.rows.filter((row, rowIndex) =>\n row.cells.some((cell, cellIndex) => {\n if (!cell) {\n return false;\n }\n\n if (ignoreHiddenColumns) {\n if (\n columns &&\n columns[cellIndex] &&\n typeof columns[cellIndex] === 'object'\n ) {\n const typedColumn = columns[cellIndex] as TColumn;\n if (typedColumn.hidden) {\n return false;\n }\n }\n }\n\n let data = '';\n\n if (typeof selector === 'function') {\n data = selector(cell.data, rowIndex, cellIndex);\n } else if (typeof cell.data === 'object') {\n // HTMLContent element\n const element = cell.data as VNode<HTMLContentProps>;\n if (element && element.props && element.props.content) {\n // TODO: we should only search in the content of the element. props.content is the entire HTML element\n data = element.props.content;\n }\n } else {\n // primitive types\n data = String(cell.data);\n }\n\n return new RegExp(keyword, 'gi').test(data);\n }),\n ),\n );\n}\n","export function className(...args: string[]): string {\n const prefix = 'gridjs';\n\n return `${prefix}${args.reduce(\n (prev: string, cur: string) => `${prev}-${cur}`,\n '',\n )}`;\n}\n\nexport function classJoin(...classNames: string[]): string {\n return (\n classNames\n .filter((x) => x)\n .reduce((className, prev) => `${className || ''} ${prev}`, '')\n .trim() || null\n );\n}\n","import { EventEmitter } from '../../util/eventEmitter';\nimport Dispatcher from '../../util/dispatcher';\n\ninterface BaseStoreEvents<STATE> {\n updated: (newState: STATE, prevState?: STATE) => void;\n}\n\nexport default abstract class BaseStore<STATE, ACTIONS> extends EventEmitter<\n BaseStoreEvents<STATE>\n> {\n private _state: STATE;\n protected readonly dispatcher: Dispatcher<any>;\n\n constructor(dispatcher: Dispatcher<any>) {\n super();\n this.dispatcher = dispatcher;\n this._state = this.getInitialState();\n dispatcher.register(this._handle.bind(this));\n }\n\n abstract handle<K extends keyof ACTIONS>(type: K, payload: ACTIONS[K]): void;\n abstract getInitialState(): STATE;\n\n private _handle(action): void {\n this.handle(action.type, action.payload);\n }\n\n setState(newState: STATE): void {\n const prevState = this._state;\n this._state = newState;\n this.emit('updated', newState, prevState);\n }\n\n get state(): STATE {\n return this._state;\n }\n}\n","import { BaseComponent, BaseProps } from './view/base';\nimport { Component, ComponentProps, Fragment, h } from 'preact';\nimport log from './util/log';\n\n/**\n * BaseProps for all plugins\n */\nexport interface PluginBaseProps<T extends PluginBaseComponentCtor> {\n plugin: Plugin<T>;\n}\n\n/**\n * BaseComponent for all plugins\n */\nexport abstract class PluginBaseComponent<\n P extends PluginBaseProps<any> = any,\n S = unknown,\n> extends BaseComponent<P, S> {}\n\nexport interface PluginBaseComponentCtor<\n P extends PluginBaseProps<any> = any,\n S = unknown,\n> {\n new (props: P, context?: any): Component<P, S>;\n}\n\nexport enum PluginPosition {\n Header,\n Footer,\n Cell,\n}\n\nexport interface Plugin<T extends PluginBaseComponentCtor> {\n id: string;\n position: PluginPosition;\n component: T;\n props?: Partial<ComponentProps<T>>;\n order?: number;\n}\n\nexport class PluginManager {\n private readonly plugins: Plugin<any>[];\n\n constructor() {\n this.plugins = [];\n }\n\n get<T extends PluginBaseComponentCtor>(id: string): Plugin<T> | null {\n const plugins = this.plugins.filter((p) => p.id === id);\n\n if (plugins.length > 0) {\n return plugins[0];\n }\n\n return null;\n }\n\n add<T extends PluginBaseComponentCtor>(plugin: Plugin<T>): this {\n if (!plugin.id) {\n log.error('Plugin ID cannot be empty');\n return this;\n }\n\n if (this.get(plugin.id) !== null) {\n log.error(`Duplicate plugin ID: ${plugin.id}`);\n return this;\n }\n\n this.plugins.push(plugin);\n return this;\n }\n\n remove(id: string): this {\n this.plugins.splice(this.plugins.indexOf(this.get(id)), 1);\n return this;\n }\n\n list<T extends PluginBaseComponentCtor>(\n position?: PluginPosition,\n ): Plugin<T>[] {\n let plugins: Plugin<T>[];\n\n if (position != null || position != undefined) {\n plugins = this.plugins.filter((p) => p.position === position);\n } else {\n plugins = this.plugins;\n }\n\n return plugins.sort((a, b) => a.order - b.order);\n }\n}\n\nexport interface PluginRendererProps extends BaseProps {\n props?: any;\n // to render a single plugin\n pluginId?: string;\n // to render all plugins in this PluginPosition\n position?: PluginPosition;\n}\n\nexport class PluginRenderer extends BaseComponent<PluginRendererProps> {\n render() {\n if (this.props.pluginId) {\n // render a single plugin\n const plugin = this.config.plugin.get(this.props.pluginId);\n\n if (!plugin) return null;\n\n return h(\n Fragment,\n {},\n h(plugin.component, {\n plugin: plugin,\n ...plugin.props,\n ...this.props.props,\n }),\n );\n } else if (this.props.position !== undefined) {\n // render using a specific plugin position\n return h(\n Fragment,\n {},\n this.config.plugin\n .list(this.props.position)\n .map((p) =>\n h(p.component, { plugin: p, ...p.props, ...this.props.props }),\n ),\n );\n }\n\n return null;\n }\n}\n","import BaseStore from '../../base/store';\nimport { SearchActionsType } from './actions';\n\nexport type SearchStoreState = { keyword: string | null };\n\nexport class SearchStore extends BaseStore<\n SearchStoreState,\n SearchActionsType\n> {\n getInitialState(): SearchStoreState {\n return { keyword: null };\n }\n\n handle(type, payload): void {\n if (type === 'SEARCH_KEYWORD') {\n const { keyword } = payload;\n this.search(keyword);\n }\n }\n\n private search(keyword: string): void {\n this.setState({ keyword: keyword });\n }\n}\n","import Dispatcher from '../../util/dispatcher';\n\nexport abstract class BaseActions<ACTIONS> {\n private readonly dispatcher: Dispatcher<any>;\n\n constructor(dispatcher: Dispatcher<any>) {\n this.dispatcher = dispatcher;\n }\n\n protected dispatch<K extends keyof ACTIONS>(\n type: K,\n payload: ACTIONS[K],\n ): void {\n this.dispatcher.dispatch({\n type: type,\n payload: payload,\n });\n }\n}\n","import { BaseActions } from '../../base/actions';\n\nexport interface SearchActionsType {\n SEARCH_KEYWORD: {\n keyword: string;\n };\n}\n\nexport class SearchActions extends BaseActions<SearchActionsType> {\n search(keyword: string): void {\n this.dispatch('SEARCH_KEYWORD', {\n keyword: keyword,\n });\n }\n}\n","import {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerGlobalSearchFilterProps extends PipelineProcessorProps {\n keyword?: string;\n url?: (prevUrl: string, keyword: string) => string;\n body?: (prevBody: BodyInit, keyword: string) => BodyInit;\n}\n\nclass ServerGlobalSearchFilter extends PipelineProcessor<\n ServerStorageOptions,\n ServerGlobalSearchFilterProps\n> {\n get type(): ProcessorType {\n return ProcessorType.ServerFilter;\n }\n\n _process(options?: ServerStorageOptions): ServerStorageOptions {\n if (!this.props.keyword) return options;\n\n const updates = {};\n\n if (this.props.url) {\n updates['url'] = this.props.url(options.url, this.props.keyword);\n }\n\n if (this.props.body) {\n updates['body'] = this.props.body(options.body, this.props.keyword);\n }\n\n return {\n ...options,\n ...updates,\n };\n }\n}\n\nexport default ServerGlobalSearchFilter;\n","/**\n * Centralized logging lib\n *\n * This class needs some improvements but so far it has been used to have a coherent way to log\n */\nclass Logger {\n private format(message: string, type: string): string {\n return `[Grid.js] [${type.toUpperCase()}]: ${message}`;\n }\n\n error(message: string, throwException = false): void {\n const msg = this.format(message, 'error');\n\n if (throwException) {\n throw Error(msg);\n } else {\n console.error(msg);\n }\n }\n\n warn(message: string): void {\n console.warn(this.format(message, 'warn'));\n }\n\n info(message: string): void {\n console.info(this.format(message, 'info'));\n }\n}\n\nexport default new Logger();\n","import { h } from 'preact';\nimport GlobalSearchFilter from '../../../pipeline/filter/globalSearch';\nimport { classJoin, className } from '../../../util/className';\nimport { SearchStore, SearchStoreState } from './store';\nimport { SearchActions } from './actions';\nimport ServerGlobalSearchFilter from '../../../pipeline/filter/serverGlobalSearch';\nimport { debounce } from '../../../util/debounce';\nimport { TCell } from '../../../types';\nimport { PluginBaseComponent, PluginBaseProps } from '../../../plugin';\n\nexport interface SearchConfig {\n keyword?: string;\n enabled?: boolean;\n ignoreHiddenColumns?: boolean;\n debounceTimeout?: number;\n selector?: (cell: TCell, rowIndex: number, cellIndex: number) => string;\n server?: {\n url?: (prevUrl: string, keyword: string) => string;\n body?: (prevBody: BodyInit, keyword: string) => BodyInit;\n };\n}\n\nexport class Search extends PluginBaseComponent<\n SearchConfig & PluginBaseProps<Search>\n> {\n private readonly searchProcessor:\n | GlobalSearchFilter\n | ServerGlobalSearchFilter;\n private readonly actions: SearchActions;\n private readonly store: SearchStore;\n private readonly storeUpdatedFn: (...args) => void;\n\n static defaultProps = {\n debounceTimeout: 250,\n };\n\n constructor(props, context) {\n super(props, context);\n\n this.actions = new SearchActions(this.config.dispatcher);\n this.store = new SearchStore(this.config.dispatcher);\n const { enabled, keyword } = props;\n\n if (enabled) {\n // initial search\n if (keyword) this.actions.search(keyword);\n\n this.storeUpdatedFn = this.storeUpdated.bind(this);\n this.store.on('updated', this.storeUpdatedFn);\n\n let searchProcessor;\n if (props.server) {\n searchProcessor = new ServerGlobalSearchFilter({\n keyword: props.keyword,\n url: props.server.url,\n body: props.server.body,\n });\n } else {\n searchProcessor = new GlobalSearchFilter({\n keyword: props.keyword,\n columns: this.config.header && this.config.header.columns,\n ignoreHiddenColumns:\n props.ignoreHiddenColumns ||\n props.ignoreHiddenColumns === undefined,\n selector: props.selector,\n });\n }\n\n this.searchProcessor = searchProcessor;\n\n // adds a new processor to the pipeline\n this.config.pipeline.register(searchProcessor);\n }\n }\n\n componentWillUnmount(): void {\n this.config.pipeline.unregister(this.searchProcessor);\n this.store.off('updated', this.storeUpdatedFn);\n }\n\n private storeUpdated(state: SearchStoreState): void {\n // updates the processor state\n this.searchProcessor.setProps({\n keyword: state.keyword,\n });\n }\n\n private onChange(event): void {\n const keyword = event.target.value;\n this.actions.search(keyword);\n }\n\n render() {\n if (!this.props.enabled) return null;\n\n let onInput = this.onChange.bind(this);\n\n // add debounce to input only if it's a server-side search\n if (this.searchProcessor instanceof ServerGlobalSearchFilter) {\n onInput = debounce(onInput, this.props.debounceTimeout);\n }\n\n return (\n <div\n className={className(classJoin('search', this.config.className.search))}\n >\n <input\n type=\"search\"\n placeholder={this._('search.placeholder')}\n aria-label={this._('search.placeholder')}\n onInput={onInput}\n className={classJoin(\n className('input'),\n className('search', 'input'),\n )}\n value={this.store.state.keyword}\n />\n </div>\n );\n }\n}\n","export const debounce = <F extends (...args: any[]) => any>(\n func: F,\n waitFor: number,\n) => {\n let timeout;\n\n return (...args: Parameters<F>): Promise<ReturnType<F>> =>\n new Promise((resolve) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => resolve(func(...args)), waitFor);\n });\n};\n","import Tabular from '../../tabular';\nimport {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\n\ninterface PaginationLimitProps extends PipelineProcessorProps {\n page: number;\n limit: number;\n}\n\nclass PaginationLimit extends PipelineProcessor<Tabular, PaginationLimitProps> {\n protected validateProps(): void {\n if (isNaN(Number(this.props.limit)) || isNaN(Number(this.props.page))) {\n throw Error('Invalid parameters passed');\n }\n }\n\n get type(): ProcessorType {\n return ProcessorType.Limit;\n }\n\n protected _process(data: Tabular): Tabular {\n const page = this.props.page;\n const start = page * this.props.limit;\n const end = (page + 1) * this.props.limit;\n\n return new Tabular(data.rows.slice(start, end));\n }\n}\n\nexport default PaginationLimit;\n","import {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerPaginationLimitProps extends PipelineProcessorProps {\n page: number;\n limit: number;\n url?: (prevUrl: string, page: number, limit: number) => string;\n body?: (prevBody: BodyInit, page: number, limit: number) => BodyInit;\n}\n\nclass ServerPaginationLimit extends PipelineProcessor<\n ServerStorageOptions,\n ServerPaginationLimitProps\n> {\n get type(): ProcessorType {\n return ProcessorType.ServerLimit;\n }\n\n _process(options?: ServerStorageOptions): ServerStorageOptions {\n const updates = {};\n\n if (this.props.url) {\n updates['url'] = this.props.url(\n options.url,\n this.props.page,\n this.props.limit,\n );\n }\n\n if (this.props.body) {\n updates['body'] = this.props.body(\n options.body,\n this.props.page,\n this.props.limit,\n );\n }\n\n return {\n ...options,\n ...updates,\n };\n }\n}\n\nexport default ServerPaginationLimit;\n","import { h, Fragment } from 'preact';\nimport PaginationLimit from '../../pipeline/limit/pagination';\nimport { classJoin, className } from '../../util/className';\nimport ServerPaginationLimit from '../../pipeline/limit/serverPagination';\nimport Tabular from '../../tabular';\nimport { PipelineProcessor } from '../../pipeline/processor';\nimport { PluginBaseComponent, PluginBaseProps } from '../../plugin';\n\ninterface PaginationState {\n page: number;\n limit?: number;\n total: number;\n}\n\nexport interface PaginationConfig {\n enabled: boolean;\n limit?: number;\n page?: number;\n summary?: boolean;\n nextButton?: boolean;\n prevButton?: boolean;\n buttonsCount?: number;\n resetPageOnUpdate?: boolean;\n server?: {\n url?: (prevUrl: string, page: number, limit: number) => string;\n body?: (prevBody: BodyInit, page: number, limit: number) => BodyInit;\n };\n}\n\nexport class Pagination extends PluginBaseComponent<\n PluginBaseProps<Pagination> & PaginationConfig,\n PaginationState\n> {\n private processor: PaginationLimit | ServerPaginationLimit;\n private onUpdateFn: (processor: PipelineProcessor<any, any>) => void;\n private setTotalFromTabularFn: (tabular: Tabular) => void;\n\n static defaultProps = {\n summary: true,\n nextButton: true,\n prevButton: true,\n buttonsCount: 3,\n limit: 10,\n resetPageOnUpdate: true,\n };\n\n constructor(props, context) {\n super(props, context);\n\n this.state = {\n limit: props.limit,\n page: props.page || 0,\n total: 0,\n };\n }\n\n componentWillMount(): void {\n if (this.props.enabled) {\n let processor;\n\n this.setTotalFromTabularFn = this.setTotalFromTabular.bind(this);\n\n if (this.props.server) {\n processor = new ServerPaginationLimit({\n limit: this.state.limit,\n page: this.state.page,\n url: this.props.server.url,\n body: this.props.server.body,\n });\n\n this.config.pipeline.on('afterProcess', this.setTotalFromTabularFn);\n } else {\n processor = new PaginationLimit({\n limit: this.state.limit,\n page: this.state.page,\n });\n\n // Pagination (all Limit processors) is the last step in the pipeline\n // and we assume that at this stage, we have the rows that we care about.\n // Let's grab the rows before processing Pagination and set total number of rows\n processor.on('beforeProcess', this.setTotalFromTabularFn);\n }\n\n this.processor = processor;\n this.config.pipeline.register(processor);\n\n // we need to make sure that the state is set\n // to the default props when an error happens\n this.config.pipeline.on('error', () => {\n this.setState({\n total: 0,\n page: 0,\n });\n });\n }\n }\n\n private setTotalFromTabular(tabular: Tabular): void {\n this.setTotal(tabular.length);\n }\n\n private onUpdate(processor): void {\n // this is to ensure that the current page is set to 0\n // when a processor is updated for some reason\n if (this.props.resetPageOnUpdate && processor !== this.processor) {\n this.setPage(0);\n }\n }\n\n componentDidMount(): void {\n this.onUpdateFn = this.onUpdate.bind(this);\n this.config.pipeline.on('updated', this.onUpdateFn);\n }\n\n componentWillUnmount() {\n this.config.pipeline.unregister(this.processor);\n this.config.pipeline.off('updated', this.onUpdateFn);\n }\n\n private get pages(): number {\n return Math.ceil(this.state.total / this.state.limit);\n }\n\n private setPage(page: number): void {\n if (page >= this.pages || page < 0 || page === this.state.page) {\n return null;\n }\n\n this.setState({\n page: page,\n });\n\n this.processor.setProps({\n page: page,\n });\n }\n\n private setTotal(totalRows: number): void {\n // to set the correct total number of rows\n // when running in-memory operations\n this.setState({\n total: totalRows,\n });\n }\n\n renderPages() {\n if (this.props.buttonsCount <= 0) {\n return null;\n }\n\n // how many pagination buttons to render?\n const maxCount: number = Math.min(this.pages, this.props.buttonsCount);\n\n let pagePivot = Math.min(this.state.page, Math.floor(maxCount / 2));\n if (this.state.page + Math.floor(maxCount / 2) >= this.pages) {\n pagePivot = maxCount - (this.pages - this.state.page);\n }\n\n return (\n <Fragment>\n {this.pages > maxCount && this.state.page - pagePivot > 0 && (\n <Fragment>\n <button\n tabIndex={0}\n role=\"button\"\n onClick={this.setPage.bind(this, 0)}\n title={this._('pagination.firstPage')}\n aria-label={this._('pagination.firstPage')}\n className={this.config.className.paginationButton}\n >\n {this._('1')}\n </button>\n <button\n tabIndex={-1}\n className={classJoin(\n className('spread'),\n this.config.className.paginationButton,\n )}\n >\n ...\n </button>\n </Fragment>\n )}\n\n {Array.from(Array(maxCount).keys())\n .map((i) => this.state.page + (i - pagePivot))\n .map((i) => (\n <button\n tabIndex={0}\n role=\"button\"\n onClick={this.setPage.bind(this, i)}\n className={classJoin(\n this.state.page === i\n ? classJoin(\n className('currentPage'),\n this.config.className.paginationButtonCurrent,\n )\n : null,\n this.config.className.paginationButton,\n )}\n title={this._('pagination.page', i + 1)}\n aria-label={this._('pagination.page', i + 1)}\n >\n {this._(`${i + 1}`)}\n </button>\n ))}\n\n {this.pages > maxCount && this.pages > this.state.page + pagePivot + 1 && (\n <Fragment>\n <button\n tabIndex={-1}\n className={classJoin(\n className('spread'),\n this.config.className.paginationButton,\n )}\n >\n ...\n </button>\n <button\n tabIndex={0}\n role=\"button\"\n onClick={this.setPage.bind(this, this.pages - 1)}\n title={this._('pagination.page', this.pages)}\n aria-label={this._('pagination.page', this.pages)}\n className={this.config.className.paginationButton}\n >\n {this._(`${this.pages}`)}\n </button>\n </Fragment>\n )}\n </Fragment>\n );\n }\n\n renderSummary() {\n return (\n <Fragment>\n {this.props.summary && this.state.total > 0 && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={classJoin(\n className('summary'),\n this.config.className.paginationSummary,\n )}\n title={this._(\n 'pagination.navigate',\n this.state.page + 1,\n this.pages,\n )}\n >\n {this._('pagination.showing')}{' '}\n <b>{this._(`${this.state.page * this.state.limit + 1}`)}</b>{' '}\n {this._('pagination.to')}{' '}\n <b>\n {this._(\n `${Math.min(\n (this.state.page + 1) * this.state.limit,\n this.state.total,\n )}`,\n )}\n </b>{' '}\n {this._('pagination.of')} <b>{this._(`${this.state.total}`)}</b>{' '}\n {this._('pagination.results')}\n </div>\n )}\n </Fragment>\n );\n }\n\n render() {\n if (!this.props.enabled) return null;\n\n return (\n <div\n className={classJoin(\n className('pagination'),\n this.config.className.pagination,\n )}\n >\n {this.renderSummary()}\n\n <div className={className('pages')}>\n {this.props.prevButton && (\n <button\n tabIndex={0}\n role=\"button\"\n disabled={this.state.page === 0}\n onClick={this.setPage.bind(this, this.state.page - 1)}\n title={this._('pagination.previous')}\n aria-label={this._('pagination.previous')}\n className={classJoin(\n this.config.className.paginationButton,\n this.config.className.paginationButtonPrev,\n )}\n >\n {this._('pagination.previous')}\n </button>\n )}\n\n {this.renderPages()}\n\n {this.props.nextButton && (\n <button\n tabIndex={0}\n role=\"button\"\n disabled={this.pages === this.state.page + 1 || this.pages === 0}\n onClick={this.setPage.bind(this, this.state.page + 1)}\n title={this._('pagination.next')}\n aria-label={this._('pagination.next')}\n className={classJoin(\n this.config.className.paginationButton,\n this.config.className.paginationButtonNext,\n )}\n >\n {this._('pagination.next')}\n </button>\n )}\n </div>\n </div>\n );\n }\n}\n","export function width(width: string | number, containerWidth?: number): number {\n if (typeof width == 'string') {\n if (width.indexOf('%') > -1) {\n return (containerWidth / 100) * parseInt(width, 10);\n } else {\n return parseInt(width, 10);\n }\n }\n\n return width;\n}\n\nexport function px(width: number): string {\n if (!width) return '';\n return `${Math.floor(width)}px`;\n}\n","import { Component, h, RefObject } from 'preact';\nimport { BaseComponent, BaseProps } from '../base';\nimport { className } from '../../util/className';\n\ninterface ShadowTableProps extends BaseProps {\n tableRef?: RefObject<Component>;\n}\n\n/**\n * ShadowTable renders a hidden table and is used to calculate the column's width\n * when autoWidth option is enabled\n */\nexport class ShadowTable extends BaseComponent<ShadowTableProps> {\n private tableElement: HTMLTableElement;\n private tableClassName: string;\n private tableStyle: string;\n\n constructor(props, context) {\n super(props, context);\n\n const tableRef = this.props.tableRef;\n this.tableElement = tableRef.current.base.cloneNode(\n true,\n ) as HTMLTableElement;\n\n this.tableElement.style.position = 'absolute';\n this.tableElement.style.width = '100%';\n this.tableElement.style.zIndex = '-2147483640';\n this.tableElement.style.visibility = 'hidden';\n\n this.tableClassName = this.tableElement.className;\n this.tableStyle = this.tableElement.style.cssText;\n }\n\n public widths(): { [columnId: string]: { minWidth: number; width: number } } {\n this.tableElement.className = `${this.tableClassName} ${className(\n 'shadowTable',\n )}`;\n\n this.tableElement.style.tableLayout = 'auto';\n this.tableElement.style.width = 'auto';\n this.tableElement.style.padding = '0';\n this.tableElement.style.margin = '0';\n this.tableElement.style.border = 'none';\n this.tableElement.style.outline = 'none';\n\n let obj = Array.from(\n this.base.parentNode.querySelectorAll<HTMLElement>('thead th'),\n ).reduce((prev, current) => {\n current.style.width = `${current.clientWidth}px`;\n\n return {\n [current.getAttribute('data-column-id')]: {\n minWidth: current.clientWidth,\n },\n ...prev,\n };\n }, {});\n\n this.tableElement.className = this.tableClassName;\n this.tableElement.style.cssText = this.tableStyle;\n this.tableElement.style.tableLayout = 'auto';\n\n obj = Array.from(\n this.base.parentNode.querySelectorAll<HTMLElement>('thead th'),\n ).reduce((prev, current) => {\n prev[current.getAttribute('data-column-id')]['width'] =\n current.clientWidth;\n\n return prev;\n }, obj);\n\n return obj;\n }\n\n render() {\n if (this.props.tableRef.current) {\n return (\n <div\n ref={(nodeElement) => {\n nodeElement && nodeElement.appendChild(this.tableElement);\n }}\n />\n );\n }\n\n return null;\n }\n}\n","export function camelCase(str: string): string {\n if (!str) return '';\n\n const words = str.split(' ');\n\n // do not convert strings that are already in camelCase format\n if (words.length === 1 && /([a-z][A-Z])+/g.test(str)) {\n return str;\n }\n\n return words\n .map(function (word, index) {\n // if it is the first word, lowercase all the chars\n if (index == 0) {\n return word.toLowerCase();\n }\n\n // if it is not the first word only upper case the first char and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n","import { OneDArray, TColumn, TwoDArray } from './types';\nimport Base from './base';\nimport { Config, UserConfig } from './config';\nimport { px, width } from './util/width';\nimport { ShadowTable } from './view/table/shadow';\nimport {\n Component,\n ComponentChild,\n createRef,\n h,\n isValidElement,\n RefObject,\n render,\n} from 'preact';\nimport { camelCase } from './util/string';\nimport { flatten } from './util/array';\nimport logger from './util/log';\nimport { PluginPosition } from './plugin';\n\nclass Header extends Base {\n private _columns: OneDArray<TColumn>;\n\n constructor() {\n super();\n\n this._columns = [];\n }\n\n get columns(): OneDArray<TColumn> {\n return this._columns;\n }\n\n set columns(columns) {\n this._columns = columns;\n }\n\n get visibleColumns(): OneDArray<TColumn> {\n return this._columns.filter((c) => !c.hidden);\n }\n\n /**\n * Tries to automatically adjust the width of columns based on:\n * - Header cell content\n * - Cell content of the first row\n * - Cell content of the last row\n *\n * @param config\n */\n adjustWidth(config: Config): this {\n const container: Element = config.container;\n const tableRef: RefObject<Component> = config.tableRef;\n const tempRef: RefObject<HTMLDivElement> = config.tempRef;\n const autoWidth = config.tempRef || true;\n\n if (!container) {\n // we can't calculate the width because the container\n // is unknown at this stage\n return this;\n }\n\n // pixels\n const containerWidth = container.clientWidth;\n\n // let's create a shadow table with the first 10 rows of the data\n // and let the browser to render the table with table-layout: auto\n // no padding, margin or border to get the minimum space required\n // to render columns. One the table is rendered and widths are known,\n // we unmount the shadow table from the DOM and set the correct width\n const shadowTable = createRef();\n let widths = {};\n\n if (tableRef.current && autoWidth) {\n // render a ShadowTable with the first 10 rows\n const el = h(ShadowTable, {\n tableRef: tableRef,\n });\n el.ref = shadowTable;\n\n render(el, tempRef.current);\n\n widths = shadowTable.current.widths();\n }\n\n for (const column of flatten(Header.tabularFormat(this.columns))) {\n // because we don't want to set the width of parent THs\n if (column.columns && column.columns.length > 0) {\n continue;\n }\n\n if (!column.width && autoWidth) {\n // tries to find the corresponding cell\n // from the ShadowTable and set the correct width\n\n if (column.id in widths) {\n // because a column can be hidden, too\n column.width = px(widths[column.id]['width']);\n column.minWidth = px(widths[column.id]['minWidth']);\n }\n } else {\n // column width is already defined\n // sets the column with based on the width of its container\n column.width = px(width(column.width, containerWidth));\n }\n }\n\n if (tableRef.current && autoWidth) {\n // unmount the shadow table from temp\n render(null, tempRef.current);\n }\n\n return this;\n }\n\n private setSort(userConfig: UserConfig, columns?: OneDArray<TColumn>): void {\n const cols = columns || this.columns || [];\n\n for (const column of cols) {\n // sorting can only be enabled for columns without any children\n if (column.columns && column.columns.length > 0) {\n column.sort = {\n enabled: false,\n };\n }\n\n // implicit userConfig.sort flag\n if (column.sort === undefined && userConfig.sort) {\n column.sort = {\n enabled: true,\n };\n }\n\n // false, null, etc.\n if (!column.sort) {\n column.sort = {\n enabled: false,\n };\n } else if (typeof column.sort === 'object') {\n column.sort = {\n enabled: true,\n ...column.sort,\n };\n }\n\n if (column.columns) {\n this.setSort(userConfig, column.columns);\n }\n }\n }\n\n private setFixedHeader(\n userConfig: UserConfig,\n columns?: OneDArray<TColumn>,\n ): void {\n const cols = columns || this.columns || [];\n\n for (const column of cols) {\n if (column.fixedHeader === undefined) {\n column.fixedHeader = userConfig.fixedHeader;\n }\n\n if (column.columns) {\n this.setFixedHeader(userConfig, column.columns);\n }\n }\n }\n\n private setResizable(\n userConfig: UserConfig,\n columns?: OneDArray<TColumn>,\n ): void {\n const cols = columns || this.columns || [];\n\n for (const column of cols) {\n if (column.resizable === undefined) {\n column.resizable = userConfig.resizable;\n }\n\n if (column.columns) {\n this.setResizable(userConfig, column.columns);\n }\n }\n }\n\n private setID(columns?: OneDArray<TColumn>): void {\n const cols = columns || this.columns || [];\n\n for (const column of cols) {\n if (!column.id && typeof column.name === 'string') {\n // let's guess the column ID if it's undefined\n column.id = camelCase(column.name);\n }\n\n if (!column.id) {\n logger.error(\n `Could not find a valid ID for one of the columns. Make sure a valid \"id\" is set for all columns.`,\n );\n }\n\n // nested columns\n if (column.columns) {\n this.setID(column.columns);\n }\n }\n }\n\n private populatePlugins(\n userConfig: UserConfig,\n columns: OneDArray<TColumn>,\n ): void {\n // populate the cell columns\n for (const column of columns) {\n if (column.plugin !== undefined) {\n userConfig.plugin.add({\n id: column.id,\n props: {},\n ...column.plugin,\n position: PluginPosition.Cell,\n });\n }\n }\n }\n\n static fromColumns(\n columns: OneDArray<TColumn | string | ComponentChild>,\n ): Header {\n const header = new Header();\n\n for (const column of columns) {\n if (typeof column === 'string' || isValidElement(column)) {\n header.columns.push({\n name: column,\n });\n } else if (typeof column === 'object') {\n const typedColumn = column as TColumn;\n\n if (typedColumn.columns) {\n typedColumn.columns = Header.fromColumns(typedColumn.columns).columns;\n }\n\n // because the data for that cell is null\n // if we are trying to render a plugin\n if (typeof typedColumn.plugin === 'object') {\n if (typedColumn.data === undefined) {\n typedColumn.data = null;\n }\n }\n\n // TColumn type\n header.columns.push(column as TColumn);\n }\n }\n\n return header;\n }\n\n static fromUserConfig(userConfig: UserConfig): Header | null {\n const header = new Header();\n\n // TODO: this part needs some refactoring\n if (userConfig.from) {\n header.columns = Header.fromHTMLTable(userConfig.from).columns;\n } else if (userConfig.columns) {\n header.columns = Header.fromColumns(userConfig.columns).columns;\n } else if (\n userConfig.data &&\n typeof userConfig.data[0] === 'object' &&\n !(userConfig.data[0] instanceof Array)\n ) {\n // if data[0] is an object but not an Array\n // used for when a JSON payload is provided\n header.columns = Object.keys(userConfig.data[0]).map((name) => {\n return { name: name };\n });\n }\n\n if (header.columns.length) {\n header.setID();\n header.setSort(userConfig);\n header.setFixedHeader(userConfig);\n header.setResizable(userConfig);\n header.populatePlugins(userConfig, header.columns);\n return header;\n }\n\n return null;\n }\n\n static fromHTMLTable(element: HTMLElement): Header {\n const header = new Header();\n const thead = element.querySelector('thead');\n const ths = thead.querySelectorAll('th');\n\n for (const th of ths as any) {\n header.columns.push({\n name: th.innerHTML,\n width: th.width,\n });\n }\n\n return header;\n }\n\n /**\n * Converts the tree-like format of Header to a tabular format\n *\n * Example:\n *\n * H1\n * H1-H1\n * H1-H2\n * H2\n * H2-H1\n *\n * becomes:\n * [\n * [H1, H2],\n * [H1-H1, H1-H2, H2-H1]\n * ]\n *\n * @param columns\n */\n static tabularFormat(columns: OneDArray<TColumn>): TwoDArray<TColumn> {\n let result: TwoDArray<TColumn> = [];\n const cols = columns || [];\n let nextRow = [];\n\n if (cols && cols.length) {\n result.push(cols);\n\n for (const col of cols) {\n if (col.columns && col.columns.length) {\n nextRow = nextRow.concat(col.columns);\n }\n }\n\n if (nextRow.length) {\n result = result.concat(this.tabularFormat(nextRow));\n }\n }\n\n return result;\n }\n\n /**\n * Returns an array of leaf columns (last columns in the tree)\n *\n * @param columns\n */\n static leafColumns(columns: OneDArray<TColumn>): OneDArray<TColumn> {\n let result: OneDArray<TColumn> = [];\n const cols = columns || [];\n\n if (cols && cols.length) {\n for (const col of cols) {\n if (!col.columns || col.columns.length === 0) {\n result.push(col);\n }\n\n if (col.columns) {\n result = result.concat(this.leafColumns(col.columns));\n }\n }\n }\n\n return result;\n }\n\n /**\n * Returns the maximum depth of a column tree\n * @param column\n */\n static maximumDepth(column: TColumn): number {\n return this.tabularFormat([column]).length - 1;\n }\n}\n\nexport default Header;\n","const _prefix = 'ID_';\n\n/**\n * This class is mostly based on Flux's Dispatcher by Facebook\n * https://github.com/facebook/flux/blob/master/src/Dispatcher.js\n */\nexport default class Dispatcher<TPayload> {\n _callbacks: { [key: string]: (payload: TPayload) => void };\n _isDispatching: boolean;\n _isHandled: { [key: string]: boolean };\n _isPending: { [key: string]: boolean };\n _lastID: number;\n _pendingPayload: TPayload;\n\n constructor() {\n this._callbacks = {};\n this._isDispatching = false;\n this._isHandled = {};\n this._isPending = {};\n this._lastID = 1;\n }\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n */\n register(callback: (payload: TPayload) => void): string {\n const id = _prefix + this._lastID++;\n this._callbacks[id] = callback;\n return id;\n }\n /**\n * Removes a callback based on its token.\n */\n unregister(id: string): void {\n if (!this._callbacks[id]) {\n throw Error(\n `Dispatcher.unregister(...): ${id} does not map to a registered callback.`,\n );\n }\n\n delete this._callbacks[id];\n }\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n */\n waitFor(ids: Array<string>): void {\n if (!this._isDispatching) {\n throw Error(\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.',\n );\n }\n\n for (let ii = 0; ii < ids.length; ii++) {\n const id = ids[ii];\n if (this._isPending[id]) {\n if (!this._isHandled[id]) {\n throw Error(`Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for ${id}.`);\n }\n continue;\n }\n if (!this._callbacks[id]) {\n throw Error(\n `Dispatcher.waitFor(...): ${id} does not map to a registered callback.`,\n );\n }\n\n this._invokeCallback(id);\n }\n }\n /**\n * Dispatches a payload to all registered callbacks.\n */\n dispatch(payload: TPayload): void {\n if (this._isDispatching) {\n throw Error(\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.',\n );\n }\n\n this._startDispatching(payload);\n try {\n for (const id in this._callbacks) {\n if (this._isPending[id]) {\n continue;\n }\n this._invokeCallback(id);\n }\n } finally {\n this._stopDispatching();\n }\n }\n /**\n * Is this Dispatcher currently dispatching.\n */\n isDispatching(): boolean {\n return this._isDispatching;\n }\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @internal\n */\n private _invokeCallback(id: string): void {\n this._isPending[id] = true;\n this._callbacks[id](this._pendingPayload);\n this._isHandled[id] = true;\n }\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @internal\n */\n private _startDispatching(payload: TPayload): void {\n for (const id in this._callbacks) {\n this._isPending[id] = false;\n this._isHandled[id] = false;\n }\n this._pendingPayload = payload;\n this._isDispatching = true;\n }\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n private _stopDispatching(): void {\n delete this._pendingPayload;\n this._isDispatching = false;\n }\n}\n","/**\n * Base Storage class. All storage implementation must inherit this class\n */\nimport { TData } from '../types';\n\nabstract class Storage<I> {\n /**\n * Returns all rows based on ...args\n * @param args\n */\n abstract get(...args): Promise<StorageResponse>;\n\n /**\n * To set all rows\n *\n * @param data\n */\n set?(data: I | ((...args) => void)): this;\n}\n\nexport interface StorageResponse {\n data: TData;\n total: number;\n}\n\nexport default Storage;\n","import Storage, { StorageResponse } from './storage';\nimport { TData } from '../types';\n\nclass MemoryStorage extends Storage<TData> {\n private data: (() => TData) | (() => Promise<TData>);\n\n constructor(data: TData | (() => TData) | (() => Promise<TData>)) {\n super();\n this.set(data);\n }\n\n public async get(): Promise<StorageResponse> {\n const data = await this.data();\n\n return {\n data: data,\n total: data.length,\n };\n }\n\n public set(data: TData | (() => TData) | (() => Promise<TData>)): this {\n if (data instanceof Array) {\n this.data = (): TData => data;\n } else if (data instanceof Function) {\n this.data = data;\n }\n\n return this;\n }\n}\n\nexport default MemoryStorage;\n","import Storage, { StorageResponse } from './storage';\nimport log from '../util/log';\n\nexport interface ServerStorageOptions extends RequestInit {\n url: string;\n // to format the data and columns\n then?: (data: any) => any[][];\n // to handle the response from the server. `handle` will\n // be called first and then `then` callback will be invoked\n // The purpose of this function is to handle the behaviour\n // of server and either reject and resolve the initial response\n // before calling the `then` function\n handle?: (response: Response) => Promise<any>;\n total?: (data: any) => number;\n // to bypass the current implementation of ServerStorage and process the\n // request manually (e.g. when user wants to connect their own SDK/HTTP Client)\n data?: (opts: ServerStorageOptions) => Promise<StorageResponse>;\n}\n\nclass ServerStorage extends Storage<ServerStorageOptions> {\n private readonly options: ServerStorageOptions;\n\n constructor(options: ServerStorageOptions) {\n super();\n this.options = options;\n }\n\n private handler(response: Response): Promise<any> {\n if (typeof this.options.handle === 'function') {\n return this.options.handle(response);\n }\n\n if (response.ok) {\n return response.json();\n } else {\n log.error(\n `Could not fetch data: ${response.status} - ${response.statusText}`,\n true,\n );\n return null;\n }\n }\n\n public get(options?: ServerStorageOptions): Promise<StorageResponse> {\n // this.options is the initial config object\n // options is the runtime config passed by the pipeline (e.g. search component)\n const opts = {\n ...this.options,\n ...options,\n };\n\n // if `options.data` is provided, the current ServerStorage\n // implementation will be ignored and we let options.data to\n // handle the request. Useful when HTTP client needs to be\n // replaced with something else\n if (typeof opts.data === 'function') {\n return opts.data(opts);\n }\n\n return fetch(opts.url, opts)\n .then(this.handler.bind(this))\n .then((res) => {\n return {\n data: opts.then(res),\n total: typeof opts.total === 'function' ? opts.total(res) : undefined,\n };\n });\n }\n}\n\nexport default ServerStorage;\n","import { UserConfig } from '../config';\nimport MemoryStorage from './memory';\nimport Storage from './storage';\nimport ServerStorage from './server';\nimport log from '../util/log';\nimport { decode, html } from '../util/html';\n\nclass StorageUtils {\n /**\n * Accepts the userConfig dict and tries to guess and return a Storage type\n *\n * @param userConfig\n */\n public static createFromUserConfig(userConfig: UserConfig): Storage<any> {\n let storage = null;\n // `data` array is provided\n if (userConfig.data) {\n storage = new MemoryStorage(userConfig.data);\n }\n\n if (userConfig.from) {\n storage = new MemoryStorage(this.tableElementToArray(userConfig.from));\n // remove the source table element from the DOM\n userConfig.from.style.display = 'none';\n }\n\n if (userConfig.server) {\n storage = new ServerStorage(userConfig.server);\n }\n\n if (!storage) {\n log.error('Could not determine the storage type', true);\n }\n\n return storage;\n }\n\n /**\n * Accepts a HTML table element and converts it into a 2D array of data\n *\n * TODO: This function can be a step in the pipeline: Convert Table -> Load into a memory storage -> ...\n *\n * @param element\n */\n static tableElementToArray(element: HTMLElement): any[][] {\n const arr = [];\n const tbody = element.querySelector('tbody');\n const rows = tbody.querySelectorAll('tr');\n\n for (const row of rows as any) {\n const cells: HTMLElement[] = row.querySelectorAll('td');\n const parsedRow = [];\n\n for (const cell of cells) {\n // try to capture a TD with single text element first\n if (\n cell.childNodes.length === 1 &&\n cell.childNodes[0].nodeType === Node.TEXT_NODE\n ) {\n parsedRow.push(decode(cell.innerHTML));\n } else {\n parsedRow.push(html(cell.innerHTML));\n }\n }\n\n arr.push(parsedRow);\n }\n\n return arr;\n }\n}\n\nexport default StorageUtils;\n","import { PipelineProcessor, ProcessorType } from './processor';\nimport { ID } from '../util/id';\nimport log from '../util/log';\nimport { EventEmitter } from '../util/eventEmitter';\n\ninterface PipelineEvents<T> {\n /**\n * Generic updated event. Triggers the callback function when the pipeline\n * is updated, including when a new processor is registered, a processor's props\n * get updated, etc.\n */\n updated: (processor: PipelineProcessor<any, any>) => void;\n /**\n * Triggers the callback function when a new\n * processor is registered successfully\n */\n afterRegister: () => void;\n /**\n * Triggers the callback when a registered\n * processor's property is updated\n */\n propsUpdated: () => void;\n /**\n * Triggers the callback function when the pipeline\n * is fully processed, before returning the results\n *\n * afterProcess will not be called if there is an\n * error in the pipeline (i.e a step throw an Error)\n */\n afterProcess: (prev: T) => void;\n /**\n * Triggers the callback function when the pipeline\n * fails to process all steps or at least one step\n * throws an Error\n */\n error: (prev: T) => void;\n}\n\nclass Pipeline<T, P = unknown> extends EventEmitter<PipelineEvents<T>> {\n // available steps for this pipeline\n private readonly _steps: Map<ProcessorType, PipelineProcessor<T, P>[]> =\n new Map<ProcessorType, PipelineProcessor<T, P>[]>();\n // used to cache the results of processors using their id field\n private cache: Map<string, any> = new Map<string, any>();\n // keeps the index of the last updated processor in the registered\n // processors list and will be used to invalidate the cache\n // -1 means all new processors should be processed\n private lastProcessorIndexUpdated = -1;\n\n constructor(steps?: PipelineProcessor<any, any>[]) {\n super();\n\n if (steps) {\n steps.forEach((step) => this.register(step));\n }\n }\n\n /**\n * Clears the `cache` array\n */\n clearCache(): void {\n this.cache = new Map<string, any>();\n this.lastProcessorIndexUpdated = -1;\n }\n\n /**\n * Registers a new processor\n *\n * @param processor\n * @param priority\n */\n register(\n processor: PipelineProcessor<any, any>,\n priority: number = null,\n ): void {\n if (processor.type === null) {\n throw Error('Processor type is not defined');\n }\n\n // binding the propsUpdated callback to the Pipeline\n processor.on('propsUpdated', this.processorPropsUpdated.bind(this));\n\n this.addProcessorByPriority(processor, priority);\n this.afterRegistered(processor);\n }\n\n /**\n * Removes a processor from the list\n *\n * @param processor\n */\n unregister(processor: PipelineProcessor<any, any>): void {\n if (!processor) return;\n\n const subSteps = this._steps.get(processor.type);\n\n if (subSteps && subSteps.length) {\n this._steps.set(\n processor.type,\n subSteps.filter((proc) => proc != processor),\n );\n this.emit('updated', processor);\n }\n }\n\n /**\n * Registers a new processor\n *\n * @param processor\n * @param priority\n */\n private addProcessorByPriority(\n processor: PipelineProcessor<T, P>,\n priority: number,\n ): void {\n let subSteps = this._steps.get(processor.type);\n\n if (!subSteps) {\n const newSubStep = [];\n this._steps.set(processor.type, newSubStep);\n subSteps = newSubStep;\n }\n\n if (priority === null || priority < 0) {\n subSteps.push(processor);\n } else {\n if (!subSteps[priority]) {\n // slot is empty\n subSteps[priority] = processor;\n } else {\n // slot is NOT empty\n const first = subSteps.slice(0, priority - 1);\n const second = subSteps.slice(priority + 1);\n\n this._steps.set(processor.type, first.concat(processor).concat(second));\n }\n }\n }\n\n /**\n * Flattens the _steps Map and returns a list of steps with their correct priorities\n */\n get steps(): PipelineProcessor<T, P>[] {\n let steps: PipelineProcessor<T, P>[] = [];\n\n for (const type of this.getSortedProcessorTypes()) {\n const subSteps = this._steps.get(type);\n\n if (subSteps && subSteps.length) {\n steps = steps.concat(subSteps);\n }\n }\n\n // to remove any undefined elements\n return steps.filter((s) => s);\n }\n\n /**\n * Accepts ProcessType and returns an array of the registered processes\n * with the give type\n *\n * @param type\n */\n getStepsByType(type: ProcessorType): PipelineProcessor<T, P>[] {\n return this.steps.filter((process) => process.type === type);\n }\n\n /**\n * Returns a list of ProcessorType according to their priority\n */\n private getSortedProcessorTypes(): ProcessorType[] {\n return Object.keys(ProcessorType)\n .filter((key) => !isNaN(Number(key)))\n .map((key) => Number(key));\n }\n\n /**\n * Runs all registered processors based on their correct priority\n * and returns the final output after running all steps\n *\n * @param data\n */\n async process(data?: T): Promise<T> {\n const lastProcessorIndexUpdated = this.lastProcessorIndexUpdated;\n const steps = this.steps;\n\n let prev = data;\n\n try {\n for (const processor of steps) {\n const processorIndex = this.findProcessorIndexByID(processor.id);\n\n if (processorIndex >= lastProcessorIndexUpdated) {\n // we should execute process() here since the last\n // updated processor was before \"processor\".\n // This is to ensure that we always have correct and up to date\n // data from processors and also to skip them when necessary\n prev = await processor.process(prev);\n this.cache.set(processor.id, prev);\n } else {\n // cached results already exist\n prev = this.cache.get(processor.id);\n }\n }\n } catch (e) {\n log.error(e);\n // trigger the onError callback\n this.emit('error', prev);\n\n // rethrow\n throw e;\n }\n\n // means the pipeline is up to date\n this.lastProcessorIndexUpdated = steps.length;\n\n // triggers the afterProcess callbacks with the results\n this.emit('afterProcess', prev);\n\n return prev;\n }\n\n /**\n * Returns the registered processor's index in _steps array\n *\n * @param processorID\n */\n private findProcessorIndexByID(processorID: ID): number {\n return this.steps.findIndex((p) => p.id == processorID);\n }\n\n /**\n * Sets the last updates processors index locally\n * This is used to invalid or skip a processor in\n * the process() method\n */\n private setLastProcessorIndex(processor: PipelineProcessor<T, P>): void {\n const processorIndex = this.findProcessorIndexByID(processor.id);\n\n if (this.lastProcessorIndexUpdated > processorIndex) {\n this.lastProcessorIndexUpdated = processorIndex;\n }\n }\n\n private processorPropsUpdated(processor): void {\n this.setLastProcessorIndex(processor);\n this.emit('propsUpdated');\n this.emit('updated', processor);\n }\n\n private afterRegistered(processor): void {\n this.setLastProcessorIndex(processor);\n this.emit('afterRegister');\n this.emit('updated', processor);\n }\n}\n\nexport default Pipeline;\n","import { ComponentChild } from 'preact';\nimport Row from './row';\nimport { SortConfig } from './view/plugin/sort/sort';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { Plugin } from './plugin';\n\nexport type ProtoExtends<T, U> = U & Omit<T, keyof U>;\n\nexport type OneDArray<T> = T[];\nexport type TwoDArray<T> = T[][];\n\n/**\n * Table cell types\n */\nexport type TCell = number | string | boolean | ComponentChild | HTMLElement;\n// Array of Arrays\nexport type TDataArrayRow = OneDArray<TCell>;\nexport type TDataArray = OneDArray<TDataArrayRow>;\n// Array of Objects\nexport type TDataObjectRow = { [key: string]: TCell };\nexport type TDataObject = OneDArray<TDataObjectRow>;\n// (Array of Arrays) and (Array of Objects)\nexport type TData = TDataArray | TDataObject;\n\n// Table header cell type\nexport interface TColumn {\n id?: string;\n // default data for all columns\n data?: ((row: TDataArrayRow | TDataObjectRow) => TCell) | TCell;\n // column label\n name?: string | ComponentChild;\n plugin?: Plugin<any>;\n // column width\n width?: string;\n minWidth?: string;\n sort?: SortConfig;\n columns?: OneDArray<TColumn>;\n fixedHeader?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n formatter?: (cell: TCell, row: Row, column: TColumn) => ComponentChild;\n // HTML attributes to be added to all cells and header of this column\n attributes?:\n | ((\n // this is null when `attributes` is called for a th\n cell: TCell | null,\n row: Row | null,\n column: TColumn,\n ) => JSXInternal.HTMLAttributes<HTMLTableCellElement>)\n | JSXInternal.HTMLAttributes<HTMLTableCellElement>;\n}\n\n// Comparator function for the sorting plugin\nexport type Comparator<T> = (a: T, b: T) => number;\n\nexport interface TColumnSort {\n index: number;\n // 1 ascending, -1 descending\n direction?: 1 | -1;\n}\n\n// container status\nexport enum Status {\n Init,\n Loading,\n Loaded,\n Rendered,\n Error,\n}\n\nexport type CSSDeclaration = {\n [key: string]: string | number;\n};\n","import Storage, { StorageResponse } from '../../storage/storage';\nimport {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\n\ninterface StorageExtractorProps extends PipelineProcessorProps {\n storage: Storage<any>;\n}\n\nclass StorageExtractor extends PipelineProcessor<\n Promise<StorageResponse>,\n StorageExtractorProps\n> {\n get type(): ProcessorType {\n return ProcessorType.Extractor;\n }\n\n async _process(opts: any): Promise<StorageResponse> {\n return await this.props.storage.get(opts);\n }\n}\n\nexport default StorageExtractor;\n","import { PipelineProcessor, ProcessorType } from '../processor';\nimport Tabular from '../../tabular';\nimport { ArrayResponse } from './storageResponseToArray';\n\nclass ArrayToTabularTransformer extends PipelineProcessor<\n Tabular,\n Record<string, any>\n> {\n get type(): ProcessorType {\n return ProcessorType.Transformer;\n }\n\n _process(arrayResponse: ArrayResponse): Tabular {\n const tabular = Tabular.fromArray(arrayResponse.data);\n\n // for server-side storage\n tabular.length = arrayResponse.total;\n\n return tabular;\n }\n}\n\nexport default ArrayToTabularTransformer;\n","import {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\n\ninterface ServerInitiatorProps extends PipelineProcessorProps {\n serverStorageOptions: ServerStorageOptions;\n}\n\nclass ServerInitiator extends PipelineProcessor<\n ServerStorageOptions,\n ServerInitiatorProps\n> {\n get type(): ProcessorType {\n return ProcessorType.Initiator;\n }\n\n _process(): ServerStorageOptions {\n return Object.entries(this.props.serverStorageOptions)\n .filter(([_, val]) => typeof val !== 'function')\n .reduce(\n (acc, [k, v]) => ({ ...acc, [k]: v }),\n {},\n ) as ServerStorageOptions;\n }\n}\n\nexport default ServerInitiator;\n","import {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { StorageResponse } from '../../storage/storage';\nimport { TCell, TData, TDataArray, TDataObject, TwoDArray } from '../../types';\nimport Header from '../../header';\nimport logger from '../../util/log';\n\nexport interface ArrayResponse {\n data: TwoDArray<TCell>;\n total: number;\n}\n\ninterface StorageResponseToArrayTransformerProps\n extends PipelineProcessorProps {\n header: Header;\n}\n\nclass StorageResponseToArrayTransformer extends PipelineProcessor<\n ArrayResponse,\n StorageResponseToArrayTransformerProps\n> {\n get type(): ProcessorType {\n return ProcessorType.Transformer;\n }\n\n private castData(data: TData): TwoDArray<TCell> {\n if (!data || !data.length) {\n return [];\n }\n\n if (!this.props.header || !this.props.header.columns) {\n return data as TwoDArray<TCell>;\n }\n\n const columns = Header.leafColumns(this.props.header.columns);\n\n // if it's a 2d array already\n if (data[0] instanceof Array) {\n return (data as TDataArray).map((row) => {\n let pad = 0;\n\n return columns.map((column, i) => {\n // default `data` is provided for this column\n if (column.data !== undefined) {\n pad++;\n\n if (typeof column.data === 'function') {\n return column.data(row);\n } else {\n return column.data;\n }\n }\n\n return row[i - pad];\n });\n });\n }\n\n // if it's an array of objects (but not array of arrays, i.e JSON payload)\n if (typeof data[0] === 'object' && !(data[0] instanceof Array)) {\n return (data as TDataObject).map((row) =>\n columns.map((column, i) => {\n if (column.data !== undefined) {\n if (typeof column.data === 'function') {\n return column.data(row);\n } else {\n return column.data;\n }\n } else if (column.id) {\n return row[column.id];\n } else {\n logger.error(`Could not find the correct cell for column at position ${i}.\n Make sure either 'id' or 'selector' is defined for all columns.`);\n return null;\n }\n }),\n );\n }\n\n return [];\n }\n\n _process(storageResponse: StorageResponse): ArrayResponse {\n return {\n data: this.castData(storageResponse.data),\n total: storageResponse.total,\n };\n }\n}\n\nexport default StorageResponseToArrayTransformer;\n","import { Config } from '../config';\nimport Pipeline from './pipeline';\nimport Tabular from '../tabular';\nimport StorageExtractor from './extractor/storage';\nimport ArrayToTabularTransformer from './transformer/arrayToTabular';\nimport ServerStorage from '../storage/server';\nimport ServerInitiator from './initiator/server';\nimport StorageResponseToArrayTransformer from './transformer/storageResponseToArray';\n\nclass PipelineUtils {\n static createFromConfig(config: Config): Pipeline<Tabular> {\n const pipeline = new Pipeline<Tabular>();\n\n if (config.storage instanceof ServerStorage) {\n pipeline.register(\n new ServerInitiator({\n serverStorageOptions: config.server,\n }),\n );\n }\n\n pipeline.register(new StorageExtractor({ storage: config.storage }));\n pipeline.register(\n new StorageResponseToArrayTransformer({ header: config.header }),\n );\n pipeline.register(new ArrayToTabularTransformer());\n\n return pipeline;\n }\n}\n\nexport default PipelineUtils;\n","import {\n CSSDeclaration,\n OneDArray,\n ProtoExtends,\n TColumn,\n TData,\n} from './types';\nimport Storage from './storage/storage';\nimport Pipeline from './pipeline/pipeline';\nimport Tabular from './tabular';\nimport { Search, SearchConfig } from './view/plugin/search/search';\nimport { Pagination, PaginationConfig } from './view/plugin/pagination';\nimport Header from './header';\nimport { ServerStorageOptions } from './storage/server';\nimport Dispatcher from './util/dispatcher';\nimport { GenericSortConfig } from './view/plugin/sort/sort';\nimport { Language, Translator } from './i18n/language';\nimport { Component, ComponentChild, createRef, RefObject } from 'preact';\nimport StorageUtils from './storage/storageUtils';\nimport PipelineUtils from './pipeline/pipelineUtils';\nimport { EventEmitter } from './util/eventEmitter';\nimport { GridEvents } from './events';\nimport { PluginManager, PluginPosition, Plugin } from './plugin';\nimport Grid from './grid';\n\n// Config type used internally\nexport interface Config {\n // a reference to the current Grid.js instance\n instance: Grid;\n eventEmitter: EventEmitter<GridEvents>;\n dispatcher: Dispatcher<any>;\n plugin: PluginManager;\n /** container element that is used to mount the Grid.js to */\n // TODO: change this to an element reference\n container?: Element;\n /** pointer to the main table element */\n tableRef?: RefObject<Component>;\n /** gridjs-temp div which is used internally */\n tempRef?: RefObject<HTMLDivElement>;\n data?: TData | (() => TData) | (() => Promise<TData>);\n server?: ServerStorageOptions;\n header?: Header;\n /** to parse a HTML table and load the data */\n from: HTMLElement;\n storage: Storage<any>;\n pipeline: Pipeline<Tabular>;\n /** to automatically calculate the columns width */\n autoWidth: boolean;\n /** sets the width of the container and table */\n width: string;\n /** sets the height of the table */\n height: string;\n pagination: PaginationConfig;\n sort: GenericSortConfig;\n translator: Translator;\n style?: Partial<{\n table: CSSDeclaration;\n td: CSSDeclaration;\n th: CSSDeclaration;\n container: CSSDeclaration;\n header: CSSDeclaration;\n footer: CSSDeclaration;\n }>;\n className?: Partial<{\n table: string;\n th: string;\n thead: string;\n tbody: string;\n tr: string;\n td: string;\n container: string;\n footer: string;\n header: string;\n search: string;\n sort: string;\n pagination: string;\n paginationSummary: string;\n paginationButton: string;\n paginationButtonNext: string;\n paginationButtonCurrent: string;\n paginationButtonPrev: string;\n loading: string;\n notfound: string;\n error: string;\n }>;\n}\n\n// Config type used by the consumers\ninterface UserConfigExtend {\n /** fixes the table header to the top of the table */\n fixedHeader: boolean;\n /** Resizable columns? */\n resizable: boolean;\n columns: OneDArray<TColumn | string | ComponentChild>;\n search: SearchConfig | boolean;\n pagination: PaginationConfig | boolean;\n // implicit option to enable the sort plugin globally\n sort: GenericSortConfig | boolean;\n language: Language;\n plugins?: Plugin<any>[];\n}\n\nexport type UserConfig = ProtoExtends<\n Partial<Config>,\n Partial<UserConfigExtend>\n>;\n\nexport class Config {\n // this is the config file passed by the user\n // we need this for Config.update()\n private _userConfig: UserConfig;\n\n constructor(config?: Partial<Config>) {\n Object.assign(this, {\n ...Config.defaultConfig(),\n ...config,\n });\n\n this._userConfig = {};\n }\n\n /**\n * Assigns `updatedConfig` keys to the current config file\n *\n * @param updatedConfig\n */\n assign(updatedConfig: Partial<Config>): Config {\n for (const key of Object.keys(updatedConfig)) {\n // because we don't want to update the _userConfig cache\n if (key === '_userConfig') continue;\n\n this[key] = updatedConfig[key];\n }\n\n return this;\n }\n\n /**\n * Updates the config from a UserConfig\n *\n * @param userConfig\n */\n update(userConfig: Partial<UserConfig>): Config {\n if (!userConfig) return this;\n\n this._userConfig = {\n ...this._userConfig,\n ...userConfig,\n };\n\n this.assign(Config.fromUserConfig(this._userConfig));\n\n return this;\n }\n\n static defaultConfig(): Config {\n return {\n plugin: new PluginManager(),\n dispatcher: new Dispatcher<any>(),\n tableRef: createRef(),\n tempRef: createRef(),\n width: '100%',\n height: 'auto',\n autoWidth: true,\n style: {},\n className: {},\n } as Config;\n }\n\n static fromUserConfig(userConfig: UserConfig): Config {\n const config = new Config(userConfig as Config);\n\n // to set the initial _userConfig object\n config._userConfig = userConfig;\n\n // Sort\n if (typeof userConfig.sort === 'boolean' && userConfig.sort) {\n config.assign({\n sort: {\n multiColumn: true,\n },\n });\n }\n\n // Header\n config.assign({\n header: Header.fromUserConfig(config),\n });\n\n config.assign({\n storage: StorageUtils.createFromUserConfig(userConfig),\n });\n\n config.assign({\n pipeline: PipelineUtils.createFromConfig(config),\n });\n\n // Translator\n config.assign({\n translator: new Translator(userConfig.language),\n });\n\n // Search\n config.plugin.add({\n id: 'search',\n position: PluginPosition.Header,\n component: Search,\n props: {\n enabled:\n userConfig.search === true || userConfig.search instanceof Object,\n ...(userConfig.search as SearchConfig),\n },\n });\n\n // Pagination\n config.plugin.add({\n id: 'pagination',\n position: PluginPosition.Footer,\n component: Pagination,\n props: {\n enabled:\n userConfig.pagination === true ||\n userConfig.pagination instanceof Object,\n ...(userConfig.pagination as PaginationConfig),\n },\n });\n\n // Additional plugins\n if (userConfig.plugins) {\n userConfig.plugins.forEach((p) => config.plugin.add(p));\n }\n\n return config;\n }\n}\n","import{options as n}from\"preact\";var t,u,r,o=0,i=[],c=n.__b,f=n.__r,e=n.diffed,a=n.__c,v=n.unmount;function m(t,r){n.__h&&n.__h(u,t,o||r),o=0;var i=u.__H||(u.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({}),i.__[t]}function l(n){return o=1,p(w,n)}function p(n,r,o){var i=m(t++,2);return i.t=n,i.__c||(i.__=[o?o(r):w(void 0,r),function(n){var t=i.t(i.__[0],n);i.__[0]!==t&&(i.__=[t,i.__[1]],i.__c.setState({}))}],i.__c=u),i.__}function y(r,o){var i=m(t++,3);!n.__s&&k(i.__H,o)&&(i.__=r,i.__H=o,u.__H.__h.push(i))}function h(r,o){var i=m(t++,4);!n.__s&&k(i.__H,o)&&(i.__=r,i.__H=o,u.__h.push(i))}function s(n){return o=5,d(function(){return{current:n}},[])}function _(n,t,u){o=6,h(function(){\"function\"==typeof n?n(t()):n&&(n.current=t())},null==u?u:u.concat(n))}function d(n,u){var r=m(t++,7);return k(r.__H,u)&&(r.__=n(),r.__H=u,r.__h=n),r.__}function A(n,t){return o=8,d(function(){return n},t)}function F(n){var r=u.context[n.__c],o=m(t++,9);return o.__c=n,r?(null==o.__&&(o.__=!0,r.sub(u)),r.props.value):n.__}function T(t,u){n.useDebugValue&&n.useDebugValue(u?u(t):t)}function q(n){var r=m(t++,10),o=l();return r.__=n,u.componentDidCatch||(u.componentDidCatch=function(n){r.__&&r.__(n),o[1](n)}),[o[0],function(){o[1](void 0)}]}function x(){i.forEach(function(t){if(t.__P)try{t.__H.__h.forEach(g),t.__H.__h.forEach(j),t.__H.__h=[]}catch(u){t.__H.__h=[],n.__e(u,t.__v)}}),i=[]}n.__b=function(n){u=null,c&&c(n)},n.__r=function(n){f&&f(n),t=0;var r=(u=n.__c).__H;r&&(r.__h.forEach(g),r.__h.forEach(j),r.__h=[])},n.diffed=function(t){e&&e(t);var o=t.__c;o&&o.__H&&o.__H.__h.length&&(1!==i.push(o)&&r===n.requestAnimationFrame||((r=n.requestAnimationFrame)||function(n){var t,u=function(){clearTimeout(r),b&&cancelAnimationFrame(t),setTimeout(n)},r=setTimeout(u,100);b&&(t=requestAnimationFrame(u))})(x)),u=void 0},n.__c=function(t,u){u.some(function(t){try{t.__h.forEach(g),t.__h=t.__h.filter(function(n){return!n.__||j(n)})}catch(r){u.some(function(n){n.__h&&(n.__h=[])}),u=[],n.__e(r,t.__v)}}),a&&a(t,u)},n.unmount=function(t){v&&v(t);var u=t.__c;if(u&&u.__H)try{u.__H.__.forEach(g)}catch(t){n.__e(t,u.__v)}};var b=\"function\"==typeof requestAnimationFrame;function g(n){var t=u;\"function\"==typeof n.__c&&n.__c(),u=t}function j(n){var t=u;n.__c=n.__(),u=t}function k(n,t){return!n||n.length!==t.length||t.some(function(t,u){return t!==n[u]})}function w(n,t){return\"function\"==typeof t?t(n):t}export{l as useState,p as useReducer,y as useEffect,h as useLayoutEffect,s as useRef,_ as useImperativeHandle,d as useMemo,A as useCallback,F as useContext,T as useDebugValue,q as useErrorBoundary};\n//# sourceMappingURL=hooks.module.js.map\n","import { ComponentChild, h, JSX } from 'preact';\n\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { CSSDeclaration, TColumn } from '../../types';\nimport Row from '../../row';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { PluginRenderer } from '../../plugin';\n\nexport interface TDProps\n extends BaseProps,\n JSX.HTMLAttributes<HTMLTableCellElement> {\n cell: Cell;\n row?: Row;\n column?: TColumn;\n style?: CSSDeclaration;\n messageCell?: boolean;\n}\n\nexport class TD extends BaseComponent<TDProps> {\n private content(): ComponentChild {\n if (\n this.props.column &&\n typeof this.props.column.formatter === 'function'\n ) {\n return this.props.column.formatter(\n this.props.cell.data,\n this.props.row,\n this.props.column,\n );\n }\n\n if (this.props.column && this.props.column.plugin) {\n return (\n <PluginRenderer\n pluginId={this.props.column.id}\n props={{\n column: this.props.column,\n cell: this.props.cell,\n row: this.props.row,\n }}\n />\n );\n }\n\n return this.props.cell.data;\n }\n\n private handleClick(e: JSX.TargetedMouseEvent<HTMLTableCellElement>): void {\n if (this.props.messageCell) return;\n this.config.eventEmitter.emit(\n 'cellClick',\n e,\n this.props.cell,\n this.props.column,\n this.props.row,\n );\n }\n\n private getCustomAttributes(\n column: TColumn | null,\n ): JSXInternal.HTMLAttributes<HTMLTableCellElement> {\n if (!column) return {};\n\n if (typeof column.attributes === 'function') {\n return column.attributes(\n this.props.cell.data,\n this.props.row,\n this.props.column,\n );\n } else {\n return column.attributes;\n }\n }\n\n render() {\n return (\n <td\n role={this.props.role}\n colSpan={this.props.colSpan}\n data-column-id={this.props.column && this.props.column.id}\n className={classJoin(\n className('td'),\n this.props.className,\n this.config.className.td,\n )}\n style={{\n ...this.props.style,\n ...this.config.style.td,\n }}\n onClick={this.handleClick.bind(this)}\n {...this.getCustomAttributes(this.props.column)}\n >\n {this.content()}\n </td>\n );\n }\n}\n","import { h, JSX, Fragment, ComponentChildren } from 'preact';\n\nimport Row from '../../row';\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { TColumn } from '../../types';\nimport { TD } from './td';\nimport Header from '../../header';\n\nexport interface TRProps extends BaseProps {\n row?: Row;\n header?: Header;\n messageRow?: boolean;\n}\n\nexport class TR extends BaseComponent<TRProps> {\n private getColumn(cellIndex: number): TColumn {\n if (this.props.header) {\n const cols = Header.leafColumns(this.props.header.columns);\n\n if (cols) {\n return cols[cellIndex];\n }\n }\n\n return null;\n }\n\n private handleClick(e: JSX.TargetedMouseEvent<HTMLTableRowElement>): void {\n if (this.props.messageRow) return;\n this.config.eventEmitter.emit('rowClick', e, this.props.row);\n }\n\n private getChildren(): ComponentChildren {\n if (this.props.children) {\n return this.props.children;\n } else {\n return (\n <Fragment>\n {this.props.row.cells.map((cell: Cell, i) => {\n const column = this.getColumn(i);\n\n if (column && column.hidden) return null;\n\n return (\n <TD\n key={cell.id}\n cell={cell}\n row={this.props.row}\n column={column}\n />\n );\n })}\n </Fragment>\n );\n }\n }\n\n render() {\n return (\n <tr\n className={classJoin(className('tr'), this.config.className.tr)}\n onClick={this.handleClick.bind(this)}\n >\n {this.getChildren()}\n </tr>\n );\n }\n}\n","import { h } from 'preact';\n\nimport Cell from '../../cell';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { TR } from './tr';\nimport { TD } from './td';\n\nexport interface MessageRowProps extends BaseProps {\n message: string;\n colSpan?: number;\n className?: string;\n}\n\nexport class MessageRow extends BaseComponent<MessageRowProps> {\n render() {\n return (\n <TR messageRow={true}>\n <TD\n role=\"alert\"\n colSpan={this.props.colSpan}\n messageCell={true}\n cell={new Cell(this.props.message)}\n className={classJoin(\n className('message'),\n this.props.className ? this.props.className : null,\n )}\n />\n </TR>\n );\n }\n}\n","import { h } from 'preact';\n\nimport Row from '../../row';\nimport { TR } from './tr';\nimport Tabular from '../../tabular';\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { Status } from '../../types';\nimport Header from '../../header';\nimport { MessageRow } from './messageRow';\n\ninterface TBodyProps extends BaseProps {\n data: Tabular;\n status: Status;\n header?: Header;\n}\n\nexport class TBody extends BaseComponent<TBodyProps> {\n private headerLength(): number {\n if (this.props.header) {\n return this.props.header.visibleColumns.length;\n }\n return 0;\n }\n\n render() {\n return (\n <tbody\n className={classJoin(className('tbody'), this.config.className.tbody)}\n >\n {this.props.data &&\n this.props.data.rows.map((row: Row) => {\n return <TR key={row.id} row={row} header={this.props.header} />;\n })}\n\n {this.props.status === Status.Loading &&\n (!this.props.data || this.props.data.length === 0) && (\n <MessageRow\n message={this._('loading')}\n colSpan={this.headerLength()}\n className={classJoin(\n className('loading'),\n this.config.className.loading,\n )}\n />\n )}\n\n {this.props.status === Status.Rendered &&\n this.props.data &&\n this.props.data.length === 0 && (\n <MessageRow\n message={this._('noRecordsFound')}\n colSpan={this.headerLength()}\n className={classJoin(\n className('notfound'),\n this.config.className.notfound,\n )}\n />\n )}\n\n {this.props.status === Status.Error && (\n <MessageRow\n message={this._('error')}\n colSpan={this.headerLength()}\n className={classJoin(\n className('error'),\n this.config.className.error,\n )}\n />\n )}\n </tbody>\n );\n }\n}\n","import { Comparator, TCell } from '../../types';\nimport Tabular from '../../tabular';\nimport {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport Row from '../../row';\nimport log from '../../util/log';\n\ninterface NativeSortProps extends PipelineProcessorProps {\n columns: {\n index: number;\n // 1 ascending, -1 descending\n direction?: 1 | -1;\n compare?: Comparator<TCell>;\n }[];\n}\n\nclass NativeSort extends PipelineProcessor<Tabular, NativeSortProps> {\n protected validateProps(): void {\n for (const condition of this.props.columns) {\n if (condition.direction === undefined) {\n condition.direction = 1;\n }\n\n if (condition.direction !== 1 && condition.direction !== -1) {\n log.error(`Invalid sort direction ${condition.direction}`);\n }\n }\n }\n\n get type(): ProcessorType {\n return ProcessorType.Sort;\n }\n\n private compare(cellA: TCell, cellB: TCell): number {\n if (cellA > cellB) {\n return 1;\n } else if (cellA < cellB) {\n return -1;\n }\n\n return 0;\n }\n\n private compareWrapper(a: Row, b: Row): number {\n let cmp = 0;\n\n for (const column of this.props.columns) {\n if (cmp === 0) {\n const cellA = a.cells[column.index].data;\n const cellB = b.cells[column.index].data;\n\n if (typeof column.compare === 'function') {\n cmp |= column.compare(cellA, cellB) * column.direction;\n } else {\n cmp |= this.compare(cellA, cellB) * column.direction;\n }\n } else {\n break;\n }\n }\n\n return cmp;\n }\n\n protected _process(data: Tabular): Tabular {\n const sortedRows = [...data.rows];\n sortedRows.sort(this.compareWrapper.bind(this));\n\n const sorted = new Tabular(sortedRows);\n // we have to set the tabular length manually\n // because of the server-side storage\n sorted.length = data.length;\n\n return sorted;\n }\n}\n\nexport default NativeSort;\n","import BaseStore from '../../base/store';\nimport { SortActionsType } from './actions';\nimport { Comparator, TCell } from '../../../types';\n\nexport type SortStoreState = {\n index: number;\n direction: 1 | -1;\n compare?: Comparator<TCell>;\n}[];\n\nexport class SortStore extends BaseStore<SortStoreState, SortActionsType> {\n getInitialState(): SortStoreState {\n return [];\n }\n\n handle(type, payload): void {\n if (type === 'SORT_COLUMN') {\n const { index, direction, multi, compare } = payload;\n this.sortColumn(index, direction, multi, compare);\n } else if (type === 'SORT_COLUMN_TOGGLE') {\n const { index, multi, compare } = payload;\n this.sortToggle(index, multi, compare);\n }\n }\n\n private sortToggle(\n index: number,\n multi: boolean,\n compare: Comparator<TCell>,\n ): void {\n const columns = [...this.state];\n const column = columns.find((x) => x.index === index);\n\n if (!column) {\n this.sortColumn(index, 1, multi, compare);\n } else {\n this.sortColumn(index, column.direction === 1 ? -1 : 1, multi, compare);\n }\n }\n\n private sortColumn(\n index: number,\n direction: 1 | -1,\n multi: boolean,\n compare: Comparator<TCell>,\n ): void {\n let columns = [...this.state];\n const count = columns.length;\n const column = columns.find((x) => x.index === index);\n const exists = column !== undefined;\n\n let add = false;\n let reset = false;\n let remove = false;\n let update = false;\n\n if (!exists) {\n // the column has not been sorted\n if (count === 0) {\n // the first column to be sorted\n add = true;\n } else if (count > 0 && !multi) {\n // remove the previously sorted column\n // and sort the current column\n add = true;\n reset = true;\n } else if (count > 0 && multi) {\n // multi-sorting\n // sort this column as well\n add = true;\n }\n } else {\n // the column has been sorted before\n if (!multi) {\n // single column sorting\n if (count === 1) {\n update = true;\n } else if (count > 1) {\n // this situation happens when we have already entered\n // multi-sorting mode but then user tries to sort a single column\n reset = true;\n add = true;\n }\n } else {\n // multi sorting\n if (column.direction === -1) {\n // remove the current column from the\n // sorted columns array\n remove = true;\n } else {\n update = true;\n }\n }\n }\n\n if (reset) {\n // resetting the sorted columns\n columns = [];\n }\n\n if (add) {\n columns.push({\n index: index,\n direction: direction,\n compare: compare,\n });\n } else if (update) {\n const index = columns.indexOf(column);\n columns[index].direction = direction;\n } else if (remove) {\n const index = columns.indexOf(column);\n columns.splice(index, 1);\n }\n\n this.setState(columns);\n }\n}\n","import { BaseActions } from '../../base/actions';\nimport { Comparator, TCell } from '../../../types';\n\nexport interface SortActionsType {\n SORT_COLUMN: {\n index: number;\n direction: 1 | -1;\n multi?: boolean;\n compare?: Comparator<TCell>;\n };\n\n SORT_COLUMN_TOGGLE: {\n index: number;\n multi?: boolean;\n compare?: Comparator<TCell>;\n };\n}\n\nexport class SortActions extends BaseActions<SortActionsType> {\n sortColumn(\n index: number,\n direction: 1 | -1,\n multi?: boolean,\n compare?: Comparator<TCell>,\n ): void {\n this.dispatch('SORT_COLUMN', {\n index: index,\n direction: direction,\n multi: multi,\n compare: compare,\n });\n }\n\n sortToggle(\n index: number,\n multi?: boolean,\n compare?: Comparator<TCell>,\n ): void {\n this.dispatch('SORT_COLUMN_TOGGLE', {\n index: index,\n multi: multi,\n compare: compare,\n });\n }\n}\n","import {\n PipelineProcessor,\n PipelineProcessorProps,\n ProcessorType,\n} from '../processor';\nimport { ServerStorageOptions } from '../../storage/server';\nimport { TColumnSort } from '../../types';\n\ninterface ServerSortProps extends PipelineProcessorProps {\n columns: TColumnSort[];\n url?: (prevUrl: string, columns: TColumnSort[]) => string;\n body?: (prevBody: BodyInit, columns: TColumnSort[]) => BodyInit;\n}\n\nclass ServerSort extends PipelineProcessor<\n ServerStorageOptions,\n ServerSortProps\n> {\n get type(): ProcessorType {\n return ProcessorType.ServerSort;\n }\n\n _process(options?: ServerStorageOptions): ServerStorageOptions {\n const updates = {};\n\n if (this.props.url) {\n updates['url'] = this.props.url(options.url, this.props.columns);\n }\n\n if (this.props.body) {\n updates['body'] = this.props.body(options.body, this.props.columns);\n }\n\n return {\n ...options,\n ...updates,\n };\n }\n}\n\nexport default ServerSort;\n","import { h, JSX } from 'preact';\n\nimport { BaseComponent, BaseProps } from '../../base';\nimport { classJoin, className } from '../../../util/className';\nimport { ProcessorType } from '../../../pipeline/processor';\nimport NativeSort from '../../../pipeline/sort/native';\nimport { SortStore, SortStoreState } from './store';\nimport { Comparator, TCell, TColumnSort } from '../../../types';\nimport { SortActions } from './actions';\nimport ServerSort from '../../../pipeline/sort/server';\n\n// column specific config\nexport interface SortConfig {\n enabled?: boolean;\n compare?: Comparator<TCell>;\n}\n\n// generic sort config:\n//\n// Config {\n// sort: GenericSortConfig\n// }\n//\nexport interface GenericSortConfig {\n multiColumn?: boolean;\n server?: {\n url?: (prevUrl: string, columns: TColumnSort[]) => string;\n body?: (prevBody: BodyInit, columns: TColumnSort[]) => BodyInit;\n };\n}\n\nexport interface SortProps extends BaseProps {\n // column index\n index: number;\n}\n\ninterface SortState {\n direction: 1 | -1 | 0;\n}\n\nexport class Sort extends BaseComponent<SortProps & SortConfig, SortState> {\n private readonly sortProcessor: NativeSort | ServerSort;\n private readonly actions: SortActions;\n private readonly store: SortStore;\n private readonly updateStateFn: (...args) => void;\n private updateSortProcessorFn: (sortedColumns: SortStoreState) => void;\n\n constructor(props: SortProps & SortConfig, context) {\n super(props, context);\n\n this.actions = new SortActions(this.config.dispatcher);\n this.store = new SortStore(this.config.dispatcher);\n\n if (props.enabled) {\n this.sortProcessor = this.getOrCreateSortProcessor();\n this.updateStateFn = this.updateState.bind(this);\n this.store.on('updated', this.updateStateFn);\n this.state = { direction: 0 };\n }\n }\n\n componentWillUnmount(): void {\n this.config.pipeline.unregister(this.sortProcessor);\n\n this.store.off('updated', this.updateStateFn);\n if (this.updateSortProcessorFn)\n this.store.off('updated', this.updateSortProcessorFn);\n }\n\n /**\n * Sets the internal state of component\n */\n private updateState(): void {\n const currentColumn = this.store.state.find(\n (x) => x.index === this.props.index,\n );\n\n if (!currentColumn) {\n this.setState({\n direction: 0,\n });\n } else {\n this.setState({\n direction: currentColumn.direction,\n });\n }\n }\n\n private updateSortProcessor(sortedColumns: SortStoreState) {\n // updates the Sorting processor\n this.sortProcessor.setProps({\n columns: sortedColumns,\n });\n }\n\n private getOrCreateSortProcessor(): NativeSort {\n let processorType = ProcessorType.Sort;\n\n if (this.config.sort && typeof this.config.sort.server === 'object') {\n processorType = ProcessorType.ServerSort;\n }\n\n const processors = this.config.pipeline.getStepsByType(processorType);\n\n // my assumption is that we only have ONE sorting processor in the\n // entire pipeline and that's why I'm displaying a warning here\n let processor;\n\n // A sort process is already registered\n if (processors.length > 0) {\n processor = processors[0];\n } else {\n // let's create a new sort processor\n\n // this event listener is here because\n // we want to subscribe to the sort store only once\n this.updateSortProcessorFn = this.updateSortProcessor.bind(this);\n this.store.on('updated', this.updateSortProcessorFn);\n\n if (processorType === ProcessorType.ServerSort) {\n processor = new ServerSort({\n columns: this.store.state,\n ...this.config.sort.server,\n });\n } else {\n processor = new NativeSort({\n columns: this.store.state,\n });\n }\n\n this.config.pipeline.register(processor);\n }\n\n return processor;\n }\n\n changeDirection(e: JSX.TargetedMouseEvent<HTMLButtonElement>): void {\n e.preventDefault();\n e.stopPropagation();\n\n // to sort two or more columns at the same time\n this.actions.sortToggle(\n this.props.index,\n e.shiftKey === true && this.config.sort.multiColumn,\n this.props.compare,\n );\n }\n\n render() {\n if (!this.props.enabled) {\n return null;\n }\n\n const direction = this.state.direction;\n let sortClassName = 'neutral';\n\n if (direction === 1) {\n sortClassName = 'asc';\n } else if (direction === -1) {\n sortClassName = 'desc';\n }\n\n return (\n <button\n // because the corresponding <th> has tabIndex=0\n tabIndex={-1}\n aria-label={this._(`sort.sort${direction === 1 ? 'Desc' : 'Asc'}`)}\n title={this._(`sort.sort${direction === 1 ? 'Desc' : 'Asc'}`)}\n className={classJoin(\n className('sort'),\n className('sort', sortClassName),\n this.config.className.sort,\n )}\n onClick={this.changeDirection.bind(this)}\n />\n );\n }\n}\n","import { h, RefObject } from 'preact';\nimport { classJoin, className } from '../../../util/className';\nimport { BaseComponent } from '../../base';\nimport { TColumn } from '../../../types';\nimport { TH } from '../../table/th';\nimport { throttle } from '../../../util/throttle';\n\ntype ResizeProps = {\n column: TColumn;\n thRef: RefObject<TH>;\n};\n\ntype ResizeState = {\n width: string;\n offsetStart: number;\n};\n\nexport class Resize extends BaseComponent<ResizeProps, ResizeState> {\n private moveFn: (e) => void;\n private upFn: (e) => void;\n\n private getPageX(e: MouseEvent | TouchEvent): number {\n if (e instanceof MouseEvent) {\n return Math.floor(e.pageX);\n } else {\n return Math.floor(e.changedTouches[0].pageX);\n }\n }\n\n private start(e: MouseEvent | TouchEvent): void {\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const thElement: HTMLElement = this.props.thRef.current;\n\n this.setState({\n offsetStart: parseInt(thElement.style.width, 10) - this.getPageX(e),\n });\n\n this.upFn = this.end.bind(this);\n this.moveFn = throttle(this.move.bind(this), 10);\n\n document.addEventListener('mouseup', this.upFn);\n document.addEventListener('touchend', this.upFn);\n document.addEventListener('mousemove', this.moveFn);\n document.addEventListener('touchmove', this.moveFn);\n }\n\n private move(e: MouseEvent | TouchEvent): void {\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const thElement: HTMLElement = this.props.thRef.current;\n\n if (\n this.state.offsetStart + this.getPageX(e) >=\n parseInt(thElement.style.minWidth, 10)\n ) {\n thElement.style.width = `${this.state.offsetStart + this.getPageX(e)}px`;\n }\n }\n\n private end(e: MouseEvent | TouchEvent): void {\n e.stopPropagation();\n\n document.removeEventListener('mouseup', this.upFn);\n document.removeEventListener('mousemove', this.moveFn);\n document.removeEventListener('touchmove', this.moveFn);\n document.removeEventListener('touchend', this.upFn);\n }\n\n render() {\n return (\n <div\n className={classJoin(className('th'), className('resizable'))}\n onMouseDown={this.start.bind(this)}\n onTouchStart={this.start.bind(this)}\n onClick={(e) => e.stopPropagation()}\n />\n );\n }\n}\n","export const throttle = (fn: (...args) => void, wait = 100) => {\n let inThrottle: boolean;\n let lastFn: ReturnType<typeof setTimeout>;\n let lastTime: number;\n\n return (...args) => {\n if (!inThrottle) {\n fn(...args);\n lastTime = Date.now();\n inThrottle = true;\n } else {\n clearTimeout(lastFn);\n lastFn = setTimeout(() => {\n if (Date.now() - lastTime >= wait) {\n fn(...args);\n lastTime = Date.now();\n }\n }, Math.max(wait - (Date.now() - lastTime), 0));\n }\n };\n};\n","import { ComponentChild, createRef, h, JSX } from 'preact';\n\nimport { BaseComponent, BaseProps } from '../base';\nimport { classJoin, className } from '../../util/className';\nimport { CSSDeclaration, TColumn } from '../../types';\nimport { Sort } from '../plugin/sort/sort';\nimport { PluginRenderer } from '../../plugin';\nimport { JSXInternal } from 'preact/src/jsx';\nimport { Resize } from '../plugin/resize/resize';\n\nexport interface THProps\n extends BaseProps,\n JSX.HTMLAttributes<HTMLTableCellElement> {\n index: number;\n column: TColumn;\n style?: CSSDeclaration;\n}\n\nexport interface THState {\n style: CSSDeclaration;\n}\n\nexport class TH extends BaseComponent<THProps, THState> {\n private sortRef = createRef();\n private thRef = createRef();\n\n constructor(props, context) {\n super(props, context);\n\n this.state = {\n style: {},\n };\n }\n\n private isSortable(): boolean {\n return this.props.column.sort.enabled;\n }\n\n private isResizable(): boolean {\n return this.props.column.resizable;\n }\n\n private onClick(e: JSX.TargetedMouseEvent<HTMLInputElement>): void {\n e.stopPropagation();\n\n if (this.isSortable()) {\n this.sortRef.current.changeDirection(e);\n }\n }\n\n private keyDown(e: JSX.TargetedMouseEvent<HTMLInputElement>): void {\n if (this.isSortable() && e.which === 13) {\n this.onClick(e);\n }\n }\n\n componentDidMount(): void {\n setTimeout(() => {\n // sets the `top` style if the current TH is fixed\n if (this.props.column.fixedHeader && this.thRef.current) {\n const offsetTop = this.thRef.current.offsetTop;\n\n if (typeof offsetTop === 'number') {\n this.setState({\n style: {\n top: offsetTop,\n },\n });\n }\n }\n }, 0);\n }\n\n private content(): ComponentChild {\n if (this.props.column.name !== undefined) {\n return this.props.column.name;\n }\n\n if (this.props.column.plugin !== undefined) {\n return (\n <PluginRenderer\n pluginId={this.props.column.plugin.id}\n props={{\n column: this.props.column,\n }}\n />\n );\n }\n\n return null;\n }\n\n private getCustomAttributes(): JSXInternal.HTMLAttributes<HTMLTableCellElement> {\n const column = this.props.column;\n\n if (!column) return {};\n\n if (typeof column.attributes === 'function') {\n return column.attributes(null, null, this.props.column);\n } else {\n return column.attributes;\n }\n }\n\n render() {\n const props = {};\n\n if (this.isSortable()) {\n props['tabIndex'] = 0;\n }\n\n return (\n <th\n ref={this.thRef}\n data-column-id={this.props.column && this.props.column.id}\n className={classJoin(\n className('th'),\n this.isSortable() ? className('th', 'sort') : null,\n this.props.column.fixedHeader ? className('th', 'fixed') : null,\n this.config.className.th,\n )}\n onClick={this.onClick.bind(this)}\n style={{\n ...this.config.style.th,\n ...{\n minWidth: this.props.column.minWidth,\n width: this.props.column.width,\n },\n ...this.state.style,\n ...this.props.style,\n }}\n onKeyDown={this.keyDown.bind(this)}\n rowSpan={this.props.rowSpan > 1 ? this.props.rowSpan : undefined}\n colSpan={this.props.colSpan > 1 ? this.props.colSpan : undefined}\n {...this.getCustomAttributes()}\n {...props}\n >\n <div className={className('th', 'content')}>{this.content()}</div>\n {this.isSortable() && (\n <Sort\n ref={this.sortRef}\n index={this.props.index}\n {...this.props.column.sort}\n />\n )}\n {this.isResizable() &&\n this.props.index < this.config.header.visibleColumns.length - 1 && (\n <Resize column={this.props.column} thRef={this.thRef} />\n )}\n </th>\n );\n }\n}\n","import { ComponentChild, h } from 'preact';\n\nimport { TR } from './tr';\nimport { BaseComponent, BaseProps } from '../base';\nimport { TH } from './th';\nimport { classJoin, className } from '../../util/className';\nimport Header from '../../header';\nimport { TColumn } from '../../types';\nimport { calculateRowColSpans } from '../../util/table';\n\ninterface THeadProps extends BaseProps {\n header: Header;\n}\n\nexport class THead extends BaseComponent<THeadProps> {\n private renderColumn(\n column: TColumn,\n rowIndex: number,\n columnIndex: number,\n totalRows: number,\n ): ComponentChild {\n const { rowSpan, colSpan } = calculateRowColSpans(\n column,\n rowIndex,\n totalRows,\n );\n\n return (\n <TH\n column={column}\n index={columnIndex}\n colSpan={colSpan}\n rowSpan={rowSpan}\n />\n );\n }\n\n private renderRow(\n row: TColumn[],\n rowIndex: number,\n totalRows: number,\n ): ComponentChild {\n // because the only sortable columns are leaf columns (not parents)\n const leafColumns = Header.leafColumns(this.props.header.columns);\n\n return (\n <TR>\n {row.map((col) => {\n if (col.hidden) return null;\n\n return this.renderColumn(\n col,\n rowIndex,\n leafColumns.indexOf(col),\n totalRows,\n );\n })}\n </TR>\n );\n }\n\n private renderRows(): ComponentChild {\n const rows = Header.tabularFormat(this.props.header.columns);\n\n return rows.map((row, rowIndex) =>\n this.renderRow(row, rowIndex, rows.length),\n );\n }\n\n render() {\n if (this.props.header) {\n return (\n <thead\n key={this.props.header.id}\n className={classJoin(className('thead'), this.config.className.thead)}\n >\n {this.renderRows()}\n </thead>\n );\n }\n\n return null;\n }\n}\n","import { TColumn } from '../types';\nimport Header from '../header';\n\nexport function calculateRowColSpans(\n column: TColumn,\n rowIndex: number,\n totalRows: number,\n): { rowSpan: number; colSpan: number } {\n const depth = Header.maximumDepth(column);\n const remainingRows = totalRows - rowIndex;\n const rowSpan = Math.floor(remainingRows - depth - depth / remainingRows);\n const colSpan = (column.columns && column.columns.length) || 1;\n\n return {\n rowSpan: rowSpan,\n colSpan: colSpan,\n };\n}\n","import { h } from 'preact';\n\nimport Tabular from '../../tabular';\nimport { TBody } from './tbody';\nimport { THead } from './thead';\nimport { BaseComponent, BaseProps } from '../base';\nimport Header from '../../header';\nimport { classJoin, className } from '../../util/className';\nimport { Status } from '../../types';\n\ninterface TableProps extends BaseProps {\n data: Tabular;\n status: Status;\n header?: Header;\n width: string;\n height: string;\n}\n\nexport class Table extends BaseComponent<TableProps> {\n render() {\n return (\n <table\n role=\"grid\"\n className={classJoin(className('table'), this.config.className.table)}\n style={{\n ...this.config.style.table,\n ...{\n height: this.props.height,\n },\n }}\n >\n <THead header={this.props.header} />\n <TBody\n data={this.props.data}\n status={this.props.status}\n header={this.props.header}\n />\n </table>\n );\n }\n}\n","import { createRef, h } from 'preact';\n\nimport { BaseComponent } from './base';\nimport { classJoin, className } from '../util/className';\nimport { PluginPosition, PluginRenderer } from '../plugin';\n\ninterface HeaderContainerState {\n isActive: boolean;\n}\n\nexport class HeaderContainer extends BaseComponent<\n Record<string, any>,\n HeaderContainerState\n> {\n private headerRef = createRef();\n\n constructor(props, context) {\n super(props, context);\n\n this.state = {\n isActive: true,\n };\n }\n\n componentDidMount() {\n if (this.headerRef.current.children.length === 0) {\n this.setState({\n isActive: false,\n });\n }\n }\n\n render() {\n if (this.state.isActive) {\n return (\n <div\n ref={this.headerRef}\n className={classJoin(className('head'), this.config.className.header)}\n style={{ ...this.config.style.header }}\n >\n <PluginRenderer position={PluginPosition.Header} />\n </div>\n );\n }\n\n return null;\n }\n}\n","import { createRef, h } from 'preact';\n\nimport { BaseComponent } from './base';\nimport { classJoin, className } from '../util/className';\nimport { PluginPosition, PluginRenderer } from '../plugin';\n\ninterface FooterContainerState {\n isActive: boolean;\n}\n\nexport class FooterContainer extends BaseComponent<\n Record<string, any>,\n FooterContainerState\n> {\n private footerRef = createRef();\n\n constructor(props, context) {\n super(props, context);\n\n this.state = {\n isActive: true,\n };\n }\n\n componentDidMount() {\n if (this.footerRef.current.children.length === 0) {\n this.setState({\n isActive: false,\n });\n }\n }\n\n render() {\n if (this.state.isActive) {\n return (\n <div\n ref={this.footerRef}\n className={classJoin(\n className('footer'),\n this.config.className.footer,\n )}\n style={{ ...this.config.style.footer }}\n >\n <PluginRenderer position={PluginPosition.Footer} />\n </div>\n );\n }\n\n return null;\n }\n}\n","import { h, createContext, Context } from 'preact';\n\nimport Tabular from '../tabular';\nimport { BaseComponent, BaseProps } from './base';\nimport { classJoin, className } from '../util/className';\nimport { Status } from '../types';\nimport { Table } from './table/table';\nimport { HeaderContainer } from './headerContainer';\nimport { FooterContainer } from './footerContainer';\nimport Pipeline from '../pipeline/pipeline';\nimport Header from '../header';\nimport { Config } from '../config';\nimport log from '../util/log';\nimport { PipelineProcessor } from '../pipeline/processor';\n\ninterface ContainerProps extends BaseProps {\n config: Config;\n pipeline: Pipeline<Tabular>;\n header?: Header;\n width: string;\n height: string;\n}\n\ninterface ContainerState {\n status: Status;\n header?: Header;\n data?: Tabular;\n}\n\nexport class Container extends BaseComponent<ContainerProps, ContainerState> {\n private readonly configContext: Context<Config>;\n private processPipelineFn: (processor: PipelineProcessor<any, any>) => void;\n\n constructor(props, context) {\n super(props, context);\n\n // global Config context which is passed to all components\n this.configContext = createContext(null);\n\n this.state = {\n status: Status.Loading,\n header: props.header,\n data: null,\n };\n }\n\n private async processPipeline() {\n this.props.config.eventEmitter.emit('beforeLoad');\n\n this.setState({\n status: Status.Loading,\n });\n\n try {\n const data = await this.props.pipeline.process();\n this.setState({\n data: data,\n status: Status.Loaded,\n });\n\n this.props.config.eventEmitter.emit('load', data);\n } catch (e) {\n log.error(e);\n\n this.setState({\n status: Status.Error,\n data: null,\n });\n }\n }\n\n async componentDidMount() {\n const config = this.props.config;\n\n // for the initial load\n await this.processPipeline();\n\n if (config.header && this.state.data && this.state.data.length) {\n // now that we have the data, let's adjust columns width\n // NOTE: that we only calculate the columns width once\n this.setState({\n header: config.header.adjustWidth(config),\n });\n }\n\n this.processPipelineFn = this.processPipeline.bind(this);\n this.props.pipeline.on('updated', this.processPipelineFn);\n }\n\n componentWillUnmount(): void {\n this.props.pipeline.off('updated', this.processPipelineFn);\n }\n\n componentDidUpdate(\n _: Readonly<ContainerProps>,\n previousState: Readonly<ContainerState>,\n ): void {\n // we can't jump to the Status.Rendered if previous status is not Status.Loaded\n if (\n previousState.status != Status.Rendered &&\n this.state.status == Status.Loaded\n ) {\n this.setState({\n status: Status.Rendered,\n });\n\n this.props.config.eventEmitter.emit('ready');\n }\n }\n\n render() {\n const configContext = this.configContext;\n\n return (\n <configContext.Provider value={this.props.config}>\n <div\n role=\"complementary\"\n className={classJoin(\n 'gridjs',\n className('container'),\n this.state.status === Status.Loading ? className('loading') : null,\n this.props.config.className.container,\n )}\n style={{\n ...this.props.config.style.container,\n ...{\n width: this.props.width,\n },\n }}\n >\n {this.state.status === Status.Loading && (\n <div className={className('loading-bar')} />\n )}\n\n <HeaderContainer />\n\n <div\n className={className('wrapper')}\n style={{ height: this.props.height }}\n >\n <Table\n ref={this.props.config.tableRef}\n data={this.state.data}\n header={this.state.header}\n width={this.props.width}\n height={this.props.height}\n status={this.state.status}\n />\n </div>\n\n <FooterContainer />\n\n <div\n ref={this.props.config.tempRef}\n id=\"gridjs-temp\"\n className={className('temp')}\n />\n </div>\n </configContext.Provider>\n );\n }\n}\n","import { Config, UserConfig } from './config';\nimport { h, render, VNode } from 'preact';\nimport { Container } from './view/container';\nimport log from './util/log';\nimport { EventEmitter } from './util/eventEmitter';\nimport { GridEvents } from './events';\nimport { PluginManager } from './plugin';\n\nclass Grid extends EventEmitter<GridEvents> {\n public config: Config;\n public plugin: PluginManager;\n\n constructor(userConfig?: UserConfig) {\n super();\n this.config = new Config({ instance: this, eventEmitter: this }).update(\n userConfig,\n );\n this.plugin = this.config.plugin;\n }\n\n public updateConfig(userConfig: Partial<UserConfig>): this {\n this.config.update(userConfig);\n return this;\n }\n\n createElement(): VNode {\n return h(Container, {\n config: this.config,\n pipeline: this.config.pipeline,\n header: this.config.header,\n width: this.config.width,\n height: this.config.height,\n });\n }\n\n /**\n * Uses the existing container and tries to clear the cache\n * and re-render the existing Grid.js instance again. This is\n * useful when a new config is set/updated.\n *\n */\n forceRender(): this {\n if (!this.config || !this.config.container) {\n log.error(\n 'Container is empty. Make sure you call render() before forceRender()',\n true,\n );\n }\n\n // clear the pipeline cache\n this.config.pipeline.clearCache();\n\n // TODO: not sure if it's a good idea to render a null element but I couldn't find a better way\n render(null, this.config.container);\n render(this.createElement(), this.config.container);\n\n return this;\n }\n\n /**\n * Mounts the Grid.js instance to the container\n * and renders the instance\n *\n * @param container\n */\n render(container: Element): this {\n if (!container) {\n log.error('Container element cannot be null', true);\n }\n\n if (container.childNodes.length > 0) {\n log.error(\n `The container element ${container} is not empty. Make sure the container is empty and call render() again`,\n );\n return this;\n }\n\n this.config.container = container;\n render(this.createElement(), container);\n\n return this;\n }\n}\n\nexport default Grid;\n"],"names":["n","l","u","i","t","o","r","f","e","c","s","parentNode","removeChild","a","arguments","length","push","children","defaultProps","v","type","props","key","ref","__k","__","__b","__e","__d","__c","__h","constructor","__v","vnode","y","p","this","context","d","indexOf","_","base","k","b","__r","debounceRendering","sort","some","__P","I","__n","ownerSVGElement","T","m","h","w","A","P","Array","isArray","g","x","value","L","z","appendChild","nextSibling","insertBefore","setProperty","test","C","style","cssText","replace","toLowerCase","slice","addEventListener","H","$","removeEventListener","setAttribute","removeAttribute","event","contextType","__E","prototype","render","M","sub","state","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","forEach","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","localName","nodeType","document","createTextNode","createElementNS","createElement","is","data","call","childNodes","dangerouslySetInnerHTML","attributes","name","__html","innerHTML","firstChild","checked","j","diffed","current","unmount","componentWillUnmount","N","generateUUID","Math","random","toString","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Promise","then","bind","resolve","setTimeout","Base","id","_id","search","placeholder","sortAsc","sortDesc","pagination","previous","next","navigate","page","pages","showing","of","to","results","loading","noRecordsFound","error","Translator","language","_language","_defaultLanguage","enUS","getString","message","lang","splitted","split","val","join","translate","messageFormat","translated","BaseComponent","translator","_this","config","keys","Object","getConfig","Component","HTMLElement","parentElement","content","html","Cell","ProcessorType","update","cast","outerHTML","Row","cells","_cells","cell","index","toArray","map","fromCells","Tabular","rows","_rows","_length","row","fromRows","fromArray","oneDtoTwoD","len","EventEmitter","callbacks","init","on","listener","off","eventName","filter","emit","PipelineProcessor","_props","setProps","process","args","validateProps","Function","result","_process","assign","GlobalSearchFilter","keyword","String","trim","columns","ignoreHiddenColumns","tabular","selector","rowIndex","cellIndex","hidden","element","RegExp","Filter","className","prefix","reduce","prev","cur","classJoin","BaseStore","PluginPosition","dispatcher","_state","getInitialState","register","_handle","action","handle","payload","newState","prevState","SearchStore","BaseActions","dispatch","SearchActions","ServerGlobalSearchFilter","options","updates","url","body","ServerFilter","format","toUpperCase","throwException","msg","Error","console","warn","info","PluginBaseComponent","PluginManager","plugins","get","add","plugin","log","remove","splice","list","position","undefined","order","PluginRenderer","pluginId","Fragment","component","Search","searchProcessor","actions","store","storeUpdatedFn","enabled","storeUpdated","server","header","pipeline","unregister","onChange","target","func","waitFor","timeout","onInput","debounceTimeout","clearTimeout","aria-label","PaginationLimit","isNaN","Number","limit","Limit","ServerPaginationLimit","ServerLimit","Pagination","processor","onUpdateFn","setTotalFromTabularFn","total","setTotalFromTabular","_this2","setTotal","onUpdate","resetPageOnUpdate","setPage","totalRows","renderPages","buttonsCount","maxCount","min","pagePivot","floor","tabIndex","role","onClick","title","paginationButton","from","_this3","paginationButtonCurrent","renderSummary","summary","aria-live","paginationSummary","prevButton","disabled","paginationButtonPrev","nextButton","paginationButtonNext","ceil","width","containerWidth","parseInt","px","ShadowTable","tableElement","tableClassName","tableStyle","tableRef","cloneNode","zIndex","visibility","widths","tableLayout","padding","margin","border","outline","obj","querySelectorAll","clientWidth","getAttribute","minWidth","nodeElement","camelCase","str","words","word","charAt","Header","_columns","adjustWidth","container","tempRef","autoWidth","shadowTable","el","tabularFormat","concat","column","setSort","userConfig","setFixedHeader","fixedHeader","setResizable","resizable","setID","logger","populatePlugins","fromColumns","isValidElement","typedColumn","fromUserConfig","fromHTMLTable","querySelector","th","cols","nextRow","col","leafColumns","maximumDepth","Dispatcher","_callbacks","_isDispatching","_isHandled","_isPending","_lastID","_pendingPayload","callback","ids","ii","_invokeCallback","_startDispatching","_stopDispatching","isDispatching","Storage","MemoryStorage","set","ServerStorage","handler","response","ok","json","status","statusText","opts","fetch","res","StorageUtils","createFromUserConfig","storage","tableElementToArray","display","arr","parsedRow","Node","TEXT_NODE","DOMParser","parseFromString","documentElement","textContent","_settle","onFulfilled","onRejected","thenable","Status","Pipeline","steps","_steps","Map","cache","lastProcessorIndexUpdated","step","clearCache","priority","processorPropsUpdated","addProcessorByPriority","afterRegistered","subSteps","proc","newSubStep","first","second","getStepsByType","getSortedProcessorTypes","pact","processorIndex","findProcessorIndexByID","processorID","findIndex","setLastProcessorIndex","StorageExtractor","Extractor","ArrayToTabularTransformer","arrayResponse","Transformer","ServerInitiator","entries","serverStorageOptions","acc","Initiator","StorageResponseToArrayTransformer","castData","pad","storageResponse","PipelineUtils","createFromConfig","Config","_userConfig","defaultConfig","updatedConfig","height","multiColumn","Footer","TD","formatter","handleClick","messageCell","eventEmitter","getCustomAttributes","colSpan","data-column-id","td","TR","getColumn","messageRow","getChildren","tr","MessageRow","TBody","headerLength","visibleColumns","tbody","Loading","Rendered","notfound","NativeSort","condition","direction","compare","cellA","cellB","compareWrapper","cmp","sortedRows","sorted","Sort","SortStore","sortColumn","multi","sortToggle","find","count","reset","SortActions","ServerSort","sortProcessor","updateStateFn","updateSortProcessorFn","getOrCreateSortProcessor","updateState","currentColumn","updateSortProcessor","sortedColumns","processorType","processors","changeDirection","preventDefault","stopPropagation","shiftKey","sortClassName","Resize","moveFn","upFn","getPageX","MouseEvent","pageX","changedTouches","start","fn","wait","inThrottle","lastFn","lastTime","offsetStart","thRef","end","move","Date","now","max","thElement","onMouseDown","onTouchStart","TH","sortRef","isSortable","isResizable","keyDown","which","offsetTop","top","onKeyDown","rowSpan","THead","renderColumn","columnIndex","depth","remainingRows","calculateRowColSpans","renderRow","renderRows","thead","Table","table","HeaderContainer","headerRef","isActive","FooterContainer","footerRef","footer","Container","configContext","processPipelineFn","Consumer","Provider","createContext","processPipeline","Loaded","_this5","previousState","Grid","instance","updateConfig","forceRender","__H","requestAnimationFrame","cancelAnimationFrame"],"mappings":"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"}
\No newline at end of file