UNPKG

201 kBSource Map (JSON)View Raw
1{"version":3,"file":"gridjs.modern.js","sources":["../node_modules/preact/dist/preact.mjs","../src/util/id.ts","../src/base.ts","../src/i18n/en_US.ts","../src/pipeline/processor.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/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/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/plugin.ts","../src/types.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/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","../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","../node_modules/preact/hooks/dist/hooks.mjs"],"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","// 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 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","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 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 { 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 { 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 { 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 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 { 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","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"],"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","ProcessorType","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","args","messageFormat","BaseComponent","Component","translator","super","config","keys","Object","getConfig","HTMLElement","parentElement","content","html","Cell","update","cast","outerHTML","Row","cells","_cells","cell","index","toArray","map","[object Object]","Tabular","rows","_rows","_length","len","row","fromCells","oneDtoTwoD","EventEmitter","callbacks","init","on","listener","off","eventName","filter","emit","PipelineProcessor","_props","setProps","process","validateProps","Function","result","_process","assign","GlobalSearchFilter","Filter","keyword","String","trim","columns","ignoreHiddenColumns","tabular","selector","rowIndex","cellIndex","hidden","element","RegExp","className","reduce","prev","cur","classJoin","classNames","BaseStore","dispatcher","_state","getInitialState","register","_handle","action","handle","payload","newState","prevState","SearchStore","BaseActions","dispatch","SearchActions","ServerGlobalSearchFilter","ServerFilter","options","updates","url","body","PluginPosition","Status","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","onInput","func","waitFor","timeout","clearTimeout","debounce","debounceTimeout","aria-label","PaginationLimit","isNaN","Number","limit","Limit","ServerPaginationLimit","ServerLimit","Pagination","processor","onUpdateFn","setTotalFromTabularFn","total","setTotalFromTabular","setTotal","onUpdate","resetPageOnUpdate","setPage","ceil","totalRows","renderPages","buttonsCount","maxCount","min","pagePivot","floor","tabIndex","role","onClick","title","paginationButton","from","paginationButtonCurrent","renderSummary","summary","aria-live","paginationSummary","prevButton","disabled","paginationButtonPrev","nextButton","paginationButtonNext","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","visibleColumns","adjustWidth","container","tempRef","autoWidth","shadowTable","el","column","tabularFormat","concat","setSort","userConfig","cols","setFixedHeader","fixedHeader","setResizable","resizable","setID","logger","populatePlugins","isValidElement","typedColumn","fromColumns","fromHTMLTable","ths","querySelector","th","nextRow","col","leafColumns","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","storage","tableElementToArray","display","arr","parsedRow","Node","TEXT_NODE","DOMParser","parseFromString","documentElement","textContent","Pipeline","steps","_steps","Map","cache","lastProcessorIndexUpdated","step","clearCache","priority","processorPropsUpdated","addProcessorByPriority","afterRegistered","subSteps","proc","newSubStep","first","second","getSortedProcessorTypes","getStepsByType","findProcessorIndexByID","processorID","findIndex","setLastProcessorIndex","processorIndex","StorageExtractor","Extractor","ArrayToTabularTransformer","Transformer","arrayResponse","fromArray","ServerInitiator","Initiator","entries","serverStorageOptions","acc","StorageResponseToArrayTransformer","castData","pad","storageResponse","PipelineUtils","Config","_userConfig","defaultConfig","updatedConfig","fromUserConfig","height","multiColumn","createFromUserConfig","createFromConfig","Footer","TD","formatter","handleClick","messageCell","eventEmitter","getCustomAttributes","colSpan","data-column-id","td","TR","getColumn","messageRow","getChildren","tr","MessageRow","TBody","headerLength","tbody","Loading","Rendered","notfound","NativeSort","condition","direction","Sort","compare","cellA","cellB","compareWrapper","cmp","sortedRows","sorted","SortStore","multi","sortColumn","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","offsetStart","thRef","end","fn","wait","inThrottle","lastFn","lastTime","Date","now","max","throttle","move","thElement","onMouseDown","onTouchStart","TH","sortRef","isSortable","isResizable","keyDown","which","offsetTop","top","onKeyDown","rowSpan","THead","renderColumn","columnIndex","depth","maximumDepth","remainingRows","calculateRowColSpans","renderRow","renderRows","thead","Table","table","HeaderContainer","headerRef","isActive","FooterContainer","footerRef","footer","Container","configContext","processPipelineFn","Consumer","Provider","createContext","Loaded","processPipeline","previousState","Grid","instance","updateConfig","forceRender","__H","requestAnimationFrame","cancelAnimationFrame"],"mappings":"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"}
\No newline at end of file