@hitgrab/finder 0.1.18-alpha → 0.1.20-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +540 -0
- package/dist/index.d.mts +540 -0
- package/dist/index.mjs +1 -0
- package/package.json +9 -16
- package/dist/core/__tests__/core.test.d.ts +0 -1
- package/dist/core/__tests__/effects.test.d.ts +0 -1
- package/dist/core/__tests__/events.test.d.ts +0 -1
- package/dist/core/__tests__/filter.test.d.ts +0 -1
- package/dist/core/__tests__/group-by.test.d.ts +0 -1
- package/dist/core/__tests__/json.test.d.ts +0 -1
- package/dist/core/__tests__/pagination.test.d.ts +0 -1
- package/dist/core/__tests__/search.test.d.ts +0 -1
- package/dist/core/__tests__/sort-by.test.d.ts +0 -1
- package/dist/core/__tests__/test-constants.d.ts +0 -5
- package/dist/core/__tests__/test-types.d.ts +0 -6
- package/dist/core/__tests__/utils.test.d.ts +0 -1
- package/dist/core/core-constants.d.ts +0 -50
- package/dist/core/debounce-callback-registry.d.ts +0 -3
- package/dist/core/effect-book.d.ts +0 -12
- package/dist/core/event-emitter.d.ts +0 -12
- package/dist/core/filters.d.ts +0 -29
- package/dist/core/finder-core-implementation.d.ts +0 -45
- package/dist/core/finder-core.d.ts +0 -101
- package/dist/core/finder-error.d.ts +0 -3
- package/dist/core/group-by.d.ts +0 -25
- package/dist/core/pagination.d.ts +0 -19
- package/dist/core/rule-book/boolean-filter-handler.d.ts +0 -11
- package/dist/core/rule-book/filter-handler.d.ts +0 -29
- package/dist/core/rule-book/multiple-filter-handler.d.ts +0 -11
- package/dist/core/rule-book/rule-book.d.ts +0 -14
- package/dist/core/rule-book/single-filter-handler.d.ts +0 -11
- package/dist/core/search/calculate-character-match-indexes.d.ts +0 -1
- package/dist/core/search/calculate-string-match-segments.d.ts +0 -9
- package/dist/core/search/default-search-and-sort-algorithm.d.ts +0 -2
- package/dist/core/search/search-score.d.ts +0 -4
- package/dist/core/search/search-string-transform.d.ts +0 -8
- package/dist/core/search/string-match-haystack.d.ts +0 -15
- package/dist/core/search.d.ts +0 -18
- package/dist/core/sort-by.d.ts +0 -23
- package/dist/core/tester.d.ts +0 -8
- package/dist/core/types/core-types.d.ts +0 -90
- package/dist/core/types/effect-types.d.ts +0 -20
- package/dist/core/types/event-types.d.ts +0 -44
- package/dist/core/types/rule-types.d.ts +0 -89
- package/dist/core/types/string-match-types.d.ts +0 -10
- package/dist/core/utils/rule-type-enforcers.d.ts +0 -18
- package/dist/core/utils/rule-utils.d.ts +0 -14
- package/dist/index.d.ts +0 -13
- package/dist/index.js +0 -5133
- package/dist/index.umd.cjs +0 -27
- package/dist/react/components/finder-content-empty.d.ts +0 -7
- package/dist/react/components/finder-content-groups.d.ts +0 -7
- package/dist/react/components/finder-content-items.d.ts +0 -7
- package/dist/react/components/finder-content-loading.d.ts +0 -7
- package/dist/react/components/finder-content-no-matches.d.ts +0 -7
- package/dist/react/components/finder-content.d.ts +0 -25
- package/dist/react/components/finder-search-term-haystack.d.ts +0 -8
- package/dist/react/components/finder.d.ts +0 -9
- package/dist/react/components/string-match.d.ts +0 -12
- package/dist/react/hooks/use-finder-ref.d.ts +0 -2
- package/dist/react/hooks/use-finder.d.ts +0 -3
- package/dist/react/providers/finder-core-context.d.ts +0 -3
- package/dist/react/types/react-types.d.ts +0 -41
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require(`react`),t=require(`react/jsx-runtime`),n=require(`lodash`);function r(e){return e}function i(e){return e}function a(e){return e}function o(e){return e}function s(e){return e}function c(e,t){return{rules:e,onChange:t}}function l(e,t){return{haystack:e,onChange:t}}function u(e){let t={...e};return delete t.boolean,delete t.multiple,t}function d(e){let t={...e};return delete t.multiple,{...t,boolean:!0}}function f(e){let t={...e};return delete t.boolean,{...t,multiple:!0}}const p=(0,e.createContext)(null);function m(){let t=(0,e.useContext)(p);if(t===null)throw Error(`useFinder requires a FinderContext.`);let[n]=t;return n}function h({children:e}){let n=m();return n.isLoading?typeof e==`function`?(0,t.jsx)(e,{pagination:n.pagination,context:n.context}):e:null}function g({children:e}){let n=m();return n.isEmpty?typeof e==`function`?(0,t.jsx)(e,{pagination:n.pagination,context:n.context}):e:null}function _({children:e}){let n=m();return n.isEmpty===!1&&n.hasMatches===!1?typeof e==`function`?(0,t.jsx)(e,{pagination:n.pagination,context:n.context}):e:null}function v({children:e}){let n=m();return n.hasMatches&&n.matches.items?typeof e==`function`?(0,t.jsx)(e,{items:n.matches.items,pagination:n.pagination,context:n.context}):e:null}function y({children:e}){let n=m();return n.hasMatches&&n.matches.groups?typeof e==`function`?(0,t.jsx)(e,{groups:n.matches.groups,pagination:n.pagination,context:n.context}):e:null}function b({children:e}){if(Object.values(e).length===0)throw Error(`No render props were found.`);return[e.loading&&(0,t.jsx)(h,{children:e.loading},`loading`),e.empty&&(0,t.jsx)(g,{children:e.empty},`empty`),e.noMatches&&(0,t.jsx)(_,{children:e.noMatches},`noMatches`),e.items&&(0,t.jsx)(v,{children:e.items},`items`),e.groups&&(0,t.jsx)(y,{children:e.groups},`groups`)]}b.Loading=h,b.Empty=g,b.NoMatches=_,b.Items=v,b.Groups=y;function x(e){return e.toLowerCase().replace(/[^\w\d]+/g,``)}function S(e,t){let n=new RegExp(/"(.*?)"/g),r=t,i=[],a,o=!1;for(;(a=n.exec(t))!==null&&o===!1;){let t=C(e,x(String(a[1])));t===void 0?o=!0:(i=i.concat(t),r=r.replace(a[0],``))}if(o)return;let s=w(e,x(r));if(s!==void 0)return i=i.concat(s),i.sort((e,t)=>e-t)}function C(e,t){if(e.length<t.length)return;let r=e.indexOf(t);if(r!==-1)return(0,n.range)(r,r+t.length).map(e=>e)}function w(e,t){if(e.length<t.length)return;let n=Array.from(t),r=[],i=e,a=0,o=!1;for(let e of n){let t=i.indexOf(e);if(t===-1&&(o=!0),o===!1){r.push(a+t);let e=t+1;a+=e,i=i.substring(e)}}if(!o)return r}var T=class e{#e;constructor(t){this.source=t;let n=e.composeTransformedHaystackSegments(t);this.#e=n,this.transformed=n.map(e=>e.value).join(``).toLowerCase()}getSourceCharacterIndex(e){let t=0;return this.#e.reduce((n,r)=>{if(n!==1/0)return n;let i=t+r.value.length;if(e>=t&&e<=i){let i=e-t;n=r.index+i}return t+=r.value.length,n},1/0)}static composeTransformedHaystackSegments(e){let t=e.matchAll(/[\w\d]+/g),n=[];for(let e of t)n.push({value:e[0],index:e.index,length:e[0].length});return n}};function E(e,t){return(Array.isArray(e)?e:[e]).map(e=>new T(e)).reduce((e,n)=>{if(e!==void 0)return e;let r=S(n.transformed,t);return r===void 0?e:ee(O(n,D(r,n.transformed)))},void 0)}function D(e,t){let n=[...e],r=[],i=0;for(;n.length>0&&i<100;){let e=n.at(0);if(e===void 0)throw Error(`Should never get here`);let a=1;for(let t=1;t<=n.length;t+=1){let r=n.at(t);r!==void 0&&e+t===r&&(a+=1)}let o=e,s=e+a,c=t.substring(o,s);r.push({index:o,value:c,is_match:!0,length:c.length}),n.splice(0,a),i+=1}return r}function O(e,t){return t.reduce((n,r,i)=>{if(i===0&&r.index!==0){let t=e.source.substring(0,e.getSourceCharacterIndex(r.index));n.push({index:0,value:t,is_match:!1,length:t.length})}let a=e.getSourceCharacterIndex(r.index),o=e.getSourceCharacterIndex(r.index+r.length),s=e.source.substring(a,o);n.push({index:a,value:s,is_match:!0,length:s.length});let c=t.at(i+1);if(c){let t=e.getSourceCharacterIndex(r.index+r.length),i=e.getSourceCharacterIndex(c.index),a=e.source.substring(t,i);n.push({index:t,value:a,is_match:!1,length:a.length})}else if(a+s.length!==e.source.length){let t=a+s.length,r=e.source.substring(t);n.push({index:t,value:r,is_match:!1,length:r.length})}return n},[])}function ee(e){let t=/\S/,n=[...e];return n.forEach((e,r)=>{if(e.is_match){let i=e.value.search(t);if(i!==0){let t=n.at(r-1);t&&(t.length+=i,t.value+=e.value.substring(0,i),e.value=e.value.substring(i),e.index+=i)}}}),n}function k(e,t){return(Array.isArray(e)?e:[e]).some(e=>S(x(e),t)!==void 0)}function A({needle:n,haystack:r,Match:i=`mark`,Miss:a}){let o=(0,e.useMemo)(()=>E(r,n),[r,n]);return o===void 0?r:o.map((e,n)=>{let r=[e.value,n].join();return e.is_match?typeof i==`string`?(0,t.jsx)(i,{"data-is-match":e.is_match,children:e.value},r):(0,t.jsx)(i,{"data-is-match":e.is_match,segment:e,segmentIndex:n},r):a===void 0?e.value:typeof a==`string`?(0,t.jsx)(a,{"data-is-match":e.is_match,children:e.value},r):(0,t.jsx)(a,{"data-is-match":e.is_match,segment:e,segmentIndex:n},r)})}function j({Match:e=`mark`,Miss:n,children:r}){let i=m();return i.search.hasSearchTerm===!1?r:(0,t.jsx)(A,{needle:i.search.searchTerm,haystack:r,Match:e,Miss:n})}function M(){let e=new Map;return(t,r)=>t.debounceMilliseconds===void 0?r():(e.has(t)===!1&&e.set(t,(0,n.debounce)(e=>e(),t.debounceMilliseconds)),e.get(t)?.(r))}var te=class{#e=new Map;#t=!1;on(e,t){this.#e.has(e)===!1&&this.#e.set(e,new Set),this.#e.get(e)?.add(t)}off(e,t){if(this.#e.has(e)!==!1){if(t===void 0){this.#e.delete(e);return}this.#e.get(e)?.delete(t)}}emit(e,t){this.#t||this.#e.get(e)?.forEach(e=>{e(t)})}silently(e){this.#t=!0,e(),this.#t=!1}isSilent(){return this.#t}};const N={INIT:`init`,FIRST_USER_INTERACTION:`firstUserInteraction`,READY:`ready`,CHANGE:`change`,SET_ITEMS:`setItems`,SET_IS_LOADING:`setIsLoading`,SET_IS_DISABLED:`setIsDisabled`,SET_CONTEXT:`setContext`,SET_SEARCH_TERM:`setSearchTerm`,RESET_SEARCH_TERM:`resetSearchTerm`,SET_FILTER:`setFilter`,RESET_FILTERS:`resetFilters`,SET_SORT_BY:`setSortBy`,SET_SORT_BY_DIRECTION:`setSortDirection`,SET_GROUP_BY:`setGroupBy`,SET_GROUP_SORT_BY_DIRECTION:`setGroupBySortDirection`,SET_PAGE:`setPage`,SET_NUM_ITEMS_PER_PAGE:`setNumItemsPerPage`,SYNC_UPDATED_AT:`syncUpdatedAt`},P={CORE:`core`,SEARCH:`search`,FILTERS:`filters`,GROUP_BY:`groupBy`,SORT_BY:`sortBy`,PAGINATION:`pagination`},F={RULE_NOT_FOUND:`Finder could not locate requested rule`,WRONG_RULE_TYPE_FOR_MIXIN:`The requested rule is not valid for this mixin.`,NO_SEARCH_RULE_SET:`Unable to set search term; no SearchRule was found.`,INVALID_SEARCH_TERM_TYPE:`Search terms must be strings.`,NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS:`Finder could not find a matching option with the passed value could be found. If this is intended, set 'strictOptions:false' in the rule definition.`,SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY:`Finder could not set this filter value, as the rule requires an array.`,ADDING_OPTION_TO_MULTIPLE_FILTER_WITHOUT_OPTION_VALUE:`Finder could not add to this filter, as no optionValue was passed.`,DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER:`Finder could not delete an option from this filter, as it does not support multiple values.`,SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE:`Finder could not set this filter value, as the rule requires a boolean.`,ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER:`Finder could not add to this filter value, as the rule is a boolean.`,TOGGLING_OPTION_ON_RULE_WITH_NO_OPTIONS:`Finder could not toggle this filter rule option, as the filter does not have any options.`,TOGGLING_OPTION_ON_RULE_WITH_SINGLE_VALUE:`Finder could not toggle this filter rule option, as the rule does not allow multiple values.`,TOGGLING_OPTION_THAT_DOES_NOT_EXIST:`Finder could not toggle this filter rule option, as the option was not found.`,TOGGLING_OPTION_WITHOUT_PASSING_OPTION:`Finder could not toggle this filter rule option, as the option was not found.`,TOGGLING_BOOLEAN_FILTER_WITH_UNUSED_VALUE:`Finder could not toggle this filter rule option, as boolean filters do not have options.`,TESTING_OPTIONS_ON_RULE_WITH_NO_OPTIONS:`Finder was unable to test the options for this filter rule. It must be a boolean or have defined options.`,INVALID_RULE_WITHOUT_ID:`Init failed: Missing rule id.`,INVALID_RULE_SHAPE:`Init failed: Malformed rule definition`,INVALID_RULE_DUPLICATE:`Init failed: Duplicate rule id.`};var I=class extends Error{constructor(e,t){let n=`${e} ${JSON.stringify({...t})}`;super(n),this.name=`FinderError`}};function L(e){return typeof e==`object`&&!!e&&`sortFn`in e}function R(e){return typeof e==`object`&&!!e&&`searchFn`in e}function z(e){return typeof e==`object`&&!!e&&`filterFn`in e}function B(e){return z(e)&&typeof e.options!=`function`}function V(e){return typeof e==`object`&&!!e&&`groupFn`in e}function ne(e){return typeof e==`object`&&!!e&&(`rules`in e||`callback`in e)}function re(e){return typeof e==`object`&&!!e&&(`haystack`in e||`callback`in e)}function ie(e){return z(e)&&e.boolean===!0}function ae(e){return z(e)&&e.multiple===!0}function oe(e){return z(e)&&e.multiple!==!0&&e.boolean!==!0}function se(e){return{validate(t){if(t!==void 0&&typeof t!=`boolean`)throw new I(F.SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE,{rule:e,value:t});return!0},parse(t){return typeof t!=`boolean`&&t!==void 0?!1:t===void 0?e.required?!0:e.defaultValue===void 0?!1:e.defaultValue:t},has(e){return this.parse(e)},toggle(t,n){let r=this.parse(t);if(typeof r!=`boolean`)throw new I(F.SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE,{rule:e,value:r,optionValue:n});return!r},add(t,n){throw new I(F.ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},delete(t,n){if(n!==void 0)throw new I(F.DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},isActive(t){return e.required?!0:this.parse(t)===!0},isMatch(t,n,r){return e.filterFn(t,n,r)}}}function H(e){return{validate(t){if(t!==void 0&&Array.isArray(t)===!1)throw new I(F.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:t});if(e.strictOptions&&Array.isArray(e.options)&&Array.isArray(t)&&t.every(t=>e.options?.some(e=>e.value===t))===!1)throw new I(F.NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS,{rule:e,value:t});return!0},parse(t){if(t===void 0)return e.required&&Array.isArray(e.options)&&e.options.length>0?[e.options.at(0)?.value]:[];if(Array.isArray(t))return t;throw new I(F.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:t})},has(t,n){if(n===void 0)return Array.isArray(t)&&t.length>0;if(Array.isArray(n))return n.every(t=>this.has(e,t));let r=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return Array.isArray(t)&&r!==void 0&&t.includes(r.value)},toggle(t,n){let r=this.parse(t);if(Array.isArray(r)===!1)throw new I(F.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:r});if(n===void 0)throw new I(F.TOGGLING_OPTION_WITHOUT_PASSING_OPTION,{rule:e});if(e.options===void 0)throw new I(F.TOGGLING_OPTION_ON_RULE_WITH_NO_OPTIONS,{rule:e,optionValue:n});let i=e.options.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);if(i===void 0)throw new I(F.TOGGLING_OPTION_THAT_DOES_NOT_EXIST,{rule:e,optionValue:n});return r.includes(i.value)?[...r.filter(e=>e!==i.value)]:[...r,i.value]},add(t,n){let r=this.parse(t);if(n===void 0)throw new I(F.ADDING_OPTION_TO_MULTIPLE_FILTER_WITHOUT_OPTION_VALUE,{rule:e,optionValue:n});let i=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return i===void 0?[...r,n]:r.includes(i.value)===!1?[...r,i.value]:r},delete(t,n){if(n===void 0)return;let r=this.parse(t),i=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return i!==void 0&&r.includes(i.value)?r.filter(e=>e!==i.value):r.filter(e=>e!==n)},isActive(t){return e.required?!0:this.parse(t).length>0},isMatch(t,n,r){return Array.isArray(n)?n.some(n=>e.filterFn(t,n,r)):!1}}}function U(e){return{validate(t){if(e.strictOptions&&Array.isArray(e.options)&&e.options.find(e=>e.value===t)===void 0)throw new I(F.NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS,{rule:e,value:t});return!0},parse(t){if(t===void 0&&e.required){if(e.defaultValue)return e.defaultValue;if(Array.isArray(e.options)&&e.options.length>0)return e.options.at(0)?.value}return t},has(e){return e!==void 0},toggle(t,n){throw new I(F.TOGGLING_OPTION_ON_RULE_WITH_SINGLE_VALUE,{rule:e,value:t,optionValue:n})},add(t,n){throw new I(F.ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},delete(t,n){if(n!==void 0)throw new I(F.DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},isActive(t){return e.required?!0:!(t===void 0||typeof t==`string`&&t.trim()===``)},isMatch(t,n,r){return e.filterFn(t,n,r)}}}function W(e){if(ae(e))return H(e);if(ie(e))return se(e);if(oe(e))return U(e);throw new I(F.INVALID_RULE_SHAPE,{definition:e})}var G=class{#e;#t;constructor({initialFilters:e},t){this.#e=e??{},this.#t=t}set(e,t){if(this.#t.isDisabled())return;let n=this.getRule(e),r=this.get(e),i=typeof t==`string`&&t.trim()===``?void 0:t;W(n).validate(t),!(this.#e[n.id]!==void 0&&this.#e[n.id]===i)&&this.#t.debouncer(n,()=>{this.#e={...this.#e,[n.id]:i},this.#t.touch({source:P.FILTERS,event:N.SET_FILTER,current:i,initial:r,rule:n})})}get rules(){return this.#t.getRuleBook().rules.filter(B)}get activeRules(){return this.rules.filter(e=>W(e).isActive(this.#e[e.id]))}get(e){let t=this.getRule(e),n=this.#e[t.id];return W(t).parse(n)}has(e,t){let n=this.getRule(e),r=this.#e[n.id];return W(n).has(r,t)}getRule(e){let t=this.#t.getRuleBook().getRule(e);if(!B(t))throw new I(F.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}add(e,t){let n=this.getRule(e),r=this.#e[n.id];this.set(n,W(n).add(r,t))}delete(e,t){let n=this.getRule(e),r=this.#e[n.id];this.set(n,W(n).delete(r,t))}toggle(e,t){let n=this.getRule(e),r=this.#e[n.id];if(n.boolean&&t!==void 0)throw new I(F.TOGGLING_BOOLEAN_FILTER_WITH_UNUSED_VALUE,{rule:n,value:r});let i=W(n).toggle(r,t);this.set(n,i)}reset(){let e=this.values;this.#e={},this.#t.touch({source:P.FILTERS,event:N.RESET_FILTERS,current:this.values,initial:e})}isRuleActive(e){let t=this.getRule(e),n=this.#e[t.id];return W(t).isActive(n)}test(e){if(this.#t.isLoading())return[];if(e.isAdditive){let t=(0,n.uniqBy)([...this.rules,...e.rules],`id`),r={...this.values,...e.values};return this.#t.test({filters:{rules:t,values:r}},!0)}return this.#t.test({filters:{rules:e.rules,values:e.values??{}}})}testRule({rule:e,value:t,...n}){let r=this.getRule(e);return this.test({rules:[r],values:{[r.id]:t},...n})}testRuleOptions(e,t){if(this.#t.isLoading())return new Map;let n=this.getRule(e);if(n.boolean){let e=new Map;return e.set(!0,this.testRule({rule:n,value:!0})),e.set(!1,this.testRule({rule:n,value:!1})),e}if(Array.isArray(n.options)){let e=new Map;return n.options.forEach(r=>{let i;i=n.multiple?[r.value]:r.value,e.set(r,this.testRule({rule:n,value:i,isAdditive:t}))}),e}throw new I(F.TESTING_OPTIONS_ON_RULE_WITH_NO_OPTIONS,n)}get values(){return this.rules.reduce((e,t)=>(e[t.id]=this.get(t),e),{})}get raw(){return this.#e}serialize(){return{rules:this.rules,values:this.values}}static process(e,t,n){let r=e.rules.filter(t=>B(t)&&W(t).isActive(e.values[t.id]));return r.length===0?t:t.filter(t=>r.every(r=>B(r)&&W(r).isMatch(t,e.values[r.id],n)))}},K=class{#e;#t;#n;constructor({initialGroupBy:e,initialGroupBySortDirection:t,requireGroup:n},r){this.#n=r,e&&(this.#e=this.getRule(e)),this.#t=t,this.requireGroup=n}getRule(e){let t=this.#n.getRuleBook().getRule(e);if(V(t)===!1)throw new I(F.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}get rules(){return this.#n.getRuleBook().rules.filter(V)}get activeRule(){let e=this.requireGroup?this.rules.at(0):void 0;return this.#e??e}get hasGroupByRule(){return this.activeRule!==void 0}get groupBySortDirection(){return this.#t??this.activeRule?.defaultGroupSortDirection}set(e){if(this.#n.isDisabled())return;let t=this.#e,n,r=typeof e==`string`&&e.trim()===``;r&&(n=void 0),r===!1&&e!==void 0&&(n=this.getRule(e)),this.#e!==n&&(this.#e=n,this.#t=void 0,this.#n.touch({source:P.GROUP_BY,event:N.SET_GROUP_BY,current:n?.id,initial:t?.id,rule:n}))}setGroupSortDirection(e){let t=this.#t;this.#t=e,this.#n.touch({source:P.GROUP_BY,event:N.SET_GROUP_SORT_BY_DIRECTION,current:e,initial:t,rule:this.activeRule})}toggle(e){let t=this.getRule(e);if(this.activeRule===t){this.set(void 0);return}this.set(t)}reset(){this.setGroupSortDirection(void 0),this.set(void 0)}serialize(){return{rule:this.activeRule,groupBySortDirection:this.#t}}static process(e,t,r){let i=(0,n.groupBy)(t,t=>e.rule?.groupFn(t,r)),a=Object.entries(i).map(([e,t])=>({id:e,items:t})),o=e.rule?.sticky!==void 0,s=[],c=[];return o&&e.rule&&(s.push(ce(e.rule)),c.push(`asc`)),e.rule?.sortGroupFn&&(s.push(e.rule.sortGroupFn),c.push(e.groupBySortDirection??`asc`)),s.length>0?(0,n.orderBy)(a,s,c):a}};function ce(e){let t=[];e.sticky?.header!==void 0&&(Array.isArray(e.sticky.header)&&(t=e.sticky.header),typeof e.sticky.header==`string`&&(t=[e.sticky.header]));let n=[];return e.sticky?.footer!==void 0&&(Array.isArray(e.sticky.footer)&&(n=e.sticky.footer),typeof e.sticky.footer==`string`&&(n=[e.sticky.footer])),e=>{if(t.includes(e.id)){let n=t.findIndex(t=>e.id===t);return(t.length-n)*-1}return n.includes(e.id)?1+n.findIndex(t=>e.id===t):0}}var q=class{#e;#t;constructor({page:e,numItemsPerPage:t},n){this.#e=e??1,this.numItemsPerPage=t,this.#t=n}setPage(e){if(e!==this.#e){let t=this.#e;this.#e=e,this.#t.touch({source:P.PAGINATION,event:N.SET_PAGE,current:{page:this.#e},initial:{page:t}})}}setNumItemsPerPage(e){if(e!==this.numItemsPerPage){let t=this.numItemsPerPage;this.numItemsPerPage=e,this.#t.touch({source:P.PAGINATION,event:N.SET_NUM_ITEMS_PER_PAGE,current:{numItemsPerPage:this.numItemsPerPage},initial:{numItemsPerPage:t}})}}get lastPage(){if(this.numItemsPerPage!==void 0)return Math.ceil(this.#t.getItems().length/this.numItemsPerPage)}get numTotalItems(){return this.#t.getItems().length}get page(){return this.numItemsPerPage&&this.lastPage?(0,n.clamp)(this.#e,1,this.lastPage):this.#e}get offset(){return this.numItemsPerPage&&this.lastPage?((0,n.clamp)(this.#e,1,this.lastPage)-1)*this.numItemsPerPage:0}serialize(){return{page:this.#e,numItemsPerPage:this.numItemsPerPage}}static process(e,t){if(e.numItemsPerPage===void 0)return t;let r=Math.ceil(t.length/e.numItemsPerPage),i=((0,n.clamp)(e.page,1,r)-1)*e.numItemsPerPage;return t.slice(i,i+e.numItemsPerPage)}};function le(e,t){let n=e.length/t.length,r=1,i=1,a=0;for(let t=0;t<e.length;t+=1)a!==void 0&&e.at(t)===a+1&&(i+=1,i>=r&&(r=i)),a=e.at(t);return{percentOfHaystackMatched:n,longestSequentialSequence:r}}function ue(e,t,r){let i=t.reduce((t,i)=>{if(e.rule?.searchFn===void 0)return t;let a=e.rule.searchFn(i,r),o=(Array.isArray(a)?a.map(x):[x(a)]).reduce((t,n)=>{let r=S(n,e.searchTerm);return r!==void 0&&t.push(le(r,n)),t},[]);if(o.length>0){let e=(0,n.orderBy)(o,[`percentOfHaystackMatched`,`longestSequentialSequence`],[`desc`,`asc`]).at(0);e&&t.push({item:i,score:e})}return t},[]),a=i.reduce((e,t)=>(t.score.longestSequentialSequence>e&&(e=t.score.longestSequentialSequence),e),0);return(0,n.orderBy)(i,[e=>e.score.percentOfHaystackMatched*100+e.score.longestSequentialSequence/a*100],[`desc`]).map(e=>e.item)}var J=class{#e;constructor({initialSearchTerm:e},t){if(this.searchTerm=``,e&&t.getRuleBook().rules.find(R)===void 0)throw new I(F.NO_SEARCH_RULE_SET);this.searchTerm=e??``,this.#e=t}get rule(){return this.#e.getRuleBook().rules.find(R)}get hasSearchRule(){return this.rule!==void 0}get hasSearchTerm(){return this.searchTerm!==``}setSearchTerm(e){let t=this.rule;if(!t)throw new I(F.NO_SEARCH_RULE_SET);if(typeof e!=`string`)throw new I(F.INVALID_SEARCH_TERM_TYPE);if(this.#e.isDisabled())return;let n=this.searchTerm;this.searchTerm=e,n!==e&&this.#e.debouncer(t,()=>{this.#e.touch({source:P.SEARCH,event:N.SET_SEARCH_TERM,current:e,initial:n,rule:t})})}reset(){if(this.#e.isDisabled())return;let e=this.searchTerm;this.searchTerm=``,this.#e.touch({source:P.SEARCH,event:N.RESET_SEARCH_TERM,current:``,initial:e,rule:this.rule})}serialize(){return{searchTerm:this.searchTerm,rule:this.rule}}test(e,t=!1){return this.#e.test({search:{searchTerm:e,rule:this.rule}},t)}static process(e,t,n){if(e.rule===void 0)throw new I(F.NO_SEARCH_RULE_SET);return e.searchTerm===``?t:ue(e,t,n)}};const Y=[void 0,`desc`,`asc`];var X=class{#e;#t;#n;constructor({initialSortBy:e,initialSortDirection:t},n){this.#n=n,e&&(this.#e=this.getRule(e)),this.#t=t}getRule(e){let t=this.#n.getRuleBook().getRule(e);if(L(t)===!1)throw new I(F.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}get rules(){return this.#n.getRuleBook().rules.filter(L)}get activeRule(){let e=this.rules.at(0);return this.#e??e}get sortDirection(){return this.#t??this.activeRule?.defaultSortDirection??`asc`}get userHasSetSortDirection(){return this.#t!==void 0}setSortDirection(e){if(this.#n.isDisabled()||!this.activeRule)return;let t=this.#t;this.#t=e,this.#n.touch({source:P.SORT_BY,event:N.SET_SORT_BY_DIRECTION,current:{sortDirection:e},initial:{sortDirection:t},rule:this.activeRule})}cycleSortDirection(){let e=Y.findIndex(e=>e===this.#t);if(e!==-1){let t=e+1%(Y.length-1);this.setSortDirection(Y[t])}}toggleSortDirection(){if((this.#t??this.activeRule?.defaultSortDirection)===`desc`){this.setSortDirection(`asc`);return}this.setSortDirection(`desc`)}set(e,t){if(this.#n.isDisabled()||!this.activeRule)return;let n=this.#t,r=this.#e,i=e?this.getRule(e):void 0;this.#e=i,this.#t=t,this.#n.touch({source:P.SORT_BY,event:N.SET_SORT_BY,current:{rule:i?.id,sortDirection:t},initial:{rule:r?.id,sortDirection:n},rule:this.activeRule})}toggle(e){if(!this.#n.isDisabled()){if(this.isRuleActive(e)){this.toggleSortDirection();return}this.set(e)}}isRuleActive(e){return this.getRule(e).id===this.activeRule?.id}reset(){this.set(void 0,void 0)}serialize(){return{rule:this.activeRule,sortDirection:this.sortDirection}}static process(e,t,r){return e.rule===void 0?t:(0,n.orderBy)(t,t=>typeof e.rule?.sortFn==`function`?e.rule.sortFn(t,r):-1/0,e.sortDirection)}},Z=class e{constructor(){this.snapshot={},this.isStale=!0}setIsStale(e){this.isStale=e}takeSnapshot({items:t,context:n,mixins:r}){let i=e.test({mixins:r,items:t,context:n}),a=r.pagination?q.process(r.pagination,i):i,o=[],s=r.groupBy!==void 0;r.groupBy&&(o=K.process(r.groupBy,a,n)),this.snapshot={items:s?void 0:a,groups:s?o:void 0,numMatchedItems:i.length,numTotalItems:t.length,hasGroupByRule:s}}static test({mixins:e,items:t,context:n}){let r=[...t];return e.search&&(r=J.process(e.search,r,n)),e.filters&&(r=G.process(e.filters,r,n)),e.sortBy&&(r=X.process(e.sortBy,r,n)),r}},de=class{#e;constructor(e){this.effects=[],this.#e=e}hydrateDefinitions(e,t){this.effects=this.#e.map(n=>{let r=typeof n.rules==`function`?n.rules(e,t):n.rules,i=Array.isArray(r)?r:[r];return{...n,rules:i,_isHydrated:!0}})}setEffects(e){this.#e=e}onChange(e,t){this.effects.forEach(n=>{n.rules.some(t=>typeof t==`string`&&e.id===t||typeof t==`object`&&e.id===t.id)&&n.onChange(t,e)})}},fe=class e{constructor(t){this.rules=[],e.validateDefinitions(t),this.definitions=t}hydrateDefinitions(e,t){this.rules=this.definitions.map(n=>{if(z(n)){let r=typeof n.options==`function`?n.options({items:e,context:t}):n.options;return{...n,boolean:!!n.boolean,multiple:!!n.multiple,strictOptions:n.strictOptions??!0,options:r}}return n})}getRule(e){let t=this.rules.find(t=>typeof e==`object`?t.id===e.id:t.id===e);if(t===void 0)throw new I(F.RULE_NOT_FOUND,e);return t}setRules(t){e.validateDefinitions(t),this.definitions=t}static validateDefinitions(e){if(e.length===0)return!1;let t=[R,z,L,V],n=new Set;return e.forEach(e=>{if(e.id===void 0&&!R(e))throw new I(F.INVALID_RULE_WITHOUT_ID,e);if(t.some(t=>t(e))===!1)throw new I(F.INVALID_RULE_SHAPE,e);if(e.id){if(n.has(e.id))throw new I(F.INVALID_RULE_DUPLICATE,e);n.add(e.id)}}),!0}},pe=class{#e;constructor(e){this.effects=[],this.#e=e}hydrateDefinitions(e,t){this.effects=this.#e.map(n=>{let r=typeof n.haystack==`function`?n.haystack(e,t):n.haystack,i=Array.isArray(r)?r:[r];return{...n,haystack:i}})}setEffects(e){this.#e=e}processSearchTerm(e,t){this.effects.forEach(n=>{k(n.haystack,e)&&n.onChange(t,e)})}},Q=class{constructor({rules:e,ruleEffects:t,searchEffects:n}){this.list=new fe(e),this.ruleEffects=new de(t),this.searchEffects=new pe(n)}hydrateDefinitions(e,t){this.list.hydrateDefinitions(e,t),this.searchEffects.hydrateDefinitions(e,t),this.ruleEffects.hydrateDefinitions(e,t)}onChange(e,t){R(e)&&t.search.hasSearchTerm&&this.searchEffects.processSearchTerm(t.search.searchTerm,t),this.ruleEffects.onChange(e,t)}},me=class{#e;#t=!1;#n;#r=new te;#i=new Z;#a;constructor(e,{rules:t,effects:n,initialSearchTerm:r,initialSortBy:i,initialSortDirection:a,initialGroupBy:o,initialGroupBySortDirection:s,initialFilters:c,context:l,page:u,numItemsPerPage:d,isLoading:f,disabled:p,requireGroup:m,ignoreSortByRulesWhileSearchRuleIsActive:h,onInit:g,onReady:_,onFirstUserInteraction:v,onChange:y},b){this.isReady=!1,this.#e=e,this.disabled=!!p,this.isLoading=!!f,this.isReady=!f&&Array.isArray(e)&&e.length>0,this.getInstanceInterfaceFn=b,this.updatedAt=Date.now(),this.context=l,this.#n=h,this.#a=new Q({rules:t,ruleEffects:n?.filter(ne)??[],searchEffects:n?.filter(re)??[]}),this.#a.hydrateDefinitions(e??[],l);let x={getItems:()=>this.items,getRuleBook:()=>this.#a.list,isLoading:()=>this.isLoading,isDisabled:()=>this.disabled,test:(e,t)=>this.test(e,t),touch:e=>this.#o(e),debouncer:M()};this.search=new J({initialSearchTerm:r},x),this.filters=new G({initialFilters:c},x),this.sortBy=new X({initialSortBy:i,initialSortDirection:a},x),this.groupBy=new K({initialGroupBy:o,initialGroupBySortDirection:s,requireGroup:!!m},x),this.pagination=new q({page:u,numItemsPerPage:d},x),this.#r.silently(()=>{let e={source:P.CORE,event:N.INIT,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};g&&g(e)}),y&&this.#r.on(N.CHANGE,y),v&&this.#r.on(N.FIRST_USER_INTERACTION,v),_&&this.isReady&&_({source:P.CORE,event:N.READY,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()}),this.isReady===!1&&_&&this.#r.on(N.READY,_)}#o(e){if(this.#r.isSilent())return;this.emitFirstUserInteraction(),this.#c(),this.#i.setIsStale(!0);let t={...e,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(N.CHANGE,t),this.#r.silently(()=>{e.rule&&this.#a.onChange(e.rule,this.getInstanceInterfaceFn())})}#s(e){this.#i.setIsStale(!0),this.#c();let t={...e,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(e.event,t)}#c(){this.updatedAt=Date.now(),this.#r.emit(N.SYNC_UPDATED_AT,this.updatedAt)}emitFirstUserInteraction(){if(this.#t===!1){this.#t=!0;let e={source:P.CORE,event:N.FIRST_USER_INTERACTION,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(N.FIRST_USER_INTERACTION,e)}}#l(){this.isReady===!1&&(this.isReady=!0,this.#r.emit(N.READY,{source:P.CORE,event:N.READY,timestamp:Date.now()}))}get items(){return Array.isArray(this.#e)?this.#e:[]}get matches(){return this.#i.isStale&&(this.#i.takeSnapshot({items:this.items,context:this.context,mixins:this.#u()}),this.#i.setIsStale(!1)),this.#i.snapshot}test(e,t=!1){if(t){let t={...this.#u(),...e};return Z.test({mixins:t,items:this.items,context:this.context})}return Z.test({mixins:e,items:this.items,context:this.context})}#u(){let e=this.search.hasSearchRule&&this.search.hasSearchTerm,t=e&&this.#n,n={};return e&&(n.search=this.search.serialize()),this.filters.activeRules.length>0&&(n.filters=this.filters.serialize()),this.pagination.numItemsPerPage&&(n.pagination=this.pagination.serialize()),t===!1&&(n.sortBy=this.sortBy.serialize()),this.groupBy.activeRule!==void 0&&(n.groupBy=this.groupBy.serialize()),n}get isEmpty(){return this.isLoading===!1&&this.items.length===0}get hasMatches(){let e=Array.isArray(this.matches.items)&&this.matches.items.length>0,t=Array.isArray(this.matches.groups)&&this.matches.groups.length>0;return e||t}get events(){return{on:(e,t)=>this.#r.on(e,t),off:(e,t)=>this.#r.off(e,t),silently:e=>this.#r.silently(e),isSilent:()=>this.#r.isSilent()}}getRule(e){return this.#a.list.getRule(e)}get state(){if(this.isLoading)return`loading`;if(this.isEmpty)return`empty`;let e=this.groupBy.activeRule!==void 0;return e&&Array.isArray(this.matches.groups)&&this.matches.groups.length>0?`groups`:e===!1&&Array.isArray(this.matches.items)&&this.matches.items.length>0?`items`:`noMatches`}setItems(e){if((0,n.isEqual)(e,this.#e)===!1){let t=this.#e;this.#e=e,this.#a.hydrateDefinitions(this.items,this.context),this.#s({source:P.CORE,event:N.SET_ITEMS,current:e,initial:t})}}setIsLoading(e){if(!!e!==this.isLoading){let t=this.isLoading;this.isLoading=!!e,this.#s({source:P.CORE,event:N.SET_IS_LOADING,current:!!e,initial:t}),this.isLoading===!1&&this.#l()}}setIsDisabled(e){if(!!e!==this.disabled){let t=this.disabled;this.disabled=!!e,this.#s({source:P.CORE,event:N.SET_IS_DISABLED,current:!!e,initial:t})}}setRules(e){(0,n.isEqual)(e,this.#a.list.definitions)===!1&&(this.#a.list.setRules(e),this.#a.list.hydrateDefinitions(this.items,this.context))}setContext(e){let t=this.context;(0,n.isEqual)(e,t)===!1&&(this.context=e,this.#a.hydrateDefinitions(this.items,this.context),this.#s({source:P.CORE,event:N.SET_CONTEXT,current:e,initial:t}))}toJSON(){return{disabled:this.disabled,initialSearchTerm:this.search.searchTerm,initialFilters:this.filters.raw,page:this.pagination.page,numItemsPerPage:this.pagination.numItemsPerPage,initialSortBy:this.sortBy.activeRule?.id,initialSortDirection:this.sortBy.sortDirection,ignoreSortByRulesWhileSearchRuleIsActive:this.#n,initialGroupBy:this.groupBy.activeRule?.id,initialGroupBySortDirection:this.groupBy.groupBySortDirection,requireGroup:this.groupBy.requireGroup}}},he=class{#e;constructor(e,t){this.#e=new me(e,t,()=>this)}get items(){return this.#e.items}get context(){return this.#e.context}get isReady(){return this.#e.isReady}get isEmpty(){return this.#e.isEmpty}get hasMatches(){return this.#e.hasMatches}get isLoading(){return this.#e.isLoading}get disabled(){return this.#e.disabled}get state(){return this.#e.state}get updatedAt(){return this.#e.updatedAt}get events(){return this.#e.events}get matches(){return this.#e.matches}get search(){let e=this.#e.search;return{rule:e.rule,searchTerm:e.searchTerm,hasSearchTerm:e.hasSearchTerm,hasSearchRule:e.hasSearchRule,setSearchTerm:e.setSearchTerm.bind(e),reset:e.reset.bind(e),test:e.test.bind(e)}}get filters(){let e=this.#e.filters;return{values:e.values,raw:e.raw,activeRules:e.activeRules,rules:e.rules,isActive:e.isRuleActive.bind(e),get:e.get.bind(e),add:e.add.bind(e),has:e.has.bind(e),getRule:e.getRule.bind(e),toggle:e.toggle.bind(e),set:e.set.bind(e),delete:e.delete.bind(e),reset:e.reset.bind(e),test:e.test.bind(e),testRule:e.testRule.bind(e),testRuleOptions:e.testRuleOptions.bind(e)}}get sortBy(){let e=this.#e.sortBy;return{activeRule:e.activeRule,sortDirection:e.sortDirection,userHasSetSortDirection:e.userHasSetSortDirection,rules:e.rules,set:e.set.bind(e),toggle:e.toggle.bind(e),isRuleActive:e.isRuleActive.bind(e),reset:e.reset.bind(e),setSortDirection:e.setSortDirection.bind(e),cycleSortDirection:e.cycleSortDirection.bind(e),toggleSortDirection:e.toggleSortDirection.bind(e)}}get groupBy(){let e=this.#e.groupBy;return{activeRule:e.activeRule,requireGroup:e.requireGroup,rules:e.rules,groupBySortDirection:e.groupBySortDirection,set:e.set.bind(e),toggle:e.toggle.bind(e),setGroupSortDirection:e.setGroupSortDirection.bind(e),reset:e.reset.bind(e)}}get pagination(){let e=this.#e.pagination;return{page:e.page,offset:e.offset,numItemsPerPage:e.numItemsPerPage,numTotalItems:e.numTotalItems,lastPage:e.lastPage,isPaginated:e.numItemsPerPage!==void 0,setPage:e.setPage.bind(e),setNumItemsPerPage:e.setNumItemsPerPage.bind(e)}}setItems(e){return this.#e.setItems(e)}setIsLoading(e){return this.#e.setIsLoading(e)}setIsDisabled(e){return this.#e.setIsDisabled(e)}setRules(e){return this.#e.setRules(e)}setContext(e){return this.#e.setContext(e)}test(e,t=!1){return this.#e.test(e,t)}getRule(e){return this.#e.getRule(e)}toJSON(){return this.#e.toJSON()}};function $({items:n,rules:r,effects:i,initialSearchTerm:a,initialSortBy:o,initialSortDirection:s,initialGroupBy:c,initialGroupBySortDirection:l,initialFilters:u,context:d,isLoading:f,disabled:m,page:h,numItemsPerPage:g,requireGroup:_,ignoreSortByRulesWhileSearchRuleIsActive:v,onInit:y,onReady:b,onFirstUserInteraction:x,onChange:S,controllerRef:C,children:w}){let[T,E]=(0,e.useState)(Date.now()),[D]=(0,e.useState)(()=>{let e=new he(n,{rules:r,effects:i,initialSearchTerm:a,initialSortBy:o,initialSortDirection:s,initialGroupBy:c,initialGroupBySortDirection:l,initialFilters:u,context:d,isLoading:f,disabled:m,page:h,numItemsPerPage:g,requireGroup:_,ignoreSortByRulesWhileSearchRuleIsActive:v,onInit:y,onReady:b,onFirstUserInteraction:x,onChange:S});return e.events.on(N.SYNC_UPDATED_AT,e=>E(e)),e});D.setItems(n),D.setIsLoading(f),D.setIsDisabled(m),D.setRules(r),d!==void 0&&D.setContext(d),h!==void 0&&D.pagination.setPage(h),g!==void 0&&D.pagination.setNumItemsPerPage(g),(0,e.useImperativeHandle)(C,()=>D,[D]);let O=(0,e.useMemo)(()=>[D,T],[D,T]);return(0,t.jsx)(p.Provider,{value:O,children:w})}$.Content=b,$.SearchTermHaystack=j;function ge(){return(0,e.useRef)(null)}exports.Finder=$,exports.StringMatch=A,exports.filterRule=a,exports.finderRuleset=r,exports.groupByRule=s,exports.ruleEffect=c,exports.searchEffect=l,exports.searchRule=i,exports.sortByRule=o,exports.transformFilterToBoolean=d,exports.transformFilterToMultiple=f,exports.transformFilterToSingleValue=u,exports.useFinder=m,exports.useFinderRef=ge;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import * as react0 from "react";
|
|
2
|
+
import { ElementType, PropsWithChildren, ReactElement, ReactNode, RefObject } from "react";
|
|
3
|
+
import * as react_jsx_runtime4 from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/core/types/rule-types.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Select a property from the item to sort by.
|
|
8
|
+
*/
|
|
9
|
+
type FinderPropertySelector<FItem, FContext = any> = (item: FItem, context: FContext) => string | number;
|
|
10
|
+
interface Rule {
|
|
11
|
+
id: string;
|
|
12
|
+
debounceMilliseconds?: number;
|
|
13
|
+
label?: string;
|
|
14
|
+
hidden?: boolean;
|
|
15
|
+
}
|
|
16
|
+
type RuleDefinition<FItem = any, FContext = any> = SearchRuleDefinition<FItem, FContext> | FilterRuleDefinition<FItem, FContext> | SortByRuleDefinition<FItem, FContext> | GroupByRuleDefinition<FItem, FContext>;
|
|
17
|
+
interface SearchRuleDefinition<FItem = any, FContext = any> extends Omit<Rule, "id"> {
|
|
18
|
+
id?: string;
|
|
19
|
+
searchFn?: (item: FItem, context: FContext) => string | string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Describes the display of a filter or sort option.
|
|
23
|
+
*/
|
|
24
|
+
interface FilterOption<FValue = any> {
|
|
25
|
+
label?: string;
|
|
26
|
+
value: FValue;
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
}
|
|
29
|
+
interface FilterRuleDefinition<FItem = any, FValue = any, FContext = any> extends Rule {
|
|
30
|
+
filterFn: (item: FItem, value: FValue, context: FContext) => boolean;
|
|
31
|
+
required?: boolean;
|
|
32
|
+
strictOptions?: boolean;
|
|
33
|
+
multiple?: boolean;
|
|
34
|
+
boolean?: boolean;
|
|
35
|
+
options?: FilterOption<FValue>[] | ((options: {
|
|
36
|
+
items: FItem[];
|
|
37
|
+
context: FContext;
|
|
38
|
+
}) => FilterOption<FValue>[]);
|
|
39
|
+
}
|
|
40
|
+
type AnyFilterRuleDefinition<FItem = any, FValue = any> = Omit<FilterRuleDefinition<FItem, FValue>, "options">;
|
|
41
|
+
interface FilterRuleWithBooleanValue<FItem = any, FValue = boolean, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
|
|
42
|
+
multiple?: false;
|
|
43
|
+
boolean: true;
|
|
44
|
+
defaultValue?: boolean;
|
|
45
|
+
options?: never;
|
|
46
|
+
}
|
|
47
|
+
interface FilterRuleWithSingleValue<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
|
|
48
|
+
multiple?: false;
|
|
49
|
+
boolean?: false;
|
|
50
|
+
defaultValue?: FValue;
|
|
51
|
+
}
|
|
52
|
+
interface FilterRuleWithMultipleValues<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
|
|
53
|
+
multiple: true;
|
|
54
|
+
boolean?: false;
|
|
55
|
+
defaultValue?: FValue[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A hydrated filter has rendered any option generator functions, and narrowed ambiguous properties from FilterRule.
|
|
59
|
+
*/
|
|
60
|
+
interface HydratedFilterRuleDefinition<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
|
|
61
|
+
options?: FilterOption<FValue>[];
|
|
62
|
+
multiple: boolean;
|
|
63
|
+
boolean: boolean;
|
|
64
|
+
_isHydrated: true;
|
|
65
|
+
}
|
|
66
|
+
interface SortByRuleDefinition<FItem = any, FContext = any> extends Rule {
|
|
67
|
+
sortFn: FinderPropertySelector<FItem, FContext> | FinderPropertySelector<FItem, FContext>[];
|
|
68
|
+
defaultSortDirection?: SortDirection;
|
|
69
|
+
}
|
|
70
|
+
interface GroupByRuleDefinition<FItem = any, FContext = any> extends Rule {
|
|
71
|
+
groupFn: FinderPropertySelector<FItem, FContext>;
|
|
72
|
+
sortGroupFn?: FinderPropertySelector<FinderResultGroup<FItem>, FContext>;
|
|
73
|
+
defaultGroupSortDirection?: SortDirection;
|
|
74
|
+
sticky?: {
|
|
75
|
+
header?: string | string[];
|
|
76
|
+
footer?: string | string[];
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
interface FilterTestOptions {
|
|
80
|
+
rules: HydratedFilterRuleDefinition[];
|
|
81
|
+
values?: Record<string, any>;
|
|
82
|
+
isAdditive?: boolean;
|
|
83
|
+
}
|
|
84
|
+
interface FilterTestRuleOptions {
|
|
85
|
+
rule: string | AnyFilterRuleDefinition;
|
|
86
|
+
value: any;
|
|
87
|
+
isAdditive?: boolean;
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/core/core-constants.d.ts
|
|
91
|
+
declare const EVENTS: {
|
|
92
|
+
readonly INIT: "init";
|
|
93
|
+
readonly FIRST_USER_INTERACTION: "firstUserInteraction";
|
|
94
|
+
readonly READY: "ready";
|
|
95
|
+
readonly CHANGE: "change";
|
|
96
|
+
readonly SET_ITEMS: "setItems";
|
|
97
|
+
readonly SET_IS_LOADING: "setIsLoading";
|
|
98
|
+
readonly SET_IS_DISABLED: "setIsDisabled";
|
|
99
|
+
readonly SET_CONTEXT: "setContext";
|
|
100
|
+
readonly SET_SEARCH_TERM: "setSearchTerm";
|
|
101
|
+
readonly RESET_SEARCH_TERM: "resetSearchTerm";
|
|
102
|
+
readonly SET_FILTER: "setFilter";
|
|
103
|
+
readonly RESET_FILTERS: "resetFilters";
|
|
104
|
+
readonly SET_SORT_BY: "setSortBy";
|
|
105
|
+
readonly SET_SORT_BY_DIRECTION: "setSortDirection";
|
|
106
|
+
readonly SET_GROUP_BY: "setGroupBy";
|
|
107
|
+
readonly SET_GROUP_SORT_BY_DIRECTION: "setGroupBySortDirection";
|
|
108
|
+
readonly SET_PAGE: "setPage";
|
|
109
|
+
readonly SET_NUM_ITEMS_PER_PAGE: "setNumItemsPerPage";
|
|
110
|
+
readonly SYNC_UPDATED_AT: "syncUpdatedAt";
|
|
111
|
+
};
|
|
112
|
+
declare const EVENT_SOURCE: {
|
|
113
|
+
readonly CORE: "core";
|
|
114
|
+
readonly SEARCH: "search";
|
|
115
|
+
readonly FILTERS: "filters";
|
|
116
|
+
readonly GROUP_BY: "groupBy";
|
|
117
|
+
readonly SORT_BY: "sortBy";
|
|
118
|
+
readonly PAGINATION: "pagination";
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region src/core/types/event-types.d.ts
|
|
122
|
+
type FinderTouchSource = (typeof EVENT_SOURCE)[keyof typeof EVENT_SOURCE];
|
|
123
|
+
interface FinderSharedEventProps {
|
|
124
|
+
source: string;
|
|
125
|
+
event: FinderEventName;
|
|
126
|
+
timestamp: number;
|
|
127
|
+
instance: FinderCore;
|
|
128
|
+
}
|
|
129
|
+
interface FinderInitEvent extends FinderSharedEventProps {
|
|
130
|
+
source: "core";
|
|
131
|
+
event: "init";
|
|
132
|
+
}
|
|
133
|
+
interface FinderFirstUserInteractionEvent extends FinderSharedEventProps {
|
|
134
|
+
source: "core";
|
|
135
|
+
event: "firstUserInteraction";
|
|
136
|
+
}
|
|
137
|
+
interface FinderReadyEvent extends FinderSharedEventProps {
|
|
138
|
+
source: "core";
|
|
139
|
+
event: "ready";
|
|
140
|
+
}
|
|
141
|
+
type FinderEvent = FinderInitEvent | FinderFirstUserInteractionEvent | FinderReadyEvent | FinderChangeEvent;
|
|
142
|
+
type FinderOnInitCallback = (event: FinderInitEvent) => void;
|
|
143
|
+
type FinderOnReadyCallback = (event: FinderReadyEvent) => void;
|
|
144
|
+
type FinderOnFirstUserInteractCallback = (event: FinderFirstUserInteractionEvent) => void;
|
|
145
|
+
type FinderOnChangeCallback = (event: FinderChangeEvent) => void;
|
|
146
|
+
/**
|
|
147
|
+
* Internal communication between mixins and core
|
|
148
|
+
*/
|
|
149
|
+
interface FinderTouchEvent {
|
|
150
|
+
source: FinderTouchSource;
|
|
151
|
+
event: FinderEventName;
|
|
152
|
+
current: any;
|
|
153
|
+
initial: any;
|
|
154
|
+
rule?: RuleDefinition;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* External type that consumers will receive
|
|
158
|
+
*/
|
|
159
|
+
type FinderChangeEvent = FinderTouchEvent & FinderSharedEventProps;
|
|
160
|
+
type FinderEventName = (typeof EVENTS)[keyof typeof EVENTS];
|
|
161
|
+
//#endregion
|
|
162
|
+
//#region src/core/finder-core.d.ts
|
|
163
|
+
/**
|
|
164
|
+
* This thin wrapper around FinderCoreImplementation defines the mixin interfaces and hides private methods.
|
|
165
|
+
*/
|
|
166
|
+
declare class FinderCore<FItem = any, FContext = any> {
|
|
167
|
+
#private;
|
|
168
|
+
constructor(items: FItem[] | null | undefined, options: FinderConstructorOptions<FItem, FContext>);
|
|
169
|
+
get items(): FItem[];
|
|
170
|
+
get context(): FContext;
|
|
171
|
+
get isReady(): boolean;
|
|
172
|
+
get isEmpty(): boolean;
|
|
173
|
+
get hasMatches(): boolean;
|
|
174
|
+
get isLoading(): boolean;
|
|
175
|
+
get disabled(): boolean;
|
|
176
|
+
get state(): "loading" | "empty" | "groups" | "items" | "noMatches";
|
|
177
|
+
get updatedAt(): number;
|
|
178
|
+
get events(): {
|
|
179
|
+
on: (event: FinderEventName, callback: EventCallback) => void;
|
|
180
|
+
off: (event: FinderEventName, callback: EventCallback) => void;
|
|
181
|
+
silently: (callback: EventCallback) => void;
|
|
182
|
+
isSilent: () => boolean;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Mixin interfaces
|
|
186
|
+
*/
|
|
187
|
+
get matches(): ResultSnapshot<FItem>;
|
|
188
|
+
get search(): {
|
|
189
|
+
rule: SearchRuleDefinition<unknown, any> | undefined;
|
|
190
|
+
searchTerm: string;
|
|
191
|
+
hasSearchTerm: boolean;
|
|
192
|
+
hasSearchRule: boolean;
|
|
193
|
+
setSearchTerm: (value: string) => void;
|
|
194
|
+
reset: () => void;
|
|
195
|
+
test: (searchTerm: string, isAdditive?: boolean) => FItem[];
|
|
196
|
+
};
|
|
197
|
+
get filters(): {
|
|
198
|
+
values: Record<string, any>;
|
|
199
|
+
raw: Record<string, any>;
|
|
200
|
+
activeRules: HydratedFilterRuleDefinition<any, any, any>[];
|
|
201
|
+
rules: HydratedFilterRuleDefinition<any, any, any>[];
|
|
202
|
+
isActive: (identifier: string | AnyFilterRuleDefinition<any, any>) => boolean;
|
|
203
|
+
get: (identifier: string | AnyFilterRuleDefinition<any, any>) => any;
|
|
204
|
+
add: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
|
|
205
|
+
has: (identifier: string | AnyFilterRuleDefinition<any, any>, optionValue?: any) => boolean;
|
|
206
|
+
getRule: (identifier: string | AnyFilterRuleDefinition<any, any>) => HydratedFilterRuleDefinition<any, any, any>;
|
|
207
|
+
toggle: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
|
|
208
|
+
set: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, value?: FValue | FValue[]) => void;
|
|
209
|
+
delete: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
|
|
210
|
+
reset: () => void;
|
|
211
|
+
test: (options: FilterTestOptions) => any[];
|
|
212
|
+
testRule: ({
|
|
213
|
+
rule: identifier,
|
|
214
|
+
value,
|
|
215
|
+
...options
|
|
216
|
+
}: FilterTestRuleOptions) => any[];
|
|
217
|
+
testRuleOptions: (identifier: string | AnyFilterRuleDefinition<any, any>, isAdditive?: boolean) => Map<any, any>;
|
|
218
|
+
};
|
|
219
|
+
get sortBy(): {
|
|
220
|
+
activeRule: SortByRuleDefinition<unknown, any> | undefined;
|
|
221
|
+
sortDirection: SortDirection;
|
|
222
|
+
userHasSetSortDirection: boolean;
|
|
223
|
+
rules: SortByRuleDefinition<unknown, any>[];
|
|
224
|
+
set: (identifier?: string | SortByRuleDefinition, incomingSortDirection?: SortDirection) => void;
|
|
225
|
+
toggle: (identifier: string | SortByRuleDefinition) => void;
|
|
226
|
+
isRuleActive: (identifier: string | SortByRuleDefinition) => boolean;
|
|
227
|
+
reset: () => void;
|
|
228
|
+
setSortDirection: (incomingSortDirection?: SortDirection) => void;
|
|
229
|
+
cycleSortDirection: () => void;
|
|
230
|
+
toggleSortDirection: () => void;
|
|
231
|
+
};
|
|
232
|
+
get groupBy(): {
|
|
233
|
+
activeRule: GroupByRuleDefinition<unknown, any> | undefined;
|
|
234
|
+
requireGroup: boolean;
|
|
235
|
+
rules: GroupByRuleDefinition<unknown, any>[];
|
|
236
|
+
groupBySortDirection: SortDirection | undefined;
|
|
237
|
+
set: (identifier?: string | GroupByRuleDefinition<any, any>) => void;
|
|
238
|
+
toggle: (identifier: string | GroupByRuleDefinition<any, any>) => void;
|
|
239
|
+
setGroupSortDirection: (direction?: SortDirection) => void;
|
|
240
|
+
reset: () => void;
|
|
241
|
+
};
|
|
242
|
+
get pagination(): {
|
|
243
|
+
page: number;
|
|
244
|
+
offset: number;
|
|
245
|
+
numItemsPerPage: number | undefined;
|
|
246
|
+
numTotalItems: number;
|
|
247
|
+
lastPage: number | undefined;
|
|
248
|
+
isPaginated: boolean;
|
|
249
|
+
setPage: (value: number) => void;
|
|
250
|
+
setNumItemsPerPage: (value?: number) => void;
|
|
251
|
+
};
|
|
252
|
+
/**
|
|
253
|
+
* Mutators
|
|
254
|
+
*/
|
|
255
|
+
setItems(items: FItem[] | null | undefined): void;
|
|
256
|
+
setIsLoading(value?: boolean): void;
|
|
257
|
+
setIsDisabled(value?: boolean): void;
|
|
258
|
+
setRules(definitions: RuleDefinition<FItem>[]): void;
|
|
259
|
+
setContext(context: FContext): void;
|
|
260
|
+
/**
|
|
261
|
+
* Utils
|
|
262
|
+
*/
|
|
263
|
+
test(mixins: SnapshotSerializedMixins, isAdditive?: boolean): FItem[];
|
|
264
|
+
getRule<T extends RuleDefinition<FItem>>(identifier: string | RuleDefinition<FItem>): T | undefined;
|
|
265
|
+
toJSON(): Omit<FinderConstructorOptions<FItem, any>, "rules">;
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
268
|
+
//#region src/core/types/effect-types.d.ts
|
|
269
|
+
interface RuleEffect<FItem = any, FContext = any> {
|
|
270
|
+
rules: string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[] | ((items: FItem[], context: FContext) => string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[]);
|
|
271
|
+
onChange: (instance: FinderCore<FItem, FContext>, rule: RuleDefinition<FItem>) => void;
|
|
272
|
+
}
|
|
273
|
+
interface SearchEffect<FItem = any, FContext = any> {
|
|
274
|
+
haystack: string | string[] | ((items: FItem[], context: FContext) => string | string[]);
|
|
275
|
+
onChange: (instance: FinderCore<FItem, FContext>, searchTerm: string) => void;
|
|
276
|
+
}
|
|
277
|
+
//#endregion
|
|
278
|
+
//#region src/core/types/core-types.d.ts
|
|
279
|
+
interface FinderConstructorOptions<FItem, FContext = any> {
|
|
280
|
+
rules: RuleDefinition<FItem>[];
|
|
281
|
+
effects?: (RuleEffect | SearchEffect)[];
|
|
282
|
+
context?: FContext;
|
|
283
|
+
isLoading?: boolean;
|
|
284
|
+
disabled?: boolean;
|
|
285
|
+
initialSearchTerm?: string;
|
|
286
|
+
initialSortBy?: string;
|
|
287
|
+
initialSortDirection?: SortDirection;
|
|
288
|
+
initialGroupBy?: string;
|
|
289
|
+
initialGroupBySortDirection?: SortDirection;
|
|
290
|
+
initialFilters?: Record<string, any>;
|
|
291
|
+
ignoreSortByRulesWhileSearchRuleIsActive?: boolean;
|
|
292
|
+
requireGroup?: boolean;
|
|
293
|
+
page?: number;
|
|
294
|
+
numItemsPerPage?: number;
|
|
295
|
+
onInit?: FinderOnInitCallback;
|
|
296
|
+
onReady?: FinderOnReadyCallback;
|
|
297
|
+
onFirstUserInteraction?: FinderOnFirstUserInteractCallback;
|
|
298
|
+
onChange?: FinderOnChangeCallback;
|
|
299
|
+
}
|
|
300
|
+
interface FinderResultGroup<FItem> {
|
|
301
|
+
id: string;
|
|
302
|
+
items: FItem[];
|
|
303
|
+
}
|
|
304
|
+
type SortDirection = "asc" | "desc" | ("asc" | "desc")[];
|
|
305
|
+
interface ResultSnapshot<FItem> {
|
|
306
|
+
items?: FItem[];
|
|
307
|
+
groups?: FinderResultGroup<FItem>[];
|
|
308
|
+
numMatchedItems: number;
|
|
309
|
+
numTotalItems: number;
|
|
310
|
+
hasGroupByRule: boolean;
|
|
311
|
+
}
|
|
312
|
+
type EventCallback = (payload?: any) => void;
|
|
313
|
+
interface SnapshotSerializedMixins {
|
|
314
|
+
search?: SerializedSearchMixin;
|
|
315
|
+
filters?: SerializedFiltersMixin;
|
|
316
|
+
sortBy?: SerializedSortByMixin;
|
|
317
|
+
pagination?: SerializedPaginationMixin;
|
|
318
|
+
groupBy?: SerializedGroupByMixin;
|
|
319
|
+
}
|
|
320
|
+
interface SerializedSearchMixin {
|
|
321
|
+
searchTerm: string;
|
|
322
|
+
rule?: SearchRuleDefinition;
|
|
323
|
+
}
|
|
324
|
+
interface SerializedFiltersMixin {
|
|
325
|
+
rules: HydratedFilterRuleDefinition[];
|
|
326
|
+
values: Record<string, any>;
|
|
327
|
+
}
|
|
328
|
+
interface SerializedSortByMixin {
|
|
329
|
+
rule?: SortByRuleDefinition;
|
|
330
|
+
sortDirection?: SortDirection;
|
|
331
|
+
}
|
|
332
|
+
interface SerializedPaginationMixin {
|
|
333
|
+
page: number;
|
|
334
|
+
numItemsPerPage?: number;
|
|
335
|
+
}
|
|
336
|
+
interface SerializedGroupByMixin {
|
|
337
|
+
rule?: GroupByRuleDefinition;
|
|
338
|
+
groupBySortDirection?: SortDirection;
|
|
339
|
+
}
|
|
340
|
+
interface PaginationMixinInterface {
|
|
341
|
+
page: number;
|
|
342
|
+
offset: number;
|
|
343
|
+
numItemsPerPage: number | undefined;
|
|
344
|
+
numTotalItems: number;
|
|
345
|
+
lastPage: number | undefined;
|
|
346
|
+
isPaginated: boolean;
|
|
347
|
+
setPage: (value: number) => void;
|
|
348
|
+
setNumItemsPerPage: (value: number) => void;
|
|
349
|
+
}
|
|
350
|
+
//#endregion
|
|
351
|
+
//#region src/core/types/string-match-types.d.ts
|
|
352
|
+
/**
|
|
353
|
+
* These values all point to the transformed haystack.
|
|
354
|
+
*/
|
|
355
|
+
interface StringMatchSegment {
|
|
356
|
+
index: number;
|
|
357
|
+
length: number;
|
|
358
|
+
is_match: boolean;
|
|
359
|
+
value: string;
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
//#region src/react/types/react-types.d.ts
|
|
363
|
+
interface FinderProps<FItem, FContext> extends FinderConstructorOptions<FItem, FContext>, PropsWithChildren {
|
|
364
|
+
items: FItem[] | undefined | null;
|
|
365
|
+
controllerRef?: RefObject<FinderCore<FItem, FContext> | null>;
|
|
366
|
+
}
|
|
367
|
+
interface FinderContentProps<FItem = any, FContext = any> {
|
|
368
|
+
empty: {
|
|
369
|
+
pagination: PaginationMixinInterface;
|
|
370
|
+
context: FContext;
|
|
371
|
+
};
|
|
372
|
+
loading: {
|
|
373
|
+
pagination: PaginationMixinInterface;
|
|
374
|
+
context: FContext;
|
|
375
|
+
};
|
|
376
|
+
noMatches: {
|
|
377
|
+
pagination: PaginationMixinInterface;
|
|
378
|
+
context: FContext;
|
|
379
|
+
};
|
|
380
|
+
items: {
|
|
381
|
+
items: FItem[];
|
|
382
|
+
pagination: PaginationMixinInterface;
|
|
383
|
+
context: FContext;
|
|
384
|
+
};
|
|
385
|
+
groups: {
|
|
386
|
+
groups: FinderResultGroup<FItem>[];
|
|
387
|
+
pagination: PaginationMixinInterface;
|
|
388
|
+
context: FContext;
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
interface StringMatchSegmentProps {
|
|
392
|
+
segment: StringMatchSegment;
|
|
393
|
+
segmentIndex: number;
|
|
394
|
+
}
|
|
395
|
+
type FinderSearchTermProp = keyof HTMLElementTagNameMap | ElementType | ElementType<StringMatchSegmentProps>;
|
|
396
|
+
//#endregion
|
|
397
|
+
//#region src/core/utils/rule-type-enforcers.d.ts
|
|
398
|
+
/**
|
|
399
|
+
* Enforce structure for an array of rule of mixed types.
|
|
400
|
+
*/
|
|
401
|
+
declare function finderRuleset<FItem, FContext = any>(rules: RuleDefinition<FItem, FContext>[]): RuleDefinition<FItem, FContext>[];
|
|
402
|
+
declare function searchRule<FItem, FContext = any>(rule: SearchRuleDefinition<FItem, FContext>): SearchRuleDefinition<FItem, FContext>;
|
|
403
|
+
declare function filterRule<FItem, FValue = any, FContext = any, T = FilterRuleWithMultipleValues<FItem, FValue, FContext>>(rule: T): FilterRuleWithMultipleValues<FItem, FValue>;
|
|
404
|
+
declare function filterRule<FItem, FValue = boolean, FContext = any, T = FilterRuleWithBooleanValue<FItem, FValue, FContext>>(rule: T): FilterRuleWithBooleanValue<FItem, FValue>;
|
|
405
|
+
declare function filterRule<FItem, FValue = any, FContext = any, T = FilterRuleWithSingleValue<FItem, FValue, FContext>>(rule: T): FilterRuleWithSingleValue<FItem, FValue>;
|
|
406
|
+
declare function sortByRule<FItem, FContext = any>(rule: SortByRuleDefinition<FItem, FContext>): SortByRuleDefinition<FItem, FContext>;
|
|
407
|
+
declare function groupByRule<FItem, FContext = any>(rule: GroupByRuleDefinition<FItem, FContext>): GroupByRuleDefinition<FItem, FContext>;
|
|
408
|
+
declare function ruleEffect<FItem, FContext = any>(rules: string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[] | ((items: FItem[], context: FContext) => string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[]), onChange: (instance: FinderCore<FItem, FContext>, rule: RuleDefinition) => void): RuleEffect<FItem, FContext>;
|
|
409
|
+
declare function searchEffect<FItem, FContext = any>(haystack: string | string[] | ((items: FItem[], context: FContext) => string | string[]), onChange: (instance: FinderCore<FItem, FContext>, searchTerm: string) => void): SearchEffect<FItem, FContext>;
|
|
410
|
+
declare function transformFilterToSingleValue<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithMultipleValues<FItem, FValue, FContext>;
|
|
411
|
+
declare function transformFilterToBoolean<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithBooleanValue<FItem, boolean, FContext>;
|
|
412
|
+
declare function transformFilterToMultiple<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithMultipleValues<FItem, FValue, FContext>;
|
|
413
|
+
//#endregion
|
|
414
|
+
//#region src/react/hooks/use-finder.d.ts
|
|
415
|
+
declare function useFinder<FItem = any, FContext = undefined>(): FinderCore<FItem, FContext>;
|
|
416
|
+
//#endregion
|
|
417
|
+
//#region src/react/components/finder-content-loading.d.ts
|
|
418
|
+
interface FinderContentLoadingProps<FItem, FContext> {
|
|
419
|
+
children: ElementType<FinderContentProps<FItem, FContext>["loading"]> | ReactElement<FinderContentProps<FItem, FContext>["loading"]> | Iterable<ReactNode>;
|
|
420
|
+
}
|
|
421
|
+
declare function FinderContentLoading<FItem, FContext>({
|
|
422
|
+
children: Component
|
|
423
|
+
}: FinderContentLoadingProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
|
|
424
|
+
//#endregion
|
|
425
|
+
//#region src/react/components/finder-content-empty.d.ts
|
|
426
|
+
interface FinderContentEmptyProps<FItem, FContext> {
|
|
427
|
+
children: ElementType<FinderContentProps<FItem, FContext>["empty"]> | ReactElement<FinderContentProps<FItem, FContext>["empty"]> | Iterable<ReactNode>;
|
|
428
|
+
}
|
|
429
|
+
declare function FinderContentEmpty<FItem = any, FContext = any>({
|
|
430
|
+
children: Component
|
|
431
|
+
}: FinderContentEmptyProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
|
|
432
|
+
//#endregion
|
|
433
|
+
//#region src/react/components/finder-content-no-matches.d.ts
|
|
434
|
+
interface FinderContentNoMatchesProps<FItem, FContext> {
|
|
435
|
+
children: ElementType<FinderContentProps<FItem, FContext>["noMatches"]> | ReactElement<FinderContentProps<FItem, FContext>["noMatches"]> | Iterable<ReactNode>;
|
|
436
|
+
}
|
|
437
|
+
declare function FinderContentNoMatches<FItem = any, FContext = any>({
|
|
438
|
+
children: Component
|
|
439
|
+
}: FinderContentNoMatchesProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
|
|
440
|
+
//#endregion
|
|
441
|
+
//#region src/react/components/finder-content-items.d.ts
|
|
442
|
+
interface FinderContentItemsProps<FItem, FContext> {
|
|
443
|
+
children: ElementType<FinderContentProps<FItem, FContext>["items"]> | ReactElement<FinderContentProps<FItem, FContext>["items"]> | Iterable<ReactNode>;
|
|
444
|
+
}
|
|
445
|
+
declare function FinderContentItems<FItem = any, FContext = any>({
|
|
446
|
+
children: Component
|
|
447
|
+
}: FinderContentItemsProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
|
|
448
|
+
//#endregion
|
|
449
|
+
//#region src/react/components/finder-content-groups.d.ts
|
|
450
|
+
interface FinderContentGroupsProps<FItem, FContext> {
|
|
451
|
+
children: ElementType<FinderContentProps<FItem, FContext>["groups"]> | ReactElement<FinderContentProps<FItem, FContext>["groups"]> | Iterable<ReactNode>;
|
|
452
|
+
}
|
|
453
|
+
declare function FinderContentGroups<FItem = any, FContext = any>({
|
|
454
|
+
children: Component
|
|
455
|
+
}: FinderContentGroupsProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
|
|
456
|
+
//#endregion
|
|
457
|
+
//#region src/react/components/finder-content.d.ts
|
|
458
|
+
interface FinderContentContainerProps<FItem, FContext> {
|
|
459
|
+
children: {
|
|
460
|
+
loading?: ElementType<FinderContentProps<FItem, FContext>["loading"]> | ReactElement<FinderContentProps<FItem, FContext>["loading"]> | Iterable<ReactNode>;
|
|
461
|
+
empty?: ElementType<FinderContentProps<FItem, FContext>["empty"]> | ReactElement<FinderContentProps<FItem, FContext>["empty"]> | Iterable<ReactNode>;
|
|
462
|
+
noMatches?: ElementType<FinderContentProps<FItem, FContext>["noMatches"]> | ReactElement<FinderContentProps<FItem, FContext>["noMatches"]> | Iterable<ReactNode>;
|
|
463
|
+
items?: ElementType<FinderContentProps<FItem, FContext>["items"]> | ReactElement<FinderContentProps<FItem, FContext>["items"]> | Iterable<ReactNode>;
|
|
464
|
+
groups?: ElementType<FinderContentProps<FItem, FContext>["groups"]> | ReactElement<FinderContentProps<FItem, FContext>["groups"]> | Iterable<ReactNode>;
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
declare function FinderContent<FItem = any, FContext = any>({
|
|
468
|
+
children: renderProps
|
|
469
|
+
}: FinderContentContainerProps<FItem, FContext>): (react_jsx_runtime4.JSX.Element | undefined)[];
|
|
470
|
+
declare namespace FinderContent {
|
|
471
|
+
var Loading: typeof FinderContentLoading;
|
|
472
|
+
var Empty: typeof FinderContentEmpty;
|
|
473
|
+
var NoMatches: typeof FinderContentNoMatches;
|
|
474
|
+
var Items: typeof FinderContentItems;
|
|
475
|
+
var Groups: typeof FinderContentGroups;
|
|
476
|
+
}
|
|
477
|
+
//#endregion
|
|
478
|
+
//#region src/react/components/finder-search-term-haystack.d.ts
|
|
479
|
+
interface FinderSearchTermHaystackProps {
|
|
480
|
+
children: string;
|
|
481
|
+
Match?: FinderSearchTermProp;
|
|
482
|
+
Miss?: FinderSearchTermProp;
|
|
483
|
+
}
|
|
484
|
+
declare function FinderSearchTermHaystack({
|
|
485
|
+
Match,
|
|
486
|
+
Miss,
|
|
487
|
+
children: haystack
|
|
488
|
+
}: FinderSearchTermHaystackProps): string | react_jsx_runtime4.JSX.Element;
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region src/react/components/finder.d.ts
|
|
491
|
+
declare function Finder<FItem = any, FContext = any>({
|
|
492
|
+
items,
|
|
493
|
+
rules,
|
|
494
|
+
effects,
|
|
495
|
+
initialSearchTerm,
|
|
496
|
+
initialSortBy,
|
|
497
|
+
initialSortDirection,
|
|
498
|
+
initialGroupBy,
|
|
499
|
+
initialGroupBySortDirection,
|
|
500
|
+
initialFilters,
|
|
501
|
+
context,
|
|
502
|
+
isLoading,
|
|
503
|
+
disabled,
|
|
504
|
+
page,
|
|
505
|
+
numItemsPerPage,
|
|
506
|
+
requireGroup,
|
|
507
|
+
ignoreSortByRulesWhileSearchRuleIsActive,
|
|
508
|
+
onInit,
|
|
509
|
+
onReady,
|
|
510
|
+
onFirstUserInteraction,
|
|
511
|
+
onChange,
|
|
512
|
+
controllerRef,
|
|
513
|
+
children
|
|
514
|
+
}: FinderProps<FItem, FContext>): react_jsx_runtime4.JSX.Element;
|
|
515
|
+
declare namespace Finder {
|
|
516
|
+
var Content: typeof FinderContent;
|
|
517
|
+
var SearchTermHaystack: typeof FinderSearchTermHaystack;
|
|
518
|
+
}
|
|
519
|
+
//#endregion
|
|
520
|
+
//#region src/react/hooks/use-finder-ref.d.ts
|
|
521
|
+
declare function useFinderRef<FItem = any, FContext = any>(): react0.RefObject<FinderCore<FItem, FContext> | null>;
|
|
522
|
+
//#endregion
|
|
523
|
+
//#region src/react/components/string-match.d.ts
|
|
524
|
+
interface StringMatchProps {
|
|
525
|
+
needle: string;
|
|
526
|
+
haystack: string;
|
|
527
|
+
Match?: FinderSearchTermProp;
|
|
528
|
+
Miss?: FinderSearchTermProp;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Split a string into result segment components .
|
|
532
|
+
*/
|
|
533
|
+
declare function StringMatch({
|
|
534
|
+
needle,
|
|
535
|
+
haystack,
|
|
536
|
+
Match,
|
|
537
|
+
Miss
|
|
538
|
+
}: StringMatchProps): string | (string | react_jsx_runtime4.JSX.Element)[];
|
|
539
|
+
//#endregion
|
|
540
|
+
export { type AnyFilterRuleDefinition, type FilterOption, type FilterRuleDefinition, Finder, type FinderChangeEvent, type FinderConstructorOptions, type FinderContentProps, type FinderEvent, type FinderFirstUserInteractionEvent, type FinderInitEvent, type FinderProps, type FinderReadyEvent, type FinderResultGroup, type GroupByRuleDefinition, type RuleDefinition, type RuleEffect, type SearchEffect, type SearchRuleDefinition, type SortByRuleDefinition, type SortDirection, StringMatch, type StringMatchSegmentProps, filterRule, finderRuleset, groupByRule, ruleEffect, searchEffect, searchRule, sortByRule, transformFilterToBoolean, transformFilterToMultiple, transformFilterToSingleValue, useFinder, useFinderRef };
|