UNPKG

202 kBSource Map (JSON)View Raw
1{"version":3,"file":"gridjs.module.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","h","current","y","p","this","context","d","indexOf","_","base","k","b","__r","debounceRendering","sort","some","__P","I","__n","ownerSVGElement","T","m","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","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