{"version":3,"file":"tablor-core-beta.mjs","sources":["../../../projects/tablor-core-beta/src/lib/utils/items-utils.ts","../../../projects/tablor-core-beta/src/lib/stores/items-store/items-store.ts","../../../projects/tablor-core-beta/src/lib/stores/fields-store/fields-store.ts","../../../projects/tablor-core-beta/src/lib/selector/selector.ts","../../../projects/tablor-core-beta/src/lib/searcher/string-query-searcher/string-query-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/date-ranges-searcher/date-ranges-searcher-utils.ts","../../../projects/tablor-core-beta/src/lib/searcher/date-ranges-searcher/date-range-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/numbers-range-searcher/number-ranges-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/custom-searcher/custom-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/void-searcher/void-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/exact-values-searcher/exact-values-searcher.ts","../../../projects/tablor-core-beta/src/lib/searcher/searcher/searcher.ts","../../../projects/tablor-core-beta/src/lib/paginator/paginator.ts","../../../projects/tablor-core-beta/src/lib/sorter/sorter-utils.ts","../../../projects/tablor-core-beta/src/lib/utils/utility-fns.ts","../../../projects/tablor-core-beta/src/lib/sorter/sorter.ts","../../../projects/tablor-core-beta/src/lib/tablor-core/tablor-core.ts","../../../projects/tablor-core-beta/src/tablor-core-beta.ts"],"sourcesContent":["import {\r\n    AugmentedItem, ImmutableAugmentedPartialRegularItem,\r\n    ImmutableAugmentedItem,\r\n    ImmutablePartialRegularItem,\r\n    ImmutableRegularItem,\r\n    Item,\r\n} from '../stores/items-store/interfaces'\r\nimport { ProcessedField } from '../stores/fields-store/interfaces'\r\n\r\n\r\n/**\r\n * Utility functions for working with items.\r\n *\r\n * @remarks\r\n * This class contains methods that are useful when working with items.\r\n * Items are the data records managed by the data table library.\r\n */\r\nexport class ItemsUtils\r\n{\r\n    /**\r\n     * Adds `tablorMeta` properties to each item in the items.\r\n     * @param items - The items to extend.\r\n     * @param getUuidAutoCounter - A function to generate unique UUIDs for items.\r\n     * @returns Augmented items with added `tablorMeta` properties.\r\n     */\r\n    public static augmentItems<T extends Item<T>>(\r\n        items: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T>)[]>,\r\n        getUuidAutoCounter: () => number,\r\n    ): AugmentedItem<T>[]\r\n    {\r\n        return items.map((data) =>\r\n        {\r\n            return {\r\n                ...data,\r\n                tablorMeta: {\r\n                    uuid: getUuidAutoCounter(),\r\n                    isSelected: false,\r\n                    isLoaded: true,\r\n                },\r\n            }\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds the difference between two items.\r\n     * @param item1 - The first item.\r\n     * @param item2 - The second item.\r\n     * @returns The differences between the items.\r\n     */\r\n    public static getItemUpdates<T extends Item<T>>(\r\n        item1: Partial<T>,\r\n        item2: AugmentedItem<T>,\r\n    ): Partial<AugmentedItem<T>>\r\n    {\r\n        const diff: Partial<AugmentedItem<T>> = {}\r\n        for (const key of Object.keys(item1))\r\n        {\r\n            if (key === 'tablorMeta')\r\n                continue\r\n\r\n            else if (item1[key as keyof T] !== item2[key as keyof T])\r\n                diff[key as keyof T] = item1[key as keyof T]\r\n        }\r\n\r\n        // @ts-ignore\r\n        diff['tablorMeta'] = item2.tablorMeta\r\n        return diff\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if two items are equal.\r\n     * @param item1 - The first item.\r\n     * @param item2 - The second item.\r\n     * @returns `true` if items are equal, otherwise `false`.\r\n     */\r\n    public static itemsAreEqual<T extends Item<T>>(\r\n        item1: Readonly<T> | ImmutableAugmentedItem<T> | number | undefined,\r\n        item2: Readonly<T> | ImmutableAugmentedItem<T> | number | undefined,\r\n    ): boolean\r\n    {\r\n        if (typeof item1 === 'number')\r\n            if (typeof item2 === 'number')\r\n                return item1 === item2\r\n            else if (typeof item2 === 'object' && 'tablorMeta' in item2)\r\n                return item1 === item2.tablorMeta.uuid\r\n            else\r\n                return false\r\n\r\n        else if (typeof item2 === 'number')\r\n            if (typeof item1 === 'object' && 'tablorMeta' in item1)\r\n                return item1.tablorMeta.uuid === item2\r\n            else\r\n                return false\r\n\r\n        else if (typeof item1 === 'object' && typeof item2 === 'object')\r\n            for (const key of Object.keys(item1))\r\n            {\r\n                // Ignore tablorMeta property\r\n                if (key === 'tablorMeta') continue\r\n\r\n                if (item1[key as keyof T] !== item2[key as keyof T]) return false\r\n            }\r\n\r\n        else if (item1 === undefined && item2 === undefined)\r\n            return true\r\n\r\n        return false\r\n    }\r\n\r\n\r\n    /**\r\n     * Merges a new item with an existing item, creating a new item.\r\n     * @param item1 - The new item with updated properties.\r\n     * @param item2 - The existing item to update.\r\n     * @returns The updated item.\r\n     */\r\n    public static mergeItemWith<T extends Item<T>>(item1: Partial<T>, item2: AugmentedItem<T>): AugmentedItem<T>\r\n    {\r\n        const newItem = JSON.parse(JSON.stringify(item2))\r\n        for (const key of Object.keys(item1))\r\n        {\r\n            if (key === 'tablorMeta')\r\n                continue\r\n\r\n            // @ts-expect-error\r\n            newItem[key] = item1[key]\r\n        }\r\n        return newItem\r\n    }\r\n\r\n\r\n    /**\r\n     * Merges a new item with an existing item in place.\r\n     * @param item1 - The new item with updated properties.\r\n     * @param item2 - The existing item to update.\r\n     */\r\n    public static mergeItemInPlace<T extends Item<T>>(item1: Partial<T>, item2: AugmentedItem<T>): void\r\n    {\r\n        for (const key of Object.keys(item1))\r\n        {\r\n            if (key === 'tablorMeta')\r\n                continue\r\n\r\n            // @ts-expect-error\r\n            item2[key as keyof T] = item1[key as keyof T]\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Replaces the current dataset with a new dataset.\r\n     * @param dataRef - The reference to the existing dataset.\r\n     * @param newDataSet - The new dataset to replace the existing one.\r\n     * @param getUuidAutoCounter - A function to generate unique UUIDs for items.\r\n     */\r\n    public static replaceItemsInPlace<T extends Item<T>>(\r\n        dataRef: AugmentedItem<T>[],\r\n        newDataSet: Readonly<ImmutableRegularItem<T>[]>,\r\n        getUuidAutoCounter: () => number,\r\n    ): void\r\n    {\r\n        dataRef.splice(0, dataRef.length)\r\n        dataRef.push(...ItemsUtils.augmentItems(newDataSet, getUuidAutoCounter))\r\n    }\r\n\r\n\r\n    /**\r\n     * Removes items based on their UUIDs or data items.\r\n     * @param dataSetRef - The dataset to update.\r\n     * @param itemsOrUuids - The items or UUIDs to remove.\r\n     * @param indexPicker - A function to determine the index of items to remove.\r\n     * @returns The status of removals and removed items.\r\n     */\r\n    public static removeItemsInPlace<T extends Item<T>>(\r\n        dataSetRef: ImmutableAugmentedItem<T>[],\r\n        itemsOrUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | number | undefined)[]>,\r\n        indexPicker: (\r\n            item: ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | number | undefined,\r\n            i: number,\r\n        ) => number,\r\n    ): [boolean[], ImmutableAugmentedItem<T>[]]\r\n    {\r\n        if (itemsOrUuids.length === 0) return [[], []]\r\n\r\n        const uuidsRemovedStatus: boolean[] = Array(itemsOrUuids.length).fill(false)\r\n        const removedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        for (let _i = 0; _i < itemsOrUuids.length; _i++)\r\n        {\r\n            const i = indexPicker(itemsOrUuids[_i], _i)\r\n            if (i === -1) continue\r\n\r\n            removedItems.push(dataSetRef[i])\r\n            dataSetRef.splice(i, 1)\r\n            uuidsRemovedStatus[_i] = true\r\n        }\r\n\r\n        return [uuidsRemovedStatus, removedItems]\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates items in the dataset in place.\r\n     * @param dataRef - The dataset to update.\r\n     * @param itemIndexes - The indexes of items to update.\r\n     * @param modificationsInItems - The modifications to apply.\r\n     * @returns The status of modifications, modified items, and fields.\r\n     */\r\n    public static updateItemsInPlace<T extends Item<T>>(\r\n        dataRef: AugmentedItem<T>[],\r\n        itemIndexes: number[],\r\n        modificationsInItems: Readonly<(ImmutablePartialRegularItem<T> | undefined)[]>,\r\n    ): [boolean[], AugmentedItem<T>[], Partial<AugmentedItem<T>>[]]\r\n    {\r\n        if (itemIndexes.length !== modificationsInItems.length)\r\n            throw new Error('The number of items and modifications must match')\r\n        if (itemIndexes.length === 0) return [[], [], []]\r\n\r\n        const modificationsStatus: boolean[] = []\r\n        modificationsStatus.length = itemIndexes.length\r\n\r\n        const modifiedItems: AugmentedItem<T>[] = []\r\n        const modifiedFieldsInItems: Partial<AugmentedItem<T>>[] = []\r\n\r\n        for (let i = 0; i < modificationsInItems.length; i++)\r\n        {\r\n            const itemIndex = itemIndexes[i]\r\n            const modifications = modificationsInItems[i]\r\n\r\n            if (itemIndex < 0 || !modifications)\r\n            {\r\n                modificationsStatus[i] = false\r\n                continue\r\n            }\r\n\r\n            if (itemIndex === -1)\r\n            {\r\n                modificationsStatus[i] = false\r\n                continue\r\n            }\r\n\r\n            // Get the difference (which fields/properties to update) between the new item and the existing item\r\n            // ignore the same fields/properties\r\n            const itemsDifference = ItemsUtils.getItemUpdates<T>(modifications, dataRef[itemIndex])\r\n\r\n            // Whether there is any difference to update or not\r\n            // mark the item as updated\r\n            modificationsStatus[i] = true\r\n\r\n            // if there is anything to update in the item, except the `tablorMeta`\r\n            if (Object.keys(itemsDifference).length <= 1)\r\n            {\r\n                continue\r\n            }\r\n\r\n            // Overwrite the item fields/properties with the new item fields/properties\r\n            ItemsUtils.mergeItemInPlace<T>(modifications, dataRef[itemIndex])\r\n\r\n            // Store the modified fields in the item\r\n            modifiedFieldsInItems.push(itemsDifference)\r\n            modifiedItems.push(dataRef[itemIndex])\r\n        }\r\n\r\n        return [modificationsStatus, modifiedItems, modifiedFieldsInItems]\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters an array of items by a specific field and value.\r\n     * @param dataSetRef - The array of items to filter.\r\n     * @param key - The field to check for the given value.\r\n     * @param value - The value to compare the field against.\r\n     * @returns An array of filtered items matching the key-value condition.\r\n     */\r\n    public filterItemsBy<T extends Item<T>, K extends keyof T>(\r\n        dataSetRef: ImmutableAugmentedItem<T>[],\r\n        key: K,\r\n        value: T[K],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return dataSetRef.filter(item => item[key] === value)\r\n    }\r\n\r\n\r\n    /**\r\n     * Maps each item in the data to a new structure based on the provided field mappings.\r\n     * @param data - The data to map.\r\n     * @param fieldsArray - An array of fields that defines how to map each item.\r\n     * @param markMissingItemsUndefined - Whether to set missing fields to `undefined`.\r\n     * @returns A new array of mapped items.\r\n     */\r\n    public static mapItemsPropsToFields<T extends Item<T>>(\r\n        data: Readonly<(ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T> | ImmutablePartialRegularItem<T>)[]>,\r\n        fieldsArray: ProcessedField<T, keyof T>[],\r\n        markMissingItemsUndefined: boolean,\r\n    ): Readonly<(ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T> | ImmutablePartialRegularItem<T>)[]>\r\n    {\r\n        const mappedData: (ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T> | ImmutablePartialRegularItem<T>)[] = []\r\n        for (const item of data)\r\n        {\r\n            // @ts-ignore\r\n            const mappedItem: Item<T> = {}\r\n            for (const field of fieldsArray)\r\n            {\r\n                if (field.key in item)\r\n                {\r\n                    // @ts-ignore\r\n                    mappedItem[field.key] = item[field.key]\r\n                }\r\n                else if (markMissingItemsUndefined)\r\n                {\r\n                    // @ts-ignore\r\n                    mappedItem[field.key] = undefined\r\n                }\r\n            }\r\n            if ('tablorMeta' in item)\r\n            {\r\n                // @ts-ignore\r\n                mappedItem['tablorMeta'] = item.tablorMeta\r\n            }\r\n            mappedData.push(mappedItem)\r\n        }\r\n        return mappedData\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds the indexes of items that match the given UUIDs, items, or augmented items.\r\n     * @param dataRef - Dataset to search in.\r\n     * @param itemsOrUuids - Items or UUIDs to match against.\r\n     * @returns Array of indexes of matching items, or -1 for no match.\r\n     *\r\n     * @remarks\r\n     * - For UUIDs, matches are based on the `tablorMeta.uuid`.\r\n     * - For augmented items, matching is done using the UUID in `tablorMeta`.\r\n     * - For regular items, a deep equality check is performed.\r\n     */\r\n    public static findIndexes<T extends Item<T>>(\r\n        dataRef:ImmutableAugmentedItem<T>[],\r\n        itemsOrUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T> | number | undefined)[]>,\r\n    ): number[]\r\n    {\r\n        if (itemsOrUuids.length === 0) return []\r\n\r\n        const indexes: number[] = []\r\n\r\n        for (const itemOrUuid of itemsOrUuids)\r\n        {\r\n            if (typeof itemOrUuid === 'number')\r\n            {\r\n                indexes.push(dataRef.findIndex(item => item.tablorMeta.uuid === itemOrUuid))\r\n            }\r\n            else if (typeof itemOrUuid === 'object' && 'tablorMeta' in itemOrUuid)\r\n            {\r\n                indexes.push(dataRef.findIndex(item => item.tablorMeta.uuid === itemOrUuid.tablorMeta.uuid))\r\n            }\r\n            else if (typeof itemOrUuid === 'object')\r\n            {\r\n                indexes.push(dataRef.findIndex(item => ItemsUtils.itemsAreEqual<T>(item, itemOrUuid)))\r\n            }\r\n            else\r\n            {\r\n                indexes.push(-1)\r\n            }\r\n        }\r\n\r\n        return indexes\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds all matching indexes for the given UUIDs, items, or augmented items.\r\n     * @param dataRef - Dataset to search in.\r\n     * @param itemsOrUuids - UUIDs, items, or augmented items to match.\r\n     * @returns An array of arrays, each containing matching indexes for each item.\r\n     *\r\n     * @remarks\r\n     * - Matches all items with the given UUID.\r\n     * - For augmented items, matching is based on UUIDs within `tablorMeta`.\r\n     * - Regular items are matched using deep equality.\r\n     * - For unmatched items, an empty array is returned.\r\n     */\r\n    public static findAllIndexes<T extends Item<T>>(\r\n        dataRef: ImmutableAugmentedItem<T>[],\r\n        itemsOrUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T> | number | undefined)[]>,\r\n    ): number[][]\r\n    {\r\n        if (itemsOrUuids.length === 0) return []\r\n\r\n        const indexes: number[][] = []\r\n\r\n        for (const itemOrUuid of itemsOrUuids)\r\n        {\r\n            if (\r\n                typeof itemOrUuid !== 'number' &&\r\n                typeof itemOrUuid === 'object'\r\n            )\r\n                continue\r\n\r\n            const currentIndexes: number[] = []\r\n\r\n            dataRef.forEach((item, i) =>\r\n            {\r\n                if (ItemsUtils.itemsAreEqual(item, itemOrUuid)) currentIndexes.push(i)\r\n            })\r\n\r\n            // Add empty array if no match was found, or add the found indexes\r\n            indexes.push(currentIndexes)\r\n        }\r\n\r\n        return indexes\r\n    }\r\n\r\n\r\n    /**\r\n     * Wraps a method to manage loading state during its execution.\r\n     * @param method - The method to wrap and handle the loading state for.\r\n     * @param loadingSetter - Function to update the loading state (true/false).\r\n     * @returns A wrapped method that manages the loading state.\r\n     *\r\n     * @remarks\r\n     * - Sets loading state to `true` before the method runs, and `false` afterward.\r\n     * - If an error occurs, loading state is set to `false`, and the error is thrown.\r\n     */\r\n    public static handleLoading<T extends (...args: any[]) => any>(\r\n        method: T,\r\n        loadingSetter: (state: boolean) => void,\r\n    ): (...args: Parameters<T>) => ReturnType<T>\r\n    {\r\n        return function (...args: Parameters<T>): ReturnType<T>\r\n        {\r\n            loadingSetter(true)\r\n\r\n            let results = undefined\r\n            try\r\n            {\r\n                // Execute the original method with the provided arguments\r\n                results = method(...args)\r\n                loadingSetter(false)\r\n                return results\r\n            } catch (e)\r\n            {\r\n                loadingSetter(false)\r\n                throw e\r\n            }\r\n        }\r\n    }\r\n\r\n}\r\n","import {\r\n    AugmentedItem,\r\n    DynamicImmutableAugmentedItem,\r\n    ImmutableAugmentedItem,\r\n    ImmutableAugmentedPartialRegularItem, ImmutablePartialRegularItem,\r\n    ImmutableRegularItem, ItemsAddedPayload, ItemsRemovedPayload, ItemsUpdatedPayload,\r\n    Item, StoreLoadingStateChangedPayload,\r\n} from './interfaces'\r\nimport { FieldsStore } from '../fields-store/fields-store'\r\nimport { ItemsUtils } from '../../utils/items-utils'\r\nimport { Subject } from 'rxjs'\r\n\r\n\r\n/**\r\n * Manages the items with methods for adding, removing, and updating them.\r\n */\r\nexport class ItemsStore<T extends Item<T>>\r\n{\r\n    protected allItems: AugmentedItem<T>[] = []\r\n\r\n    protected _uuidCounter: number = 0\r\n    protected _loading: boolean = false\r\n\r\n    public readonly $loadingStateChanged = new Subject<StoreLoadingStateChangedPayload<T>>()\r\n    public readonly $itemsAdded = new Subject<ItemsAddedPayload<T>>\r\n    public readonly $itemsRemoved = new Subject<ItemsRemovedPayload<T>>\r\n    public readonly $itemsUpdated = new Subject<ItemsUpdatedPayload<T>>\r\n\r\n\r\n    constructor(\r\n        protected readonly getFieldsAsArray: FieldsStore<T>['getFieldsAsArray'],\r\n    )\r\n    {\r\n        this.setLoading = this.setLoading.bind(this)\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the total number of items in the store.\r\n     */\r\n    public getNbOfItems(): number\r\n    {\r\n        return this.allItems.length\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the loading state.\r\n     */\r\n    public getLoadingState(): boolean\r\n    {\r\n        return this._loading\r\n    }\r\n\r\n\r\n    public getItems(strictlyTyped?: true): ImmutableAugmentedItem<T>[]\r\n    public getItems(strictlyTyped?: false): DynamicImmutableAugmentedItem[]\r\n\r\n    /**\r\n     * Returns all items as immutable objects.\r\n     */\r\n    public getItems(strictlyTyped: boolean = true): ImmutableAugmentedItem<T>[] | DynamicImmutableAugmentedItem[]\r\n    {\r\n        return this.allItems.map(item => item)\r\n    }\r\n\r\n\r\n    public getMutableItems(): AugmentedItem<T>[]\r\n    {\r\n        return this.allItems\r\n    }\r\n\r\n\r\n    /**\r\n     * Sets the loading state and triggers the corresponding event.\r\n     */\r\n    protected setLoading(state: boolean)\r\n    {\r\n        if (state === this._loading) return\r\n\r\n        this._loading = state\r\n        this.$loadingStateChanged.next({ state })\r\n    }\r\n\r\n\r\n    /**\r\n     * Initializes the store with an array of items.\r\n     */\r\n    public initialize(items: Readonly<ImmutableRegularItem<T>[]>): void\r\n    {\r\n        if (this.allItems.length !== 0)\r\n            this.$itemsRemoved.next({ removedItems: this.allItems.map(item => item) })\r\n\r\n        if (items.length === 0)\r\n            return\r\n\r\n        this.setLoading(true)\r\n\r\n        const fieldsArray = this.getFieldsAsArray()\r\n\r\n        ItemsUtils.replaceItemsInPlace(\r\n            this.allItems,\r\n            // @ts-ignore\r\n            ItemsUtils.mapItemsPropsToFields(items, fieldsArray, true),\r\n            this.getNewUuid.bind(this),\r\n        )\r\n\r\n        this.setLoading(false)\r\n\r\n        this.$itemsAdded.next({ addedItems: this.allItems.map(item => item) })\r\n    }\r\n\r\n\r\n    /**\r\n     * Adds new items to the store.\r\n     */\r\n    public add(items: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T>)[]>): void\r\n    {\r\n        if (items.length === 0) return\r\n\r\n        this.setLoading(true)\r\n\r\n        const fieldsArray = this.getFieldsAsArray()\r\n\r\n        const _items = ItemsUtils.augmentItems(\r\n            // @ts-ignore\r\n            ItemsUtils.mapItemsPropsToFields(items, fieldsArray, true),\r\n            this.getNewUuid.bind(this),\r\n        )\r\n\r\n        this.allItems.push(..._items)\r\n\r\n        this.setLoading(false)\r\n\r\n        this.$itemsAdded.next({ addedItems: _items })\r\n    }\r\n\r\n\r\n    /**\r\n     * Removes items from the store by UUID or item reference.\r\n     */\r\n    public remove(\r\n        itemsAndUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | number | undefined)[]>,\r\n    ): boolean[]\r\n    {\r\n        this.setLoading(true)\r\n\r\n        const indexPicker = (itemOrUuid: ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | number | undefined) =>\r\n        {\r\n            return this.findOneIndexForEach([itemOrUuid])[0]\r\n        }\r\n\r\n        const [itemsRemovedStatus, removedItems] = ItemsUtils.removeItemsInPlace<T>(\r\n            this.allItems,\r\n            itemsAndUuids,\r\n            indexPicker,\r\n        )\r\n\r\n        this.setLoading(false)\r\n\r\n        if (removedItems.length !== 0)\r\n        {\r\n            this.$itemsRemoved.next({ removedItems })\r\n        }\r\n\r\n        return itemsRemovedStatus\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates items in the store using augmented data.\r\n     */\r\n    public updateByInItemUuid(\r\n        items: Readonly<ImmutableAugmentedPartialRegularItem<T>[]>,\r\n    ): boolean[]\r\n    {\r\n        if (items.length === 0) return []\r\n\r\n        this.setLoading(true)\r\n\r\n        const indexes = this.findOneIndexForEach(items)\r\n\r\n        const fieldsArray = this.getFieldsAsArray()\r\n\r\n        const updateState = this.updateByIndex(\r\n            ItemsUtils.mapItemsPropsToFields(items, fieldsArray, false),\r\n            indexes,\r\n        )\r\n\r\n        this.setLoading(false)\r\n\r\n        return updateState\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates items in the store by matching UUIDs.\r\n     */\r\n    public updateByExternalUuids(\r\n        items: Readonly<ImmutablePartialRegularItem<T>[]>,\r\n        uuids: number[],\r\n    ): boolean[]\r\n    {\r\n        if (items.length !== uuids.length) throw new Error('The number of items and UUIDs must match')\r\n        if (items.length === 0) return []\r\n\r\n        this.setLoading(true)\r\n\r\n        const indexes = this.findOneIndexForEach(uuids)\r\n\r\n        const fieldsArray = this.getFieldsAsArray()\r\n\r\n        const updateState = this.updateByIndex(\r\n            ItemsUtils.mapItemsPropsToFields(items, fieldsArray, false),\r\n            indexes,\r\n        )\r\n\r\n        this.setLoading(false)\r\n\r\n        return updateState\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates items at specified indexes.\r\n     */\r\n    public updateByIndex(\r\n        items: Readonly<ImmutablePartialRegularItem<T>[]>,\r\n        indexes: number[],\r\n    ): boolean[]\r\n    {\r\n        if (items.length !== indexes.length) throw new Error('The number of items and indexes must match')\r\n        if (items.length === 0) return []\r\n\r\n        this.setLoading(true)\r\n\r\n        let unmodifiedItems: AugmentedItem<T>[] =\r\n            indexes.map(index => this.allItems[index]).filter(item => item !==\r\n                undefined)\r\n\r\n        unmodifiedItems = JSON.parse(JSON.stringify(unmodifiedItems))\r\n\r\n        const [modificationsStatus, modifiedItems, modifiedFieldsInItems] = ItemsUtils.updateItemsInPlace(\r\n            this.allItems,\r\n            indexes,\r\n            items,\r\n        )\r\n\r\n        unmodifiedItems = unmodifiedItems.filter((_, index) => modificationsStatus[index])\r\n\r\n        if (modifiedItems.length !== 0)\r\n        {\r\n            this.$itemsUpdated.next({\r\n                updatedItems: modifiedItems,\r\n                prevUpdatedItems: unmodifiedItems,\r\n                updatedItemsDifference: modifiedFieldsInItems,\r\n            })\r\n        }\r\n\r\n        this.setLoading(false)\r\n\r\n        return modificationsStatus\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds and returns items matching the given UUIDs or item references.\r\n     */\r\n    public findOneMatchingItemForEach(\r\n        itemsAndUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | number | undefined)[]>,\r\n    ): (ImmutableAugmentedItem<T> | undefined)[]\r\n    {\r\n        if (itemsAndUuids.length === 0) return []\r\n\r\n        return this.findOneIndexForEach(itemsAndUuids)\r\n            .map(index => index === -1 ? undefined : this.allItems[index])\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds and returns the indexes of items matching the given UUIDs or item references.\r\n     */\r\n    public findOneIndexForEach(\r\n        itemsAndUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T>\r\n            | ImmutableAugmentedPartialRegularItem<T> | number | undefined)[]>,\r\n    ): number[]\r\n    {\r\n        return ItemsUtils.findIndexes(this.allItems, itemsAndUuids)\r\n    }\r\n\r\n\r\n    /**\r\n     * Finds and returns all the possible indexes of items matching the given UUIDs or item references.\r\n     */\r\n    public findAllPossibleIndexesForEach(\r\n        itemsAndUuids: Readonly<(ImmutableAugmentedItem<T> | ImmutableRegularItem<T>\r\n            | ImmutableAugmentedPartialRegularItem<T> | number | undefined)[]>,\r\n    ): number[][]\r\n    {\r\n        return ItemsUtils.findAllIndexes(this.allItems, itemsAndUuids)\r\n    }\r\n\r\n\r\n    /**\r\n     * Generates a unique identifier (UUID) for items.\r\n     */\r\n    protected getNewUuid(): number\r\n    {\r\n        this._uuidCounter++\r\n        return this._uuidCounter\r\n    }\r\n\r\n}\r\n","import { Subject } from 'rxjs'\r\n\r\nimport { ProcessedField, ProcessedFields, RegularField, RegularFields, FieldsUpdatedPayload } from './interfaces'\r\nimport { Item } from '../items-store/interfaces'\r\n\r\n\r\n/**\r\n * `FieldsStore` manages fields.\r\n */\r\nexport class FieldsStore<T extends Item<T>>\r\n{\r\n    public readonly $fieldsChanged = new Subject<FieldsUpdatedPayload<T>>()\r\n    protected readonly _allFields: ProcessedFields<T> = {} as ProcessedFields<T>\r\n\r\n\r\n    /**\r\n     * Initialize with an event manager for handling field updates.\r\n     */\r\n    constructor()\r\n    {\r\n    }\r\n\r\n\r\n    /**\r\n     * Get all fields as an object.\r\n     *\r\n     * @returns The fields object.\r\n     */\r\n    public getFields(): ProcessedFields<T>\r\n    {\r\n        return this._allFields\r\n    }\r\n\r\n\r\n    /**\r\n     * Get a field by key.\r\n     */\r\n    public getField<K extends keyof T>(key: K): ProcessedField<T, K> | undefined\r\n    {\r\n        return this._allFields[key]\r\n    }\r\n\r\n\r\n    /**\r\n     * Get all field keys.\r\n     */\r\n    public getFieldsKeys(): (keyof T)[]\r\n    {\r\n        return Object.keys(this._allFields) as (keyof T)[]\r\n    }\r\n\r\n\r\n    /**\r\n     * Check if a field exists.\r\n     */\r\n    public hasField<K extends keyof T>(key: K): boolean\r\n    {\r\n        return key in this._allFields\r\n    }\r\n\r\n\r\n    /**\r\n     * Get all fields as an array for easy iteration.\r\n     *\r\n     * @returns All the fields as array.\r\n     */\r\n    public getFieldsAsArray(): ProcessedField<T, keyof T>[]\r\n    {\r\n        return Object.keys(this._allFields).map(key => (\r\n            // @ts-ignore: Typescript ignore due to dynamic key access\r\n            { ...this._allFields[key] }\r\n        ))\r\n    }\r\n\r\n\r\n    /**\r\n     * Initialize fields with provided configurations.\r\n     *\r\n     * @param fields - Initial field configurations.\r\n     */\r\n    public initialize(fields: RegularFields<T>): void\r\n    {\r\n        const _fields = this.prepareFields(fields)\r\n\r\n        for (const key in _fields)\r\n        {\r\n            this._allFields[key] = _fields[key]\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Update fields.\r\n     *\r\n     * @param fields - Fields to update as object or array.\r\n     */\r\n    public updateFields(\r\n        fields: (RegularField<T> & { key: keyof T })[] | Partial<RegularFields<T>>,\r\n    ): void\r\n    {\r\n        const prevFields = {} as ProcessedFields<T>\r\n\r\n        if (Array.isArray(fields))\r\n        {\r\n            for (const field of fields)\r\n            {\r\n                if (!field.key) throw new Error('Field must have a key.')\r\n\r\n                const updatedFieldValues =\r\n                    // @ts-ignore\r\n                    this.overwriteFieldInPlace(field, this._allFields[field.key])\r\n\r\n                if (Object.keys(updatedFieldValues).length <= 1) continue\r\n\r\n                // @ts-ignore\r\n                prevFields[field.key] = { ...this._allFields[field.key], ...updatedFieldValues }\r\n            }\r\n        }\r\n        else if (typeof fields === 'object')\r\n        {\r\n            for (const key in fields)\r\n            {\r\n                // @ts-ignore\r\n                fields[key].key = key\r\n\r\n                const updatedFieldValues =\r\n                    this.overwriteFieldInPlace(fields[key] as ProcessedField<T, keyof T>, this._allFields[key])\r\n\r\n                if (Object.keys(updatedFieldValues).length <= 1) continue\r\n\r\n                prevFields[key] = { ...this._allFields[key], ...updatedFieldValues }\r\n            }\r\n        }\r\n\r\n        this.$fieldsChanged.next({\r\n            fields: this._allFields,\r\n            prevFields: { ...this._allFields, ...prevFields },\r\n            updatedFieldsKeys: Object.keys(prevFields) as (keyof T)[],\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Update a field by merging old configurations with new.\r\n     *\r\n     * @param field - Field to update.\r\n     * @param prevField - Previous field.\r\n     */\r\n    protected overwriteFieldInPlace<K extends keyof T>(\r\n        field: Partial<RegularField<T>>,\r\n        prevField: ProcessedField<T, K>,\r\n    ): Partial<ProcessedField<T, K>>\r\n    {\r\n        if (!prevField) return {}\r\n\r\n        let changed: any = {\r\n            key: prevField.key,\r\n        }\r\n\r\n        for (const key in field)\r\n        {\r\n            if (\r\n                key === 'key' || key === undefined\r\n            )\r\n                continue\r\n\r\n            if (field[key as keyof RegularField<T>] !== prevField[key as keyof RegularField<T>])\r\n            {\r\n                changed[key as keyof RegularField<T>] = prevField[key as keyof RegularField<T>] as any\r\n                (prevField[key as keyof RegularField<T>] as any) = field[key as keyof RegularField<T>] as any\r\n            }\r\n        }\r\n\r\n        return changed\r\n    }\r\n\r\n\r\n    /**\r\n     * Prepare fields by applying defaults to missing values.\r\n     *\r\n     * @param fields - Fields to prepare.\r\n     */\r\n    protected prepareFields(fields: RegularFields<T>): ProcessedFields<T>\r\n    {\r\n        const cols: ProcessedFields<T> = {} as ProcessedFields<T>\r\n\r\n        for (const key in fields)\r\n        {\r\n            const col = fields[key]\r\n\r\n            cols[key] = {\r\n                key: key,\r\n\r\n                title: col.title !== undefined ? col.title : '',\r\n                colClasses: col.colClasses !== undefined ? col.colClasses : '',\r\n\r\n                isVisibleByDefault: col.isVisibleByDefault !== undefined ? col.isVisibleByDefault : true,\r\n                isSearchableByDefault: col.isSearchableByDefault !== undefined ? col.isSearchableByDefault : true,\r\n                isSortableByDefault: col.isSortableByDefault !== undefined ? col.isSortableByDefault : true,\r\n                isSortedByDefault: col.isSortedByDefault !== undefined ? col.isSortedByDefault : false,\r\n                isSortedReverseByDefault: col.isSortedReverseByDefault !== undefined ?\r\n                                          col.isSortedReverseByDefault :\r\n                                          false,\r\n\r\n                isSorted: col.isSortedByDefault !== undefined ? col.isSortedByDefault : false,\r\n                isSortedReverse: col.isSortedReverseByDefault !== undefined ? col.isSortedReverseByDefault : false,\r\n                isSearched: false,\r\n                isVisible: col.isVisibleByDefault !== undefined ? col.isVisibleByDefault : true,\r\n\r\n                render: col.render,\r\n                defaultContent: col.defaultContent !== undefined ? col.defaultContent : '-',\r\n\r\n                placeholderContent: col.placeholderContent !== undefined ? col.placeholderContent : '-',\r\n            }\r\n        }\r\n\r\n        return cols\r\n    }\r\n\r\n}\r\n","import {\r\n    ImmutableAugmentedPartialRegularItem,\r\n    ImmutableAugmentedItem,\r\n    ImmutableRegularItem,\r\n    Item, ItemsRemovedPayload,\r\n} from '../stores/items-store/interfaces'\r\nimport { Subject } from 'rxjs'\r\nimport { ItemsSelectionChangedPayload } from './interfaces'\r\nimport { ItemsStore } from '../stores/items-store/items-store'\r\nimport { Paginator } from '../paginator/paginator'\r\n\r\n\r\n/**\r\n * Represents a selector.\r\n */\r\nexport class Selector<T extends Item<T>>\r\n{\r\n    protected _selectedUuids: number[] = []\r\n\r\n    public readonly $itemsSelectionChanged: Subject<ItemsSelectionChangedPayload<T>>\r\n        = new Subject<ItemsSelectionChangedPayload<T>>()\r\n\r\n\r\n    constructor(\r\n        protected readonly getAllItems: ItemsStore<T>['getMutableItems'],\r\n        protected readonly getPaginatedItems: Paginator<T>['getItems'],\r\n        protected readonly findOneIndexForEach: ItemsStore<T>['findOneIndexForEach'],\r\n        protected readonly $itemsRemoved: Subject<ItemsRemovedPayload<T>>,\r\n    )\r\n    {\r\n        this.$itemsRemoved.subscribe(this.verifySelectedItemsOnRemoval.bind(this))\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the number of selected items.\r\n     */\r\n    public getNbOfSelectedItems(): number\r\n    {\r\n        return this._selectedUuids.length\r\n    }\r\n\r\n\r\n    public getNbOfUnselectedItems(): number\r\n    {\r\n        return this.getAllItems().length - this._selectedUuids.length\r\n    }\r\n\r\n\r\n    public getNbOfSelectedPaginatedItems(): number\r\n    {\r\n        if (this.getAllItems().length === this.getPaginatedItems().length)\r\n            return this.getNbOfSelectedItems()\r\n\r\n        return this.getPaginatedItems().filter(item => this._selectedUuids.includes(item.tablorMeta.uuid)).length\r\n    }\r\n\r\n\r\n    public getNbOfUnselectedPaginatedItems(): number\r\n    {\r\n        if (this.getAllItems().length === this.getPaginatedItems().length)\r\n            return this.getNbOfUnselectedItems()\r\n\r\n        return this.getPaginatedItems().filter(item => !this._selectedUuids.includes(item.tablorMeta.uuid)).length\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the number of selected items in the given items.\r\n     */\r\n    public getNbOfSelectedItemsIn(\r\n        items: Readonly<(ImmutableAugmentedPartialRegularItem<T> | number | undefined)[]>,\r\n    ): number\r\n    {\r\n        return items.reduce(\r\n            (c: number, item) =>\r\n            {\r\n                if (item === undefined)\r\n                    return c\r\n\r\n                else if (typeof item === 'number')\r\n                    return c + (this._selectedUuids.includes(item) ? 1 : 0)\r\n\r\n                else if (typeof item === 'object' && 'tablorMeta' in item)\r\n                    return c + (this._selectedUuids.includes(item.tablorMeta.uuid) ? 1 : 0)\r\n\r\n                return c\r\n            },\r\n            0,\r\n        )\r\n    }\r\n\r\n\r\n    public getSelectedItems(): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.getAllItems().filter(item => this._selectedUuids.includes(item.tablorMeta.uuid))\r\n    }\r\n\r\n\r\n    public getUnselectedItems(): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.getAllItems().filter(item => !this._selectedUuids.includes(item.tablorMeta.uuid))\r\n    }\r\n\r\n\r\n    public getSelectedItemUuids(): number[]\r\n    {\r\n        return this._selectedUuids\r\n    }\r\n\r\n\r\n    public getUnselectedItemUuids(): number[]\r\n    {\r\n        return this.getAllItems().map(item => item.tablorMeta.uuid).filter(uuid => !this._selectedUuids.includes(uuid))\r\n    }\r\n\r\n\r\n    public getSelectedPaginatedItems(): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.getPaginatedItems().filter(item => this._selectedUuids.includes(item.tablorMeta.uuid))\r\n    }\r\n\r\n\r\n    public getUnselectedPaginatedItems(): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.getPaginatedItems().filter(item => !this._selectedUuids.includes(item.tablorMeta.uuid))\r\n    }\r\n\r\n\r\n    /**\r\n     * Selects or deselects an item.\r\n     */\r\n    public select(\r\n        item:\r\n            ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T>\r\n            | number | undefined,\r\n        state: boolean | 'toggle',\r\n    ): void\r\n    {\r\n        const i = this.selectInternal(item, state)\r\n        if (i === -1) return\r\n\r\n        this.$itemsSelectionChanged.next({\r\n            items: [this.getAllItems()[i]],\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Selects or deselects multiple items.\r\n     */\r\n    public selectMultiple(\r\n        items: Readonly<(\r\n            ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T>\r\n            | number | undefined\r\n            )[]>,\r\n        states: (boolean | 'toggle')[] | (boolean | 'toggle'),\r\n    ): void\r\n    {\r\n        if (Array.isArray(states) && items.length !== states.length)\r\n            throw new Error('The number of items and states must match')\r\n\r\n        if (items.length === 0) return\r\n\r\n        const indexes: number[] = []\r\n\r\n        if (!Array.isArray(states))\r\n        {\r\n            for (let i = 0; i < items.length; i++)\r\n            {\r\n                indexes.push(this.selectInternal(items[i], states))\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (let i = 0; i < items.length; i++)\r\n            {\r\n                indexes.push(this.selectInternal(items[i], states[i]))\r\n            }\r\n        }\r\n\r\n        const selectedItems = indexes.map(i => this.getAllItems()[i])\r\n\r\n        this.$itemsSelectionChanged.next({\r\n            items: selectedItems,\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Verifies that the selected items are still valid after items have been removed.\r\n     */\r\n    protected verifySelectedItemsOnRemoval({ removedItems }: ItemsRemovedPayload<T>): void\r\n    {\r\n        const removedUuids = removedItems.map(item => item.tablorMeta.uuid)\r\n        this._selectedUuids = this._selectedUuids\r\n            .filter(uuid => !removedUuids.includes(uuid))\r\n    }\r\n\r\n\r\n    /**\r\n     * Selects or deselects an item.\r\n     */\r\n    protected selectInternal(\r\n        item: ImmutableAugmentedItem<T> | ImmutableRegularItem<T> | ImmutableAugmentedPartialRegularItem<T>\r\n            | number | undefined,\r\n        state: boolean | 'toggle',\r\n    ): number\r\n    {\r\n        if (item === undefined) return -1\r\n\r\n        const i = this.findOneIndexForEach([item])[0]\r\n        if (i === -1) return -1\r\n\r\n        if (state === 'toggle')\r\n            state = !this.getAllItems()[i].tablorMeta.isSelected\r\n\r\n        if (state)\r\n        {\r\n            if (!this._selectedUuids.includes(this.getAllItems()[i].tablorMeta.uuid))\r\n                this._selectedUuids.push(this.getAllItems()[i].tablorMeta.uuid)\r\n        }\r\n        else\r\n        {\r\n            if (this._selectedUuids.includes(this.getAllItems()[i].tablorMeta.uuid))\r\n                this._selectedUuids = this._selectedUuids\r\n                    .filter(uuid => uuid !== this.getAllItems()[i].tablorMeta.uuid)\r\n        }\r\n\r\n        this.getAllItems()[i].tablorMeta.isSelected = state\r\n\r\n        return i\r\n    }\r\n}\r\n","import {\r\n    ImmutableAugmentedItem,\r\n    Item,\r\n} from '../../stores/items-store/interfaces'\r\nimport { ProcessedField } from '../../stores/fields-store/interfaces'\r\nimport { DraftStringQueryOptions, ProcessedStringQueryOptions } from './interfaces'\r\n\r\n\r\n/**\r\n * String query searcher.\r\n */\r\nexport class StringQuerySearcher<T extends Item<T>>\r\n{\r\n\r\n    constructor(\r\n        protected readonly getFields: () => ProcessedField<T, keyof T>[],\r\n        protected readonly hasField: (key: keyof T) => boolean,\r\n    )\r\n    { }\r\n\r\n\r\n    /**\r\n     * Processes string query options.\r\n     */\r\n    processOptions(options: DraftStringQueryOptions<T>): ProcessedStringQueryOptions<T>\r\n    {\r\n        let includeFields: ProcessedStringQueryOptions<T>['includeFields']\r\n        let excludeFields = options.excludeFields || []\r\n\r\n        if (options.includeFields === undefined)\r\n            includeFields = this.getFields()\r\n                .map(field => field.key)\r\n                .filter(field => !excludeFields.includes(field))\r\n        else\r\n            includeFields = options.includeFields\r\n\r\n        const newOptions: ProcessedStringQueryOptions<T> = {\r\n            query: options.query,\r\n            words: [],\r\n\r\n            includeFields: includeFields,\r\n\r\n            wordsInOrder: options.wordsInOrder === undefined ? false : options.wordsInOrder,\r\n\r\n            consecutiveWords: options.consecutiveWords === undefined ? false : options.consecutiveWords,\r\n\r\n            singleWordMatchCriteria: options.singleWordMatchCriteria !== undefined ?\r\n                                     options.singleWordMatchCriteria :\r\n                                     'Contains',\r\n\r\n            requireAllWords: options.requireAllWords === undefined ? true : options.requireAllWords,\r\n\r\n            convertToString: {\r\n                string: s => s,\r\n                null: undefined,\r\n                undefined: undefined,\r\n                boolean: undefined,\r\n                number: undefined,\r\n                date: undefined,\r\n            },\r\n\r\n            ignoreWhitespace: options.ignoreWhitespace === undefined ? true : options.ignoreWhitespace,\r\n\r\n            wordSeparators: options.wordSeparators === undefined ? [' '] : options.wordSeparators,\r\n\r\n            isCaseSensitive: options.isCaseSensitive === undefined ? false : options.isCaseSensitive,\r\n        }\r\n\r\n        if (options.convertToString)\r\n        {\r\n            // @ts-ignore\r\n            newOptions.convertToString = {\r\n                string: undefined,\r\n                null: undefined,\r\n                undefined: undefined,\r\n                boolean: undefined,\r\n                number: undefined,\r\n                date: undefined,\r\n                ...options.convertToString,\r\n            }\r\n        }\r\n\r\n        if (!options.query) return newOptions\r\n\r\n        newOptions.words = this.genQuerySplitterIntoWords(\r\n            newOptions.wordSeparators,\r\n            newOptions.ignoreWhitespace,\r\n            newOptions.isCaseSensitive,\r\n        )(newOptions.query)\r\n\r\n        return newOptions\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(options: ProcessedStringQueryOptions<T>): boolean\r\n    {\r\n        for (const field of options.includeFields)\r\n        {\r\n            if (!this.hasField(field))\r\n                return false\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by string query.\r\n     */\r\n    public search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcessedStringQueryOptions<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        if (options.words.length === 0)\r\n            return items\r\n\r\n        if (options.includeFields.length === 0) return []\r\n\r\n        return this._search(\r\n            items,\r\n            options,\r\n        )\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by string query.\r\n     */\r\n    protected _search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcessedStringQueryOptions<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const searchedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        const splitQueryIntoWords = this.genQuerySplitterIntoWords(\r\n            options.wordSeparators,\r\n            options.ignoreWhitespace,\r\n            options.isCaseSensitive,\r\n        )\r\n\r\n        const matchWords = this.genWordsMatcherFn(options)\r\n\r\n        const matchPhrases = this.genPhrasesMatcherFn(matchWords, options)\r\n\r\n        items.forEach((item) =>\r\n        {\r\n            const itemWords: string[][] = []\r\n\r\n            for (const field of options.includeFields)\r\n            {\r\n                if (field === 'tablorMeta')\r\n                    throw new Error('Cannot search by tablorMeta field')\r\n\r\n                const valueType: string =\r\n                    item[field] as any instanceof Date ? 'date' :\r\n                    item[field] === null ? 'null' : typeof item[field]\r\n\r\n                // @ts-ignore\r\n                if (options.convertToString[valueType] === undefined)\r\n                    continue\r\n\r\n                // @ts-ignore\r\n                let value: string = options.convertToString[valueType](item[field])\r\n\r\n                const valueWords: string[] = splitQueryIntoWords(value)\r\n\r\n                if (valueWords.length === 0)\r\n                    continue\r\n\r\n                itemWords.push(valueWords)\r\n            }\r\n\r\n            if (itemWords.length === 0)\r\n                return\r\n\r\n            const itemPassed = matchPhrases(options.words, itemWords)\r\n\r\n            if (itemPassed)\r\n                searchedItems.push(item)\r\n        })\r\n\r\n        return searchedItems\r\n    }\r\n\r\n\r\n    /**\r\n     * Generates field value extractor function.\r\n     */\r\n    protected genQuerySplitterIntoWords(\r\n        wordSeparators: ProcessedStringQueryOptions<T>['wordSeparators'],\r\n        ignoreWhitespace: boolean,\r\n        isCaseSensitive: boolean,\r\n    ): (query: string) => (string)[]\r\n    {\r\n        const wordSeparatorsAsFn = wordSeparators.map(separator =>\r\n        {\r\n            if (typeof separator === 'string')\r\n                return (query: string) => query.split(separator)\r\n            else if (typeof separator === 'function')\r\n                return separator\r\n            else if (separator instanceof RegExp)\r\n                return (query: string) => query.split(separator)\r\n            else\r\n                throw new Error('Invalid word separator')\r\n        })\r\n\r\n        return (query: string) =>\r\n        {\r\n            let words: string[] = [query]\r\n\r\n            wordSeparatorsAsFn.forEach(\r\n                wordSeparatorFn => words.splice(0, words.length, ...wordSeparatorFn(query)),\r\n            )\r\n\r\n            if (ignoreWhitespace)\r\n                words = words.map(word => word.trim())\r\n\r\n            words = words.filter(word => word.length > 0)\r\n\r\n            if (!isCaseSensitive)\r\n                words = words.map(word => word.toLowerCase())\r\n\r\n            return words\r\n        }\r\n    }\r\n\r\n\r\n    protected genWordsMatcherFn(\r\n        options: ProcessedStringQueryOptions<T>,\r\n    ): (subWord: string, word: string) => boolean\r\n    {\r\n        switch (options.singleWordMatchCriteria)\r\n        {\r\n            case 'ExactMatch':\r\n                return (subWord, word) => subWord === word\r\n            case 'Contains':\r\n                return (subWord, word) => word.includes(subWord)\r\n            case 'StartsWith':\r\n                return (subWord, word) => word.startsWith(subWord)\r\n            case 'EndsWith':\r\n                return (subWord, word) => word.endsWith(subWord)\r\n        }\r\n    }\r\n\r\n\r\n    protected genPhrasesMatcherFn(\r\n        wordsMatcherFn: (subWord: string, word: string) => boolean,\r\n        options: ProcessedStringQueryOptions<T>,\r\n    ): (searchWords: string[], itemWords: string[][]) => boolean\r\n    {\r\n        if (options.requireAllWords)\r\n        {\r\n            if (options.wordsInOrder)\r\n            {\r\n                if (options.consecutiveWords)\r\n                {\r\n                    return (sw, iw) =>\r\n                    {\r\n                        // start with\r\n                        // iw: [ [ Fill Full Screen With Gray Color ], [ Command Set Ok Color ] ]\r\n                        // sw: f s wi: true\r\n                        // sw: f s g: false\r\n                        // sw: g c c: false\r\n                        // sw: g c o: true\r\n\r\n                        for (let itemFieldWords of iw)\r\n                        {\r\n                            for (\r\n                                let fieldWordIndex = 0;\r\n                                fieldWordIndex <= itemFieldWords.length - sw.length;\r\n                                fieldWordIndex++\r\n                            )\r\n                            {\r\n                                let match = true\r\n                                for (let searchWordIndex = 0; searchWordIndex < sw.length; searchWordIndex++)\r\n                                {\r\n                                    if (!wordsMatcherFn(\r\n                                        sw[searchWordIndex],\r\n                                        itemFieldWords[fieldWordIndex + searchWordIndex],\r\n                                    ))\r\n                                    {\r\n                                        match = false\r\n                                        break\r\n                                    }\r\n                                }\r\n                                if (match) return true\r\n                            }\r\n                        }\r\n                        return false\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return (sw, iw) =>\r\n                    {\r\n                        // start with\r\n                        // iw: [ [ Fill Full Screen With Gray Color ], [ Command Set Ok Color ] ]\r\n                        // sw: f s wi: true\r\n                        // sw: f s g: true\r\n                        // sw: g c c: false\r\n                        // sw: g c o: false\r\n\r\n                        for (let itemFieldWords of iw)\r\n                        {\r\n                            let currentIndex = 0\r\n                            let isMatched = true\r\n\r\n                            for (let i = 0; i < sw.length; i++)\r\n                            {\r\n                                let found = false\r\n                                for (let j = currentIndex; j < itemFieldWords.length; j++)\r\n                                {\r\n                                    if (wordsMatcherFn(sw[i], itemFieldWords[j]))\r\n                                    {\r\n                                        found = true\r\n                                        currentIndex = j + 1\r\n                                        break\r\n                                    }\r\n                                }\r\n                                if (!found)\r\n                                {\r\n                                    isMatched = false\r\n                                    break\r\n                                }\r\n                            }\r\n                            if (isMatched) return true\r\n                        }\r\n                        return false\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (options.consecutiveWords)\r\n                {\r\n                    const isPermutationMatch = (sw: string[], slice: string[], wordsMatcherFn: Function): boolean =>\r\n                    {\r\n                        const matchedIndices = new Set<number>()\r\n\r\n                        for (let i = 0; i < sw.length; i++)\r\n                        {\r\n                            let found = false\r\n\r\n                            for (let j = 0; j < slice.length; j++)\r\n                            {\r\n                                if (!matchedIndices.has(j) && wordsMatcherFn(sw[i], slice[j]))\r\n                                {\r\n                                    matchedIndices.add(j)\r\n                                    found = true\r\n                                    break\r\n                                }\r\n                            }\r\n                            if (!found) return false\r\n                        }\r\n                        return true\r\n                    }\r\n\r\n                    return (sw, iw) =>\r\n                    {\r\n                        // start with\r\n                        // iw: [ [ Fill Full Screen With Gray Color ], [ Command Set Ok Color ] ]\r\n                        // sw: wi f s: true\r\n                        // sw: g f s: false\r\n                        // sw: c c s: false\r\n                        // sw: s c o: true\r\n\r\n                        for (let itemFieldWords of iw)\r\n                        {\r\n                            for (let i = 0; i <= itemFieldWords.length - sw.length; i++)\r\n                            {\r\n                                const slice = itemFieldWords.slice(i, i + sw.length)\r\n\r\n                                if (isPermutationMatch(sw, slice, wordsMatcherFn))\r\n                                {\r\n                                    return true\r\n                                }\r\n                            }\r\n                        }\r\n                        return false\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return (sw, iw) =>\r\n                    {\r\n                        // start with\r\n                        // iw: [ [ Fill Full Screen With Gray Color ], [ Command Set Ok Color ] ]\r\n                        // sw: s c wi: true\r\n                        // sw: s f g: true\r\n\r\n                        return sw.every((word) => iw.flat().some((itemWord) => wordsMatcherFn(word, itemWord)))\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            return (sw, iw) =>\r\n            {\r\n                // start with\r\n                // iw: [ [ Fill Full Screen With Gray Color ], [ Command Set Ok Color ] ]\r\n                // sw: s a t: true\r\n                // sw: a l l: false\r\n                // sw: o m m: true\r\n\r\n                return sw.some((word) => iw.flat().some((itemWord) => wordsMatcherFn(word, itemWord)))\r\n            }\r\n        }\r\n    }\r\n}\r\n","import { Offset, ProcRange, RangeWithAdjustments } from './interfaces'\r\n\r\n\r\nfunction applyDateOffset(baseDate: Date, offset?: Offset): void\r\n{\r\n    if (!offset) return\r\n\r\n    if (offset.years) baseDate.setFullYear(baseDate.getFullYear() + offset.years)\r\n    if (offset.months) baseDate.setMonth(baseDate.getMonth() + offset.months)\r\n    if (offset.days) baseDate.setDate(baseDate.getDate() + offset.days)\r\n    if (offset.hours) baseDate.setHours(baseDate.getHours() + offset.hours)\r\n    if (offset.minutes) baseDate.setMinutes(baseDate.getMinutes() + offset.minutes)\r\n    if (offset.seconds) baseDate.setSeconds(baseDate.getSeconds() + offset.seconds)\r\n}\r\n\r\nexport function convertToStrictDateRange(dateRange: RangeWithAdjustments): ProcRange\r\n{\r\n    const { start, startOffset, end, endOffset } = dateRange\r\n\r\n    let strictStart: Date | undefined = undefined\r\n    if (start)\r\n    {\r\n        if (typeof start === 'string')\r\n        {\r\n            if (start === 'Now')\r\n                strictStart = new Date()\r\n            else\r\n                strictStart = new Date(start)\r\n        }\r\n        else\r\n        { strictStart = start }\r\n\r\n        applyDateOffset(strictStart, startOffset)\r\n    }\r\n\r\n    let strictEnd: Date | undefined = undefined\r\n    if (end)\r\n    {\r\n        if (typeof end === 'string')\r\n        {\r\n            if (end === 'Now')\r\n                strictEnd = new Date()\r\n            else\r\n                strictEnd = new Date(end)\r\n        }\r\n        else\r\n        { strictEnd = end }\r\n\r\n        applyDateOffset(strictEnd, endOffset)\r\n    }\r\n\r\n    // @ts-expect-error\r\n    return {\r\n        start: strictStart as Date | undefined,\r\n        includeStart: strictStart ? (dateRange.includeStart ? dateRange.includeStart as boolean : false) : undefined,\r\n        end: strictEnd,\r\n        includeEnd: strictEnd ? (dateRange.includeEnd ? dateRange.includeEnd as boolean : false) : undefined,\r\n    }\r\n}\r\n","import { ImmutableAugmentedItem, Item } from '../../stores/items-store/interfaces'\r\nimport {\r\n    DateRangesOpts, ProcDateRangesOpts,\r\n    ProcDateRanges, RangeWithAdjustments,\r\n} from './interfaces'\r\nimport { convertToStrictDateRange } from './date-ranges-searcher-utils'\r\n\r\n\r\n/**\r\n * `Date Range Searcher`. This class provides methods for searching items based on date ranges.\r\n */\r\nexport class DateRangeSearcher<T extends Item<T>>\r\n{\r\n    constructor(\r\n        protected readonly hasField: (key: keyof T) => boolean,\r\n    )\r\n    {}\r\n\r\n\r\n    /**\r\n     * Processes string query options.\r\n     */\r\n    processOptions(options: DateRangesOpts<T>): ProcDateRangesOpts<T>\r\n    {\r\n        const dateRanges: ProcDateRanges<T> = {}\r\n\r\n        for (const field in options.ranges)\r\n        {\r\n            dateRanges[field] = (options.ranges[field] as RangeWithAdjustments[])\r\n                .map(dateRange => convertToStrictDateRange(dateRange))\r\n        }\r\n\r\n        return {\r\n            mustMatchAllFields: options.mustMatchAllFields !== undefined ? options.mustMatchAllFields : true,\r\n\r\n            ranges: dateRanges,\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(options: ProcDateRangesOpts<T>): boolean\r\n    {\r\n        for (const field in options.ranges)\r\n        {\r\n            if (!this.hasField(field as keyof T))\r\n                return false\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Searches items based on date ranges.\r\n     */\r\n    search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcDateRangesOpts<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const { ranges, mustMatchAllFields } = options\r\n\r\n        return this.filterMatchingItemsUuids(ranges, mustMatchAllFields, items)\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters items based on date ranges.\r\n     */\r\n    protected filterMatchingItemsUuids(\r\n        dateRanges: ProcDateRanges<T>,\r\n        mustMatchAllFields: boolean,\r\n        items: ImmutableAugmentedItem<T>[],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const searchedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        for (const item of items)\r\n        {\r\n            let matchedFields = 0\r\n\r\n            for (const field in dateRanges)\r\n            {\r\n                const fieldDateRanges = dateRanges[field]\r\n                if (!fieldDateRanges || !fieldDateRanges.length)\r\n                    continue\r\n\r\n                const value = item[field as keyof T] as Date | null | undefined\r\n\r\n                if (!(value as any instanceof Date))\r\n                    continue\r\n\r\n                for (const range of fieldDateRanges)\r\n                {\r\n                    if (!value)\r\n                    {\r\n                        if (!range.start && !range.end)\r\n                        {\r\n                            matchedFields++\r\n                            break\r\n                        }\r\n                        continue\r\n                    }\r\n\r\n                    if (\r\n                        (\r\n                            (range.start ? value > range.start : true) ||\r\n                            (range.includeStart ? value >= range.start : false)\r\n                        ) &&\r\n                        (\r\n                            (range.end ? value < range.end : true) ||\r\n                            (range.includeEnd ? value <= range.end : false)\r\n                        )\r\n                    )\r\n                    {\r\n                        matchedFields++\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (matchedFields >= (mustMatchAllFields ? Object.keys(dateRanges).length : 0))\r\n                searchedItems.push(item)\r\n        }\r\n\r\n        return searchedItems\r\n    }\r\n\r\n}\r\n","import { ImmutableAugmentedItem, Item } from '../../stores/items-store/interfaces'\r\nimport {\r\n    NumberRangesOpts, ProcNumberRangesOpts,\r\n} from './interfaces'\r\n\r\n\r\n/**\r\n * Number ranges searcher. This class provides methods for searching items based on number ranges.\r\n */\r\nexport class NumberRangesSearcher<T extends Item<T>>\r\n{\r\n    constructor(\r\n        protected readonly hasField: (key: keyof T) => boolean,\r\n    )\r\n    {}\r\n\r\n\r\n    /**\r\n     * Processes string query options.\r\n     */\r\n    processOptions(options: NumberRangesOpts<T>): ProcNumberRangesOpts<T>\r\n    {\r\n        const newOptions: ProcNumberRangesOpts<T> = {\r\n            mustMatchAllFields: options.mustMatchAllFields !== undefined ? options.mustMatchAllFields : true,\r\n\r\n            ranges: {},\r\n        }\r\n\r\n        for (const field in options.ranges)\r\n        {\r\n            const fieldNumberRanges = options.ranges[field]\r\n            if (!fieldNumberRanges || !fieldNumberRanges.length)\r\n                continue\r\n\r\n            newOptions.ranges[field as keyof T] = fieldNumberRanges.map(range => ({\r\n                min: range.min === undefined ? -Infinity : range.min,\r\n                max: range.max === undefined ? Infinity : range.max,\r\n                includeMin: range.includeMin !== undefined ? range.includeMin : false,\r\n                includeMax: range.includeMax !== undefined ? range.includeMax : false,\r\n            }))\r\n        }\r\n\r\n        return newOptions\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(options: ProcNumberRangesOpts<T>): boolean\r\n    {\r\n        for (const field in options.ranges)\r\n        {\r\n            if (!this.hasField(field as keyof T))\r\n                return false\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Searches items based on number ranges.\r\n     */\r\n    search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcNumberRangesOpts<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const { ranges, mustMatchAllFields } = options\r\n\r\n        return this.filterMatchingItemsUuids(ranges, mustMatchAllFields, items)\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters items based on number ranges.\r\n     */\r\n    protected filterMatchingItemsUuids(\r\n        multiFieldsRanges: ProcNumberRangesOpts<T>['ranges'],\r\n        mustMatchAllFields: boolean,\r\n        items: ImmutableAugmentedItem<T>[],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const searchedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        for (const item of items)\r\n        {\r\n            let matchedFields = 0\r\n\r\n            for (const field in multiFieldsRanges)\r\n            {\r\n                const multiRanges = multiFieldsRanges[field]\r\n                if (!multiRanges || !multiRanges.length)\r\n                    continue\r\n\r\n                let value: number | string | undefined | null = item[field as keyof T]\r\n\r\n                if (typeof value === 'string')\r\n                    value = Number(value)\r\n\r\n                for (const range of multiRanges)\r\n                {\r\n                    if (!value)\r\n                    {\r\n                        if (range.min === -Infinity && range.max === Infinity)\r\n                            matchedFields++\r\n                        continue\r\n                    }\r\n\r\n                    if (\r\n                        (\r\n                            (range.min === -Infinity ? true : value > range.min) ||\r\n                            (range.includeMin ? value === range.min : false)\r\n                        ) &&\r\n                        (\r\n                            (range.max === Infinity ? true : value < range.max) ||\r\n                            (range.includeMax ? value === range.max : false)\r\n                        )\r\n                    )\r\n                    {\r\n                        matchedFields++\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (matchedFields >= (mustMatchAllFields ? Object.keys(multiFieldsRanges).length : 0))\r\n                searchedItems.push(item)\r\n        }\r\n\r\n        return searchedItems\r\n    }\r\n\r\n}\r\n","import { AugmentedItem, ImmutableAugmentedItem, Item } from '../../stores/items-store/interfaces'\r\nimport {\r\n    CustomOpts,\r\n    ProcCustomOpts,\r\n} from './interfaces'\r\n\r\n\r\n/**\r\n * Custom searcher. This searcher is used to filter items based on a custom function.\r\n */\r\nexport class CustomSearcher<T extends Item<T>>\r\n{\r\n    constructor()\r\n    {}\r\n\r\n\r\n    /**\r\n     * Processes the options.\r\n     */\r\n    processOptions(options: CustomOpts<T>): ProcCustomOpts<T>\r\n    {\r\n        return options\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(): boolean\r\n    {\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters items based on a custom function.\r\n     */\r\n    search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcCustomOpts<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.filterMatchingItemsUuids(\r\n            options.customFn,\r\n            items,\r\n        )\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters items based on a custom function.\r\n     */\r\n    protected filterMatchingItemsUuids(\r\n        fn: ProcCustomOpts<T>['customFn'],\r\n        items: AugmentedItem<T>[],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const searchedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        for (const item of items)\r\n        {\r\n            if (fn(item, items))\r\n                searchedItems.push(item)\r\n        }\r\n\r\n        return searchedItems\r\n    }\r\n\r\n}\r\n","import { ImmutableAugmentedItem, Item } from '../../stores/items-store/interfaces'\r\nimport { ProcessedVoidOptions } from './interfaces'\r\n\r\n\r\n/**\r\n * `Void searcher`. This class provides methods for searching items based on void query functionality.\r\n */\r\nexport class VoidSearcher<T extends Item<T>>\r\n{\r\n    constructor()\r\n    {}\r\n\r\n\r\n    /**\r\n     * Processes string query options.\r\n     */\r\n    processOptions(): ProcessedVoidOptions<T>\r\n    {\r\n        return {}\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(): boolean\r\n    {\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Searches items based on void query functionality.\r\n     */\r\n    search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return items\r\n    }\r\n}\r\n","import { ImmutableAugmentedItem, Item } from '../../stores/items-store/interfaces'\r\nimport { ExactValuesOpts, ProcExactValuesOpts } from './interfaces'\r\n\r\n\r\n/**\r\n * `Exact values searcher`. This class provides methods for searching items based on exact values.\r\n */\r\nexport class ExactValuesSearcher<T extends Item<T>>\r\n{\r\n    constructor(\r\n        protected readonly hasField: (key: keyof T) => boolean,\r\n    )\r\n    {}\r\n\r\n\r\n    /**\r\n     * Processes string query options.\r\n     */\r\n    processOptions(options: ExactValuesOpts<T>): ProcExactValuesOpts<T>\r\n    {\r\n        const p: ProcExactValuesOpts<T> = {\r\n            values: options.values,\r\n            mustMatchAllFields: options.mustMatchAllFields !== undefined ? options.mustMatchAllFields : true,\r\n            customCompareFns: options.customCompareFns !== undefined ? options.customCompareFns : {},\r\n        }\r\n\r\n        for (const field in p.values)\r\n        {\r\n            // @ts-ignore\r\n            p.customCompareFns[field as keyof T] = p.customCompareFns[field as keyof T] !== undefined ?\r\n                                                   p.customCompareFns[field as keyof T] :\r\n                                                   ((actualVal: any, expectedVal: any) => actualVal === expectedVal)\r\n        }\r\n\r\n        return p\r\n    }\r\n\r\n\r\n    /**\r\n     * Checks if the given options are valid.\r\n     */\r\n    checkKeys(options: ProcExactValuesOpts<T>): boolean\r\n    {\r\n        for (const field in options.values)\r\n        {\r\n            if (!this.hasField(field as keyof T))\r\n            {\r\n                return false\r\n            }\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n\r\n    /**\r\n     * Searches items based on exact values.\r\n     */\r\n    search(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        options: ProcExactValuesOpts<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.filterMatchingItemsUuids(\r\n            options.values,\r\n            options.mustMatchAllFields,\r\n            items,\r\n            options.customCompareFns,\r\n        )\r\n    }\r\n\r\n\r\n    /**\r\n     * Filters items based on exact values.\r\n     */\r\n    protected filterMatchingItemsUuids(\r\n        fieldsValues: ProcExactValuesOpts<T>['values'],\r\n        mustMatchAllFields: boolean,\r\n        items: ImmutableAugmentedItem<T>[],\r\n        customCompareFns: ProcExactValuesOpts<T>['customCompareFns'],\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        const searchedItems: ImmutableAugmentedItem<T>[] = []\r\n\r\n        for (const item of items)\r\n        {\r\n            let matchedValuesCountInCurrItem = 0\r\n\r\n            for (const field in fieldsValues)\r\n            {\r\n                const matchedOneVal = (fieldsValues[field as keyof T] as any).some(\r\n                    (expectedVal: any) => (customCompareFns[field as keyof T] as any)(\r\n                        item[field as keyof T],\r\n                        expectedVal,\r\n                    ),\r\n                )\r\n\r\n                if (matchedOneVal)\r\n                    matchedValuesCountInCurrItem += 1\r\n\r\n                if (!mustMatchAllFields && matchedOneVal)\r\n                    break\r\n                else if (mustMatchAllFields && !matchedOneVal)\r\n                    break\r\n            }\r\n\r\n            if (\r\n                (mustMatchAllFields && matchedValuesCountInCurrItem === Object.keys(fieldsValues).length)\r\n                ||\r\n                (!mustMatchAllFields && matchedValuesCountInCurrItem > 0)\r\n            )\r\n                searchedItems.push(item)\r\n        }\r\n\r\n        return searchedItems\r\n    }\r\n\r\n}\r\n","import {\r\n    ImmutableAugmentedItem,\r\n    ItemsAddedPayload, ItemsRemovedPayload, ItemsUpdatedPayload,\r\n    Item,\r\n} from '../../stores/items-store/interfaces'\r\nimport { StringQuerySearcher } from '../string-query-searcher/string-query-searcher'\r\nimport { DateRangeSearcher } from '../date-ranges-searcher/date-range-searcher'\r\nimport { NumberRangesSearcher } from '../numbers-range-searcher/number-ranges-searcher'\r\nimport { CustomSearcher } from '../custom-searcher/custom-searcher'\r\nimport { VoidSearcher } from '../void-searcher/void-searcher'\r\nimport { ExactValuesSearcher } from '../exact-values-searcher/exact-values-searcher'\r\nimport { Subject } from 'rxjs'\r\n\r\nimport {\r\n    DraftCustomSearchOptions,\r\n    DraftDateRangeSearchOptions,\r\n    DraftExactValueSearchOptions,\r\n    DraftNumberRangeSearchOptions,\r\n    DraftSearchableOptions,\r\n    DraftStringQuerySearchOptions,\r\n    DraftVoidSearchOptions,\r\n    SearchedItemsChangedPayload,\r\n    ProcessedSearchableOptions,\r\n    SearchOptionsChangedPayload,\r\n    ItemsSearchedPayload,\r\n} from './interfaces'\r\nimport { ItemsStore } from '../../stores/items-store/items-store'\r\nimport { FieldsStore } from '../../stores/fields-store/fields-store'\r\n\r\n\r\n/**\r\n * `Searcher`. This class is the parent of all searcher classes.\r\n */\r\nexport class Searcher<T extends Item<T>>\r\n{\r\n    protected allSearchedItems: ImmutableAugmentedItem<T>[][] = []\r\n    protected searchResults: ImmutableAugmentedItem<T>[] = []\r\n\r\n    protected readonly stringQuerySearcher: StringQuerySearcher<T>\r\n    protected readonly dateRangesSearcher: DateRangeSearcher<T>\r\n    protected readonly numbersRangesSearcher: NumberRangesSearcher<T>\r\n    protected readonly customFnSearcher: CustomSearcher<T>\r\n    protected readonly voidSearcher: VoidSearcher<T>\r\n    protected readonly exactValuesSearcher: ExactValuesSearcher<T>\r\n\r\n    protected readonly _options: ProcessedSearchableOptions<T>[] = []\r\n\r\n    public readonly $itemsSearched\r\n        = new Subject<ItemsSearchedPayload<T>>()\r\n\r\n    public readonly $searchedOptionsChanged\r\n        = new Subject<SearchOptionsChangedPayload<T>>()\r\n\r\n    public readonly $searchedItemsChanged\r\n        = new Subject<SearchedItemsChangedPayload<T>>()\r\n\r\n\r\n    constructor(\r\n        protected readonly hasField: FieldsStore<T>['hasField'],\r\n        protected readonly getFields: FieldsStore<T>['getFieldsAsArray'],\r\n        protected readonly getAllItems: ItemsStore<T>['getItems'],\r\n        protected readonly $itemsAdded: Subject<ItemsAddedPayload<T>>,\r\n        protected readonly $itemsRemoved: Subject<ItemsRemovedPayload<T>>,\r\n        protected readonly $itemsUpdated: Subject<ItemsUpdatedPayload<T>>,\r\n    )\r\n    {\r\n        this.stringQuerySearcher = new StringQuerySearcher(getFields, hasField)\r\n        this.dateRangesSearcher = new DateRangeSearcher(hasField)\r\n        this.numbersRangesSearcher = new NumberRangesSearcher(hasField)\r\n        this.customFnSearcher = new CustomSearcher()\r\n        this.voidSearcher = new VoidSearcher()\r\n        this.exactValuesSearcher = new ExactValuesSearcher(hasField)\r\n\r\n        $itemsRemoved.subscribe(this.onItemsRemoved.bind(this))\r\n        $itemsAdded.subscribe(this.onItemsAdded.bind(this))\r\n        $itemsUpdated.subscribe(this.onItemsUpdated.bind(this))\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the search options.\r\n     */\r\n    public getOptions(): Readonly<ProcessedSearchableOptions<T>[]>\r\n    {\r\n        return this._options\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the searched items.\r\n     */\r\n    public getItems(): Readonly<ImmutableAugmentedItem<T>[]>\r\n    {\r\n        return this.searchResults\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the mutable searched items.\r\n     */\r\n    public getMutableItems(): ImmutableAugmentedItem<T>[]\r\n    {\r\n        return this.searchResults\r\n    }\r\n\r\n\r\n    /**\r\n     * Clears the search.\r\n     */\r\n    public clearSearch(): void\r\n    {\r\n        const prevSearchResults = this.getItems()\r\n        const prevSearchOptions = [...this._options]\r\n\r\n        this._options.length = 0\r\n        this.allSearchedItems.length = 0\r\n        this.makeNewSearchResults()\r\n\r\n        if (prevSearchOptions.length !== this._options.length)\r\n        {\r\n            this.$searchedItemsChanged.next({\r\n                searchResults: this.getItems(),\r\n                prevSearchResults: prevSearchResults,\r\n            })\r\n\r\n            this.$searchedOptionsChanged.next({\r\n                options: this._options,\r\n                prevOptions: prevSearchOptions,\r\n            })\r\n\r\n            this.$itemsSearched.next({\r\n                options: this._options,\r\n                prevOptions: prevSearchOptions,\r\n                searchResults: this.getItems(),\r\n                prevSearchResults: prevSearchResults,\r\n            })\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the number of searched items.\r\n     */\r\n    public getNbOfSearchedItems(): number\r\n    {\r\n        return this.getItems().length\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByStringQuery(options: DraftStringQuerySearchOptions<T>): void\r\n    {\r\n        this.search('StringQuery', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByDateRanges(options: DraftDateRangeSearchOptions<T>): void\r\n    {\r\n        this.search('DateTimesRanges', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByNumbersRanges(options: DraftNumberRangeSearchOptions<T>): void\r\n    {\r\n        this.search('NumbersRanges', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByCustomFn(options: DraftCustomSearchOptions<T>): void\r\n    {\r\n        this.search('CustomFn', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByVoid(options: DraftVoidSearchOptions<T>): void\r\n    {\r\n        this.search('Void', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    public searchByExactValues(options: DraftExactValueSearchOptions<T>): void\r\n    {\r\n        this.search('ExactValues', options)\r\n    }\r\n\r\n\r\n    /**\r\n     * Search items by a specific type of query functionality.\r\n     */\r\n    protected search(\r\n        by: ProcessedSearchableOptions<T>['by'],\r\n        options: DraftSearchableOptions<T>,\r\n    ): void\r\n    {\r\n        const searcher = this.getTargetSearcher(by)\r\n\r\n        const processedOptions = this.processSharedOptions(\r\n            by,\r\n            options,\r\n            searcher.processOptions(options as any) as ProcessedSearchableOptions<T>,\r\n        )\r\n\r\n        if (!searcher.checkKeys(processedOptions as any))\r\n        {\r\n            console.warn('Invalid options keys', processedOptions)\r\n            return\r\n        }\r\n\r\n        this.performPrevResultsBehavior(processedOptions)\r\n\r\n        const targetItems = this.getTargetItems(processedOptions)\r\n\r\n        let newlySearchedItems: ImmutableAugmentedItem<T>[] = searcher.search(\r\n            targetItems,\r\n            processedOptions as any,\r\n        )\r\n\r\n        newlySearchedItems = this.performItemsReverting(\r\n            targetItems,\r\n            newlySearchedItems,\r\n            processedOptions,\r\n        )\r\n\r\n        const prevItems = this.getItems()\r\n        const prevOptions = this.getOptions().map(o => o)\r\n\r\n        this.allSearchedItems.push(newlySearchedItems)\r\n        this._options.push(processedOptions)\r\n\r\n        this.makeNewSearchResults()\r\n\r\n        this.$itemsSearched.next({\r\n            options: this.getOptions(),\r\n            prevOptions,\r\n            searchResults: this.getItems(),\r\n            prevSearchResults: prevItems,\r\n        })\r\n\r\n        this.$searchedItemsChanged.next({\r\n            searchResults: this.getItems(),\r\n            prevSearchResults: prevItems,\r\n        })\r\n\r\n        this.$searchedOptionsChanged.next({\r\n            options: this.getOptions(),\r\n            prevOptions,\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Creates the new search results.\r\n     */\r\n    protected makeNewSearchResults(): void\r\n    {\r\n        if (this.allSearchedItems.length === 0)\r\n        {\r\n            this.searchResults.splice(0, this.searchResults.length, ...this.getAllItems())\r\n            return\r\n        }\r\n\r\n        const searchedItemsResults: ImmutableAugmentedItem<T>[][] = []\r\n\r\n        for (let i = this.allSearchedItems.length - 1; i >= 0; i--)\r\n        {\r\n            searchedItemsResults.push(this.allSearchedItems[i])\r\n            if (this._options[i].searchTarget.scope === 'Prev')\r\n                break\r\n        }\r\n\r\n        searchedItemsResults.reverse()\r\n\r\n        this.searchResults.splice(0, this.searchResults.length, ...Array.from(new Set(searchedItemsResults.flat())))\r\n    }\r\n\r\n\r\n    /**\r\n     * Triggers when items are removed.\r\n     */\r\n    protected onItemsRemoved({ removedItems }: ItemsRemovedPayload<T>): void\r\n    {\r\n        const prevSearchResults = this.getItems()\r\n\r\n        for (let i = 0; i < this.allSearchedItems.length; i++)\r\n        {\r\n            this.allSearchedItems[i] = this.allSearchedItems[i].filter(\r\n                item => !removedItems.includes(item),\r\n            )\r\n        }\r\n\r\n        this.makeNewSearchResults()\r\n\r\n        if (prevSearchResults.length !== this.getItems().length)\r\n        {\r\n            this.$searchedItemsChanged.next({\r\n                searchResults: this.getItems(),\r\n                prevSearchResults: prevSearchResults,\r\n            })\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Triggers when items are added.\r\n     */\r\n    protected onItemsAdded({ addedItems }: ItemsAddedPayload<T>): void\r\n    {\r\n        const prevSearchResults = this.getItems()\r\n\r\n        let prevAddedItems: ImmutableAugmentedItem<T>[] = addedItems\r\n\r\n        for (let i = 0; i < this._options.length; i++)\r\n        {\r\n            const processedOptions = this._options[i]\r\n\r\n            let targetItems\r\n\r\n            if (processedOptions.searchTarget.scope === 'All')\r\n                targetItems = addedItems\r\n            else if (processedOptions.searchTarget.scope === 'Prev')\r\n                targetItems = prevAddedItems\r\n            else\r\n                throw new Error('Invalid search target scope')\r\n\r\n            const searcher = this.getTargetSearcher(processedOptions.by)\r\n\r\n            let itemsToAdd: ImmutableAugmentedItem<T>[] = searcher.search(\r\n                // @ts-ignore\r\n                targetItems,\r\n                processedOptions as any,\r\n            )\r\n\r\n            itemsToAdd = this.performItemsReverting(\r\n                targetItems,\r\n                itemsToAdd,\r\n                processedOptions,\r\n            )\r\n\r\n            this.allSearchedItems[i] = this.allSearchedItems[i].concat(itemsToAdd)\r\n\r\n            prevAddedItems = itemsToAdd\r\n        }\r\n\r\n        this.makeNewSearchResults()\r\n\r\n        if (prevSearchResults.length !== this.getItems().length)\r\n        {\r\n            this.$searchedItemsChanged.next({\r\n                searchResults: this.getItems(),\r\n                prevSearchResults: prevSearchResults,\r\n            })\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Triggers when items are updated.\r\n     */\r\n    protected onItemsUpdated({ updatedItems }: ItemsUpdatedPayload<T>): void\r\n    {\r\n        if (updatedItems.length === 0) return\r\n\r\n        const prevSearchResults = this.getItems()\r\n\r\n        for (let i = 0; i < this._options.length; i++)\r\n        {\r\n            const processedOptions = this._options[i]\r\n\r\n            let targetItems = updatedItems\r\n\r\n            const searcher = this.getTargetSearcher(processedOptions.by)\r\n\r\n            let itemsToAdd: ImmutableAugmentedItem<T>[] = searcher.search(\r\n                targetItems,\r\n                processedOptions as any,\r\n            )\r\n\r\n            itemsToAdd = this.performItemsReverting(\r\n                targetItems,\r\n                itemsToAdd,\r\n                processedOptions,\r\n            )\r\n\r\n            let itemsToRemove = targetItems.filter(item => !itemsToAdd.includes(item))\r\n\r\n            // Add items if not already there\r\n            itemsToAdd = itemsToAdd\r\n                .filter(item => !this.allSearchedItems[i].includes(item))\r\n\r\n            this.allSearchedItems[i] = this.allSearchedItems[i].concat(itemsToAdd)\r\n\r\n            // Remove items if already there\r\n            itemsToRemove = itemsToRemove\r\n                .filter(item => this.allSearchedItems[i].includes(item))\r\n\r\n            this.allSearchedItems[i] = this.allSearchedItems[i].filter(\r\n                item => !itemsToRemove.includes(item),\r\n            )\r\n        }\r\n\r\n        let anythingChanged = false\r\n\r\n        if (prevSearchResults.length === this.getItems().length)\r\n        {\r\n            const newSearchResults = this.getItems()\r\n\r\n            for (let i = 0; i < newSearchResults.length; i++)\r\n            {\r\n                if (newSearchResults[i] !== prevSearchResults[i])\r\n                    anythingChanged = true\r\n            }\r\n        }\r\n\r\n        this.makeNewSearchResults()\r\n\r\n        if (anythingChanged || prevSearchResults.length !== this.getItems().length)\r\n            this.$searchedItemsChanged.next({\r\n                searchResults: this.getItems(),\r\n                prevSearchResults: prevSearchResults,\r\n            })\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the target searcher.\r\n     */\r\n    protected getTargetSearcher(\r\n        by: ProcessedSearchableOptions<T>['by'],\r\n    ): StringQuerySearcher<T>\r\n        | DateRangeSearcher<T>\r\n        | NumberRangesSearcher<T>\r\n        | CustomSearcher<T>\r\n        | VoidSearcher<T>\r\n        | ExactValuesSearcher<T>\r\n    {\r\n        switch (by)\r\n        {\r\n            case 'StringQuery':\r\n                return this.stringQuerySearcher\r\n            case 'DateTimesRanges':\r\n                return this.dateRangesSearcher\r\n            case 'NumbersRanges':\r\n                return this.numbersRangesSearcher\r\n            case 'CustomFn':\r\n                return this.customFnSearcher\r\n            case 'Void':\r\n                return this.voidSearcher\r\n            case 'ExactValues':\r\n                return this.exactValuesSearcher\r\n            default:\r\n                throw new Error('Invalid search type')\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the target items.\r\n     */\r\n    protected getTargetItems(options: ProcessedSearchableOptions<T>): ImmutableAugmentedItem<T>[]\r\n    {\r\n        if (this.getOptions().length === 0) return this.getAllItems()\r\n\r\n        if (options.searchTarget.scope === 'All')\r\n            return this.getAllItems()\r\n\r\n        else if (options.searchTarget.scope === 'Prev')\r\n            return this.getMutableItems()\r\n\r\n        else\r\n            throw new Error('Invalid search target scope')\r\n    }\r\n\r\n\r\n    /**\r\n     * Performs the previous results' behavior.\r\n     */\r\n    protected performPrevResultsBehavior(\r\n        options: ProcessedSearchableOptions<T>,\r\n    ): void\r\n    {\r\n        const prevResults = options.prevResults\r\n\r\n        if (prevResults.action === 'Keep')\r\n            return\r\n\r\n        else if (prevResults.action === 'Clear')\r\n        {\r\n            if (prevResults.scope === 'All')\r\n                this.deleteSearchResults(0, this._options.length)\r\n\r\n            else if (prevResults.scope === 'Single')\r\n            {\r\n                if (prevResults.target === 'Last')\r\n                    this.deleteSearchResults(this._options.length - 1)\r\n\r\n                else if (prevResults.target === 'LastIfSameType')\r\n                {\r\n                    if (\r\n                        this._options.length > 0 &&\r\n                        this._options[this._options.length - 1].by === options.by\r\n                    )\r\n                        this.deleteSearchResults(this._options.length - 1)\r\n                }\r\n\r\n                else if (prevResults.target > -1)\r\n                    this.deleteSearchResults(prevResults.target)\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Deletes search results.\r\n     */\r\n    protected deleteSearchResults(optionsIndex: number, deletedCount: number = 1): void\r\n    {\r\n        this.allSearchedItems.splice(optionsIndex, deletedCount)\r\n        this._options.splice(optionsIndex, deletedCount)\r\n    }\r\n\r\n\r\n    /**\r\n     * Processes shared options.\r\n     */\r\n    protected processSharedOptions(\r\n        by: ProcessedSearchableOptions<T>['by'],\r\n        draftOptions: DraftSearchableOptions<T>,\r\n        preProcessedOptions: ProcessedSearchableOptions<T>,\r\n    ): ProcessedSearchableOptions<T>\r\n    {\r\n        preProcessedOptions.by = by\r\n\r\n        const processedOptions: ProcessedSearchableOptions<T> = { ...preProcessedOptions }\r\n\r\n        processedOptions.revertResultsAtEnd = draftOptions.revertResultsAtEnd !== undefined ?\r\n                                              draftOptions.revertResultsAtEnd : false\r\n\r\n        processedOptions.searchTarget = draftOptions.searchTarget !== undefined ?\r\n                                        draftOptions.searchTarget : { scope: 'Prev' }\r\n\r\n        const draftPrevResults = draftOptions.prevResults\r\n\r\n        if (draftPrevResults === undefined)\r\n        {\r\n            processedOptions.prevResults = {\r\n                action: 'Keep',\r\n            }\r\n\r\n            return processedOptions\r\n        }\r\n\r\n        if (draftPrevResults.action === undefined || draftPrevResults.action === 'Keep')\r\n        {\r\n            processedOptions.prevResults = {\r\n                action: 'Keep',\r\n            }\r\n        }\r\n        else if (draftPrevResults.action === 'Clear')\r\n        {\r\n            if (draftPrevResults.scope === undefined || draftPrevResults.scope === 'All')\r\n                processedOptions.prevResults = {\r\n                    action: 'Clear',\r\n                    scope: 'All',\r\n                }\r\n\r\n            else if (draftPrevResults.scope === 'Single')\r\n                processedOptions.prevResults = {\r\n                    action: 'Clear',\r\n                    scope: 'Single',\r\n                    target: this.resolveIndex(draftPrevResults.target),\r\n                }\r\n        }\r\n\r\n        return processedOptions\r\n    }\r\n\r\n\r\n    /**\r\n     * Resolves an index for searchable options.\r\n     * Makes sure that the index is not out of bounds.\r\n     */\r\n    protected resolveIndex(index: number | 'Last' | 'LastIfSameType'): number\r\n    {\r\n        const length = this._options.length\r\n\r\n        if (length === 0 || index === undefined) return length - 1\r\n\r\n        if (index === 'Last')\r\n            return length - 1\r\n\r\n        if (index === 'LastIfSameType')\r\n        {\r\n            if (this._options.length > 0 && this._options[this._options.length - 1].by === this._options[0].by)\r\n                return length - 1\r\n            else\r\n                return -1\r\n        }\r\n\r\n        if (index < 0)\r\n            return length + index >= 0 ? length + index : index\r\n\r\n        return index\r\n    }\r\n\r\n\r\n    /**\r\n     * Performs items revert.\r\n     */\r\n    protected performItemsReverting(\r\n        targetItems: ImmutableAugmentedItem<T>[],\r\n        searchedItems: ImmutableAugmentedItem<T>[],\r\n        processedOptions: ProcessedSearchableOptions<T>,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        if (!processedOptions.revertResultsAtEnd)\r\n            return searchedItems\r\n\r\n        return targetItems.filter(item => !searchedItems.includes(item))\r\n    }\r\n}\r\n","import { Subject } from 'rxjs'\r\nimport\r\n{\r\n    ImmutableAugmentedItem,\r\n    ItemsAddedPayload,\r\n    ItemsRemovedPayload,\r\n    Item,\r\n} from '../stores/items-store/interfaces'\r\nimport\r\n{\r\n    NbOfItemsPerPageChangedPayload,\r\n    NbOfTotalPagesChangedPayload,\r\n    PageNbChangedPayload,\r\n    PaginatedItemsChangedPayload,\r\n} from './interfaces'\r\nimport { SearchedItemsChangedPayload } from '../searcher/searcher/interfaces'\r\nimport { SortingOptionsChangedPayload } from '../sorter/interfaces'\r\nimport { Searcher } from '../searcher/searcher/searcher'\r\n\r\n\r\n/**\r\n * Handles pagination of items\r\n */\r\nexport class Paginator<T extends Item<T>>\r\n{\r\n    protected _paginatedItems: Readonly<ImmutableAugmentedItem<T>[]> = []\r\n    protected _pageNb: number = 1\r\n    protected _nbOfItemsPerPage: number = 10\r\n    protected _nbOfTotalPages: number = 1\r\n\r\n    public readonly $pageNbChanged = new Subject<PageNbChangedPayload<T>>()\r\n    public readonly $nbOfItemsPerPageChanged = new Subject<NbOfItemsPerPageChangedPayload<T>>()\r\n    public readonly $nbOfTotalPagesChanged = new Subject<NbOfTotalPagesChangedPayload<T>>()\r\n    public readonly $paginatedItemsChanged = new Subject<PaginatedItemsChangedPayload<T>>()\r\n\r\n\r\n    constructor(\r\n        protected readonly getSearchResults: Searcher<T>['getMutableItems'],\r\n        protected readonly $itemsRemoved: Subject<ItemsRemovedPayload<T>>,\r\n        protected readonly $itemsAdded: Subject<ItemsAddedPayload<T>>,\r\n        protected readonly $searchedItemsChanged: Subject<SearchedItemsChangedPayload<T>>,\r\n        protected readonly $sortingOptionsChanged: Subject<SortingOptionsChangedPayload<T>>,\r\n    )\r\n    {\r\n        this.$itemsRemoved.subscribe(() => this.handleItemsRemoved())\r\n        this.$itemsAdded.subscribe(() => this.handleItemsAdded())\r\n        this.$searchedItemsChanged.subscribe(() => this.handleItemsSearched())\r\n        this.$sortingOptionsChanged.subscribe(() => this.handleItemsSorted())\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current page number\r\n     */\r\n    public getPageNb(): number\r\n    {\r\n        return this._pageNb\r\n    }\r\n\r\n\r\n    /**\r\n     * Sets the current page number\r\n     */\r\n    public setPageNb(nb: number): void\r\n    {\r\n        this.updatePageNb(nb)\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the number of items per page\r\n     */\r\n    public getNbOfItemsPerPage(): number\r\n    {\r\n        return this._nbOfItemsPerPage\r\n    }\r\n\r\n\r\n    /**\r\n     * Sets the number of items per page\r\n     */\r\n    public setNbOfItemsPerPage(nb: number): void\r\n    {\r\n        this.updateItemsPerPage(nb)\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the total number of pages\r\n     */\r\n    public getNbOfPages(): number\r\n    {\r\n        return this._nbOfTotalPages\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current page index\r\n     */\r\n    public getPageIndex(): number\r\n    {\r\n        return this.getPageNb() - 1\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the total number of items\r\n     */\r\n    public getPageSize(): number\r\n    {\r\n        return this.getItems().length\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current page items\r\n     */\r\n    public getItems(): Readonly<ImmutableAugmentedItem<T>[]>\r\n    {\r\n        return this._paginatedItems\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected updatePageItemsInternal(): void\r\n    {\r\n        const prevPaginatedItems = this._paginatedItems\r\n\r\n        const startIdx = this.getPageIndex() * this._nbOfItemsPerPage\r\n        const endIdx =\r\n            this._nbOfItemsPerPage === -1\r\n            ? this.getSearchResults().length\r\n            : startIdx + this._nbOfItemsPerPage\r\n\r\n        if (this._nbOfItemsPerPage === -1)\r\n            this._paginatedItems = this.getSearchResults()\r\n        else\r\n            this._paginatedItems = this.getSearchResults().slice(startIdx, endIdx)\r\n\r\n        if (\r\n            prevPaginatedItems.length !== this._paginatedItems.length ||\r\n            !prevPaginatedItems.every((item, index) => item === this._paginatedItems[index])\r\n        )\r\n        {\r\n            this.raisePaginatedItemsChanged(prevPaginatedItems)\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the number of items per page\r\n     */\r\n    protected updateItemsPerPage(nb: number): void\r\n    {\r\n        if (nb < 0) nb = -1\r\n\r\n        if (nb === this._nbOfItemsPerPage)\r\n        {\r\n            return\r\n        }\r\n\r\n        const prevItemsPerPage = this._nbOfItemsPerPage\r\n        this._nbOfItemsPerPage = nb\r\n\r\n        this.updateNbOfTotalPages()\r\n        this.updatePageNb(this._pageNb)\r\n\r\n        this.raiseNbOfItemsPerPageChanged(prevItemsPerPage)\r\n        this.updatePageItemsInternal()\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page number\r\n     */\r\n    protected updatePageNb(nb: number): void\r\n    {\r\n        const prevPageNb = this._pageNb\r\n        this._pageNb = Math.max(1, Math.min(nb, this.getNbOfPages()))\r\n\r\n        if (this._pageNb !== prevPageNb)\r\n        {\r\n            this.raisePageNbChanged(prevPageNb)\r\n            this.updatePageItemsInternal()\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the number of total pages\r\n     */\r\n    protected updateNbOfTotalPages(): void\r\n    {\r\n        const prevNbOfTotalPages = this._nbOfTotalPages\r\n        const totalItems = this.getSearchResults().length\r\n\r\n        this._nbOfTotalPages = this._nbOfItemsPerPage === -1 ? 1 : Math.ceil(totalItems / this._nbOfItemsPerPage)\r\n\r\n        if (this._nbOfTotalPages !== prevNbOfTotalPages)\r\n        {\r\n            this.raiseNbOfTotalPagesChanged(prevNbOfTotalPages)\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected handleItemsRemoved(): void\r\n    {\r\n        this.updateNbOfTotalPages()\r\n        this.updatePageNb(this._pageNb)\r\n        this.updatePageItemsInternal()\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected handleItemsAdded(): void\r\n    {\r\n        this.updateNbOfTotalPages()\r\n        this.updatePageNb(this._pageNb)\r\n        this.updatePageItemsInternal()\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected handleItemsSearched(): void\r\n    {\r\n        this.updateNbOfTotalPages()\r\n        this.updatePageNb(this._pageNb)\r\n        this.updatePageItemsInternal()\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected handleItemsSorted(): void\r\n    {\r\n        this.updatePageItemsInternal()\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected raiseNbOfItemsPerPageChanged(prevNbOfItemsPerPage: number): void\r\n    {\r\n        this.$nbOfItemsPerPageChanged.next({\r\n            nbOfItemsPerPage: this._nbOfItemsPerPage,\r\n            prevNbOfItemsPerPage,\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected raiseNbOfTotalPagesChanged(prevNbOfTotalPages: number): void\r\n    {\r\n        this.$nbOfTotalPagesChanged.next({\r\n            nbOfTotalPages: this._nbOfTotalPages,\r\n            prevNbOfTotalPages,\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected raisePageNbChanged(prevPageNb: number): void\r\n    {\r\n        this.$pageNbChanged.next({ prevPageNb, pageNb: this._pageNb })\r\n    }\r\n\r\n\r\n    /**\r\n     * Updates the current page items\r\n     */\r\n    protected raisePaginatedItemsChanged(prevPaginatedItems: Readonly<ImmutableAugmentedItem<T>[]>): void\r\n    {\r\n        this.$paginatedItemsChanged.next({\r\n            paginatedItems: this._paginatedItems,\r\n            prevPaginatedItems,\r\n        })\r\n    }\r\n}\r\n","/**\r\n * Default compare function.\r\n */\r\nimport { ImmutableProcessedSortingOption } from './interfaces'\r\nimport { ImmutableAugmentedItem, Item } from '../stores/items-store/interfaces'\r\n\r\n\r\nexport function defaultCompareFn<T extends Item<T>, K extends keyof T>(\r\n    aItem: ImmutableAugmentedItem<T>,\r\n    bItem: ImmutableAugmentedItem<T>,\r\n    options: ImmutableProcessedSortingOption<T, K>,\r\n): number\r\n{\r\n    const {\r\n        prioritizeNulls,\r\n        prioritizeUndefineds,\r\n        numberOptions,\r\n        stringOptions,\r\n    } = options\r\n\r\n    try\r\n    {\r\n\r\n        const [a, b] = [aItem[options.field], bItem[options.field]]\r\n\r\n        // Handle null-specific options\r\n        if (a === null || b === null)\r\n        {\r\n            if (a === b) return 0\r\n            if (prioritizeNulls)\r\n            {\r\n                if (prioritizeNulls === 'AlwaysFirst' || prioritizeNulls === 'FirstOnASC')\r\n                    return a === null ? -1 : 1\r\n\r\n                if (prioritizeNulls === 'AlwaysLast' || prioritizeNulls === 'LastOnASC')\r\n                    return b === null ? -1 : 1\r\n            }\r\n        }\r\n\r\n        // Handle undefined-specific options\r\n        if (a === undefined || b === undefined)\r\n        {\r\n            if (a === b) return 0\r\n            if (prioritizeUndefineds)\r\n            {\r\n                if (prioritizeUndefineds === 'AlwaysFirst' || prioritizeUndefineds === 'FirstOnASC')\r\n                    return a === null ? -1 : 1\r\n\r\n                if (prioritizeUndefineds === 'AlwaysLast' || prioritizeUndefineds === 'LastOnASC')\r\n                    return b === null ? -1 : 1\r\n            }\r\n        }\r\n\r\n        // Handle string-specific options\r\n        if (typeof a === 'string' && typeof b === 'string')\r\n        {\r\n            let strA: string = a\r\n            let strB: string = b\r\n\r\n            if (stringOptions.ignoreWhitespaces)\r\n            {\r\n                strA = strA.trim()\r\n                strB = strB.trim()\r\n            }\r\n\r\n            if (!stringOptions.caseSensitive)\r\n            {\r\n                strA = strA.toLowerCase()\r\n                strB = strB.toLowerCase()\r\n            }\r\n\r\n            if (strA === strB) return 0\r\n            return strA < strB ? -1 : 1\r\n        }\r\n\r\n        // Handle the number-specific options\r\n        if (typeof a === 'number' && typeof b === 'number')\r\n        {\r\n            let numA: number = a\r\n            let numB: number = b\r\n\r\n            if (numberOptions.ignoreDecimals)\r\n            {\r\n                numA = Math.trunc(numA)\r\n                numB = Math.trunc(numB)\r\n            }\r\n\r\n            if (numA === numB) return 0\r\n            return numA < numB ? -1 : 1\r\n        }\r\n\r\n        // Handle date-specific options\r\n        if (a as Date instanceof Date && b as Date instanceof Date)\r\n        {\r\n            if ((a as Date).getTime() === (b as Date).getTime()) return 0\r\n            return (a as Date).getTime() < (b as Date).getTime() ? -1 : 1\r\n        }\r\n\r\n        // Default comparison\r\n        if (a === b) return 0\r\n        return a < b ? -1 : 1\r\n    }\r\n    catch (e)\r\n    {\r\n        console.error(e, aItem, bItem, options)\r\n        return 0\r\n    }\r\n}\r\n","/**\r\n * Resolves the index circularly.\r\n */\r\nexport function resolveIndex(index: number, length: number, resolveMinus = true): number\r\n{\r\n    let i = index\r\n    i %= length\r\n\r\n    if (resolveMinus && i < 0)\r\n        i += length\r\n\r\n    else if (!resolveMinus && i < 0)\r\n        i = 0\r\n\r\n    return i\r\n}\r\n\r\n/**\r\n * Checks if two arrays are equal by value.\r\n */\r\nexport function areEqualArrays<T>(a: T[], b: T[]): boolean\r\n{\r\n    if (a.length !== b.length) return false\r\n\r\n    for (let i = 0; i < a.length; i++)\r\n    {\r\n        if (a[i] !== b[i]) return false\r\n    }\r\n\r\n    return true\r\n}\r\n","import {\r\n    ImmutableAugmentedItem,\r\n    Item,\r\n    ItemsAddedPayload, ItemsRemovedPayload,\r\n    ItemsUpdatedPayload,\r\n} from '../stores/items-store/interfaces'\r\nimport { Subject } from 'rxjs'\r\nimport {\r\n    DraftSortingOptions,\r\n    ImmutableProcessedSortingOption,\r\n    ItemsSortedPayload,\r\n    ProcessedSortingOptions,\r\n    SortedItemsChangedPayload,\r\n    SortingOptionsChangedPayload,\r\n    SortRange,\r\n} from './interfaces'\r\nimport { SearchedItemsChangedPayload } from '../searcher/searcher/interfaces'\r\nimport { defaultCompareFn } from './sorter-utils'\r\nimport { areEqualArrays, resolveIndex } from '../utils/utility-fns'\r\nimport { FieldsStore } from '../stores/fields-store/fields-store'\r\nimport { Searcher } from '../searcher/searcher/searcher'\r\n\r\n\r\n/**\r\n * `Sorter` is responsible for sorting items.\r\n */\r\nexport class Sorter<T extends Item<T>>\r\n{\r\n    protected readonly _options: ProcessedSortingOptions<T, keyof T>[] = []\r\n    protected readonly _sortingRanges: SortRange[][] = []\r\n\r\n    public readonly $sortingOptionsChanged = new Subject<SortingOptionsChangedPayload<T>>()\r\n    public readonly $itemsSorted = new Subject<ItemsSortedPayload<T>>()\r\n    public readonly $sortedItemsChanged = new Subject<SortedItemsChangedPayload<T>>()\r\n\r\n\r\n    constructor(\r\n        protected readonly hasField: FieldsStore<T>['hasField'],\r\n        protected readonly getSearchResults: Searcher<T>['getMutableItems'],\r\n        protected readonly $searchedItemsChanged: Subject<SearchedItemsChangedPayload<T>>,\r\n        protected readonly $itemsAdded: Subject<ItemsAddedPayload<T>>,\r\n        protected readonly $itemsRemoved: Subject<ItemsRemovedPayload<T>>,\r\n        protected readonly $itemsUpdated: Subject<ItemsUpdatedPayload<T>>,\r\n    )\r\n    {\r\n        this.$searchedItemsChanged.subscribe(this.handleSearchedItemsChange.bind(this))\r\n        this.$itemsRemoved.subscribe(this.handleSearchedItemsChange.bind(this))\r\n        this.$itemsAdded.subscribe(this.handleSearchedItemsChange.bind(this))\r\n        this.$itemsUpdated.subscribe(this.handleSearchedItemsChange.bind(this))\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current sorting options\r\n     */\r\n    public getOptions(includingNoneOrdered: boolean = true): Readonly<ImmutableProcessedSortingOption<T, keyof T>[]>\r\n    {\r\n        if (includingNoneOrdered)\r\n            return this._options\r\n\r\n        return this._options.filter(o => o.order !== 'NONE')\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the keys of all current sorting options\r\n     */\r\n    public getSortingFieldKeys(includingNoneOrdered: boolean = true): (keyof T)[]\r\n    {\r\n        if (includingNoneOrdered)\r\n            return this._options.map(o => o.field)\r\n\r\n        return this._options.filter(o => o.order !== 'NONE').map(o => o.field)\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the order of all current sorting options\r\n     */\r\n    public getSortingFieldOrders(includingNoneOrdered: boolean = true): ProcessedSortingOptions<T, keyof T>['order'][]\r\n    {\r\n        if (includingNoneOrdered)\r\n            return this._options.map(o => o.order)\r\n\r\n        return this._options.filter(o => o.order !== 'NONE').map(o => o.order)\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the order of a specific sorting option\r\n     */\r\n    public getSortingFieldOrder(indexOrKey: number | keyof T): ProcessedSortingOptions<T, keyof T>['order'] | undefined\r\n    {\r\n        if (typeof indexOrKey === 'number')\r\n        {\r\n            return this._options[resolveIndex(indexOrKey, this._options.length)].order\r\n        }\r\n\r\n        return this._options.find(o => o.field === indexOrKey)?.order\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns whether a field is currently sorted\r\n     */\r\n    public isFieldSorted(field: keyof T, includingNoneOrdered: boolean = true): boolean\r\n    {\r\n        if (includingNoneOrdered)\r\n            return this._options.some(o => o.field === field)\r\n\r\n        return this._options.some(o => o.field === field && o.order !== 'NONE')\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current sorted items\r\n     */\r\n    public getItems(): Readonly<ImmutableAugmentedItem<T>[]>\r\n    {\r\n        return this.getSearchResults()\r\n    }\r\n\r\n\r\n    /**\r\n     * Returns the current sorting ranges\r\n     *\r\n     * @remarks\r\n     * This method is only for testing purposes\r\n     */\r\n    public getSortingRanges(): Readonly<Readonly<Readonly<SortRange>[]>[]>\r\n    {\r\n        return this._sortingRanges\r\n    }\r\n\r\n\r\n    /**\r\n     * Clears the sorting\r\n     */\r\n    public clearSort(): void\r\n    {\r\n        const prevOptions = [...this.getOptions(true)]\r\n        this._options.splice(0)\r\n        this._sortingRanges.splice(0)\r\n\r\n        const sortFn: (a: ImmutableAugmentedItem<T>, b: ImmutableAugmentedItem<T>) => number\r\n            = (a, b) => (a.tablorMeta.uuid - b.tablorMeta.uuid)\r\n\r\n        this.getSearchResults().sort(sortFn)\r\n\r\n        this.$sortingOptionsChanged.next({\r\n            options: this.getOptions(true),\r\n            prevOptions,\r\n        })\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorts the items based on the provided options.\r\n     */\r\n    public sort<K extends keyof T>(options: DraftSortingOptions<T, K>): void\r\n    {\r\n        if (!this.hasField(options.field))\r\n            return\r\n\r\n        const prevOptions = [...this.getOptions(true)]\r\n        const prevSortedItems = [...this.getSearchResults()]\r\n\r\n        const processedOptions = this.processOptions(options)\r\n\r\n        this.addNewOptions(processedOptions)\r\n\r\n        for (let i = processedOptions.insertBehavior.insertAt; i < this.getOptions(true).length; i++)\r\n        {\r\n            this.sortItems(i)\r\n        }\r\n\r\n        this.$sortingOptionsChanged.next({\r\n            options: this.getOptions(true),\r\n            prevOptions: prevOptions,\r\n        })\r\n\r\n        this.$itemsSorted.next({\r\n            items: this.getSearchResults(),\r\n            prevItems: prevSortedItems,\r\n        })\r\n\r\n        if (!areEqualArrays(this.getSearchResults(), prevSortedItems))\r\n            this.$sortedItemsChanged.next({\r\n                items: this.getSearchResults(),\r\n                prevItems: prevSortedItems,\r\n            })\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorts the items based on the current sorting options.\r\n     */\r\n    protected sortItems(optionsIndex: number): void\r\n    {\r\n        this._sortingRanges.splice(optionsIndex, this._sortingRanges.length)\r\n\r\n        const currOptions = this.getOptions(true)[optionsIndex]\r\n\r\n        const currCompareFn: ProcessedSortingOptions<T, keyof T>['customCompareFn'] =\r\n            currOptions.order === 'ORIGINAL' || currOptions.order === 'NONE' ?\r\n            (a, b) => (a.tablorMeta.uuid - b.tablorMeta.uuid) * -1 :\r\n            currOptions.customCompareFn\r\n\r\n        const currCompareFnForNestedMatch: ProcessedSortingOptions<T, keyof T>['customCompareFnForNestedMatch'] =\r\n            currOptions.order === 'ORIGINAL' ?\r\n            (a, b) => (a.tablorMeta.uuid - b.tablorMeta.uuid) * -1 :\r\n            currOptions.order === 'NONE' ?\r\n            () => 0 :\r\n            currOptions.customCompareFnForNestedMatch\r\n\r\n        if (optionsIndex === 0)\r\n        {\r\n            this.applySort(\r\n                this.getSearchResults(),\r\n                currCompareFn,\r\n                optionsIndex,\r\n            )\r\n\r\n            // this.searchResults().splice(0, this.searchResults().length, ...sortedItems)\r\n\r\n            this._sortingRanges.splice(\r\n                0, this._sortingRanges.length,\r\n                this.makeSortingRangesForNestedSortingOptions(\r\n                    this.getSearchResults(),\r\n                    currCompareFnForNestedMatch,\r\n                    optionsIndex,\r\n                ),\r\n            )\r\n        }\r\n        else\r\n        {\r\n            for (let range of this._sortingRanges[optionsIndex - 1])\r\n            {\r\n                const sortedItems = this.applySort(\r\n                    this.getSearchResults().slice(range.start, range.end),\r\n                    currCompareFn,\r\n                    optionsIndex,\r\n                )\r\n\r\n                this.getSearchResults().splice(range.start, range.end - range.start, ...sortedItems)\r\n            }\r\n\r\n            this._sortingRanges.splice(\r\n                optionsIndex, this._sortingRanges.length,\r\n                this.makeSortingRangesForNestedSortingOptions(\r\n                    this.getSearchResults(),\r\n                    currCompareFnForNestedMatch,\r\n                    optionsIndex,\r\n                ),\r\n            )\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * Creates sorting ranges for nested sorting options.\r\n     */\r\n    protected makeSortingRangesForNestedSortingOptions(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        currCompareFnForNestedMatch: ProcessedSortingOptions<T, keyof T>['customCompareFnForNestedMatch'],\r\n        optionsIndex: number = 0,\r\n    ): SortRange[]\r\n    {\r\n        const sortingRanges: SortRange[] = []\r\n\r\n        const superRanges: SortRange[] =\r\n            optionsIndex === 0 ?\r\n                [{ start: 0, end: items.length }] :\r\n            this._sortingRanges[optionsIndex - 1]\r\n\r\n        for (let range of superRanges)\r\n        {\r\n            let start = range.start\r\n            for (let i = start + 1; i < range.end; i++)\r\n            {\r\n                const areSame = currCompareFnForNestedMatch(\r\n                    items[start],\r\n                    items[i],\r\n                    this._options[optionsIndex],\r\n                ) === 0\r\n\r\n                if (i === range.end - 1)\r\n                {\r\n                    if (areSame)\r\n                    {\r\n                        sortingRanges.push({ start, end: i + 1 })\r\n                    }\r\n                    else\r\n                    {\r\n                        sortingRanges.push({ start, end: i })\r\n                        sortingRanges.push({ start: i, end: i + 1 })\r\n                    }\r\n                }\r\n                else if (!areSame)\r\n                {\r\n                    sortingRanges.push({ start, end: i })\r\n                    start = i\r\n                }\r\n            }\r\n        }\r\n\r\n        return sortingRanges\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorts the items based on the given compare function.\r\n     */\r\n    protected applySort<K extends keyof T>(\r\n        items: ImmutableAugmentedItem<T>[],\r\n        compareFn: ProcessedSortingOptions<T, K>['customCompareFn'],\r\n        optionsIndex: number,\r\n    ): ImmutableAugmentedItem<T>[]\r\n    {\r\n        if (items.length <= 1) return items\r\n\r\n        const options: ProcessedSortingOptions<T, K> = this.getOptions(true)[optionsIndex] as any\r\n\r\n        const orderedCompareFn: (a: ImmutableAugmentedItem<T>, b: ImmutableAugmentedItem<T>) => number =\r\n            (a, b) =>\r\n            {\r\n                return compareFn(a, b, options) * (options.order === 'ASC' ? 1 : -1)\r\n            }\r\n\r\n        items.sort(orderedCompareFn)\r\n\r\n        return items\r\n    }\r\n\r\n\r\n    /**\r\n     * Transform\\\\\\\\s the given draft options into processed options with meta-data.\r\n     */\r\n    protected processOptions<K extends keyof T>(options: DraftSortingOptions<T, K>):\r\n        ProcessedSortingOptions<T, K>\r\n    {\r\n        let insertBehavior: ProcessedSortingOptions<T, K>['insertBehavior'] = {\r\n            insertAt: !options.insertBehavior && !options.clear ?\r\n                      this._options.findIndex(o => o.field === options.field) : this._options.length,\r\n        }\r\n\r\n        if (options.insertBehavior)\r\n        {\r\n            if (typeof options.insertBehavior.insertAt === 'string')\r\n                insertBehavior.insertAt = this._options.findIndex(o => o.field === insertBehavior.insertAt)\r\n            else if (typeof options.insertBehavior.insertAt === 'number')\r\n                insertBehavior.insertAt = options.insertBehavior.insertAt\r\n        }\r\n        insertBehavior.insertAt = resolveIndex(\r\n            insertBehavior.insertAt,\r\n            this._options.length + 1,\r\n        )\r\n\r\n        const processedOptions: ProcessedSortingOptions<T, K> = {\r\n            field: options.field,\r\n\r\n            stringOptions: {\r\n                caseSensitive:\r\n                    options.stringOptions?.caseSensitive !== undefined ?\r\n                    options.stringOptions.caseSensitive : false,\r\n\r\n                ignoreWhitespaces:\r\n                    options.stringOptions?.ignoreWhitespaces !== undefined ?\r\n                    options.stringOptions.ignoreWhitespaces : true,\r\n            },\r\n\r\n            numberOptions: {\r\n                ignoreDecimals:\r\n                    options.numberOptions?.ignoreDecimals !== undefined ?\r\n                    options.numberOptions.ignoreDecimals : false,\r\n            },\r\n\r\n            customCompareFn:\r\n                options.customCompareFn === undefined ?\r\n                defaultCompareFn : options.customCompareFn,\r\n\r\n            customCompareFnForNestedMatch:\r\n                options.customCompareFnForNestedMatch === undefined ?\r\n                defaultCompareFn : options.customCompareFnForNestedMatch,\r\n\r\n            prioritizeNulls:\r\n                options.prioritizeNulls !== undefined ? options.prioritizeNulls : 'FirstOnASC',\r\n\r\n            prioritizeUndefineds:\r\n                options.prioritizeUndefineds !== undefined ? options.prioritizeUndefineds : 'FirstOnASC',\r\n\r\n            insertBehavior: insertBehavior,\r\n\r\n            clear:\r\n                options.clear ? options.clear : { target: 'InsertPosition' },\r\n\r\n            order: options.order as any,\r\n\r\n            supportedToggleOrders: undefined as any,\r\n\r\n            toggleOrderIndex: undefined as any,\r\n        }\r\n\r\n        const replacingOptions = this._options[processedOptions.insertBehavior.insertAt]\r\n\r\n        if (options.order === 'Toggle')\r\n        {\r\n            if (options.supportedToggleOrders)\r\n                processedOptions.supportedToggleOrders = options.supportedToggleOrders\r\n            else\r\n                processedOptions.supportedToggleOrders = ['ASC', 'DESC', 'NONE']\r\n\r\n            if (options.toggleOrderIndex)\r\n                processedOptions.toggleOrderIndex = options.toggleOrderIndex\r\n            else\r\n            {\r\n\r\n                if (!replacingOptions)\r\n                    processedOptions.toggleOrderIndex = 0\r\n                else if (\r\n                    replacingOptions.supportedToggleOrders &&\r\n                    replacingOptions.field === processedOptions.field\r\n                )\r\n                {\r\n                    processedOptions.toggleOrderIndex = replacingOptions.toggleOrderIndex + 1\r\n                }\r\n                else\r\n                    processedOptions.toggleOrderIndex = 0\r\n            }\r\n\r\n            processedOptions.toggleOrderIndex = resolveIndex(\r\n                processedOptions.toggleOrderIndex,\r\n                processedOptions.supportedToggleOrders.length,\r\n            )\r\n            processedOptions.order = processedOptions.supportedToggleOrders[processedOptions.toggleOrderIndex]\r\n        }\r\n\r\n        if (options.processingCallback)\r\n            options.processingCallback(\r\n                processedOptions,\r\n                replacingOptions,\r\n                this.getOptions(true),\r\n            )\r\n\r\n        return processedOptions\r\n    }\r\n\r\n\r\n    /**\r\n     * Performs the behavior for handling new and previously sorted fields.\r\n     */\r\n    protected addNewOptions<K extends keyof T>(options: ProcessedSortingOptions<T, K>): void\r\n    {\r\n        let actualTarget: number\r\n        let deleteLength: number\r\n\r\n        if (options.clear.target === 'All')\r\n        {\r\n            actualTarget = 0\r\n            deleteLength = this._options.length\r\n        }\r\n        else if (options.clear.target === 'AllParent')\r\n        {\r\n            actualTarget = 0\r\n            deleteLength = options.insertBehavior.insertAt\r\n        }\r\n        else if (options.clear.target === 'AllNested')\r\n        {\r\n            actualTarget = options.insertBehavior.insertAt\r\n            deleteLength = this._options.length - options.insertBehavior.insertAt\r\n        }\r\n        else if (options.clear.target === 'InsertPosition')\r\n        {\r\n            actualTarget = options.insertBehavior.insertAt\r\n            deleteLength = 1\r\n        }\r\n        else\r\n        {\r\n            actualTarget = options.insertBehavior.insertAt\r\n            deleteLength = 0\r\n        }\r\n\r\n        this._options.splice(\r\n            actualTarget,\r\n            deleteLength,\r\n            options as any,\r\n        )\r\n\r\n        this._sortingRanges.splice(\r\n            actualTarget,\r\n            this._options.length,\r\n        )\r\n\r\n        options.insertBehavior.insertAt = actualTarget\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorts the items based on the current sorting options.\r\n     */\r\n    protected handleSearchedItemsChange(): void\r\n    {\r\n        const prevSortedItems = [...this.getSearchResults()]\r\n\r\n        for (let optionsIndex = 0; optionsIndex < this._options.length; optionsIndex++)\r\n        {\r\n            this.sortItems(optionsIndex)\r\n        }\r\n\r\n        if (\r\n            prevSortedItems.length !== this.getSearchResults().length ||\r\n            prevSortedItems.some((item, index) => item !== this.getSearchResults()[index])\r\n        )\r\n        {\r\n            this.$sortedItemsChanged.next({\r\n                items: this.getSearchResults(),\r\n                prevItems: prevSortedItems,\r\n            })\r\n        }\r\n    }\r\n\r\n}\r\n","import { Item } from '../stores/items-store/interfaces'\r\nimport { ItemsStore } from '../stores/items-store/items-store'\r\nimport { FieldsStore } from '../stores/fields-store/fields-store'\r\nimport { Selector } from '../selector/selector'\r\nimport { Searcher } from '../searcher/searcher/searcher'\r\nimport { Paginator } from '../paginator/paginator'\r\nimport { Sorter } from '../sorter/sorter'\r\n\r\n\r\n/**\r\n * **TablorCore Class**\r\n *\r\n * A core functionality library for building flexible data tables, grids, and item lists in frameworks like Angular and React.\r\n *\r\n * ---\r\n *\r\n * **Core Functionalities**:\r\n * 1. **Pagination**:\r\n *    - Support for single-page and multiple-page data pagination.\r\n *\r\n * 2. **Searching**:\r\n *    - Advanced string query processing, including splitting into words and matching patterns like startsWith, endsWith, contains, and anywhere.\r\n *    - Ensure all query words match with `mustMatchAllWords`.\r\n *    - Filter by number ranges, date ranges, exact values, and inverted results.\r\n *    - Advanced searches like distance and priority filtering planned for future releases.\r\n *\r\n * 3. **Sorting**:\r\n *    - Single-field and multi-field hierarchical sorting.\r\n *\r\n * 4. **Selection**:\r\n *    - Programmatic selection and unselection of items.\r\n *\r\n * 5. **Fields**:\r\n *    - Define searchable fields during initialization.\r\n *\r\n * 6. **Items**:\r\n *    - Add, remove, and update items dynamically.\r\n *    - Support for both instant and lazy data loading (planned).\r\n *\r\n * 7. **Events**:\r\n *    - Emit events for actions like searching, sorting, and pagination to provide extensive customizability.\r\n *\r\n * ---\r\n *\r\n * **Features**:\r\n * - Focuses purely on core functionalities, with no UI.\r\n * - Highly extensible and designed for developers to adapt to their needs.\r\n *\r\n * ---\r\n *\r\n * **Get Started**:\r\n * - **GitHub Repository**: [TablorCore on GitHub](https://github.com/TIPUzee/tablor-core)\r\n *   Explore the repository for documentation, examples, and contribution guidelines.\r\n * - **NPM Package**: Search for `tablor-core` on [npmjs.com](https://www.npmjs.com/)\r\n * to install and integrate this library into your projects.\r\n *\r\n * ---\r\n *\r\n * **Developed by**: Zeeshan Nadeem\r\n * **GitHub**: [TIPUzee](https://github.com/TIPUzee)\r\n * **License**: Apache-2.0\r\n *\r\n * ---\r\n *\r\n * **Open Source Contribution**:\r\n * Developers are encouraged to contribute, enhance functionality, and share ideas.\r\n * Submit pull requests, raise issues, or provide feedback on GitHub to make this library better for the community.\r\n */\r\nexport class TablorCore<T extends Item<T>>\r\n{\r\n    protected readonly fieldsStore: FieldsStore<T> = new FieldsStore<T>()\r\n\r\n    protected readonly itemsStore: ItemsStore<T> =\r\n        new ItemsStore<T>(this.fieldsStore.getFieldsAsArray.bind(this.fieldsStore))\r\n\r\n    protected readonly searcher = new Searcher<T>(\r\n        this.fieldsStore.hasField.bind(this.fieldsStore),\r\n        this.fieldsStore.getFieldsAsArray.bind(this.fieldsStore),\r\n        this.itemsStore.getItems.bind(this.itemsStore),\r\n        this.itemsStore.$itemsAdded,\r\n        this.itemsStore.$itemsRemoved,\r\n        this.itemsStore.$itemsUpdated,\r\n    )\r\n\r\n    protected readonly sorter = new Sorter<T>(\r\n        this.fieldsStore.hasField.bind(this.fieldsStore),\r\n        this.searcher.getMutableItems.bind(this.searcher),\r\n        this.searcher.$searchedItemsChanged,\r\n        this.itemsStore.$itemsAdded,\r\n        this.itemsStore.$itemsRemoved,\r\n        this.itemsStore.$itemsUpdated,\r\n    )\r\n\r\n    protected readonly paginator = new Paginator(\r\n        this.searcher.getMutableItems.bind(this.searcher),\r\n        this.itemsStore.$itemsRemoved,\r\n        this.itemsStore.$itemsAdded,\r\n        this.searcher.$searchedItemsChanged,\r\n        this.sorter.$sortingOptionsChanged,\r\n    )\r\n\r\n    protected readonly selector = new Selector<T>(\r\n        this.itemsStore.getMutableItems.bind(this.itemsStore),\r\n        this.paginator.getItems.bind(this.paginator),\r\n        this.itemsStore.findOneIndexForEach.bind(this.itemsStore),\r\n        this.itemsStore.$itemsRemoved,\r\n    )\r\n\r\n\r\n    constructor() { }\r\n\r\n\r\n    /** ------------ SUBSCRIPTIONS ------------ */\r\n\r\n\r\n    public $itemsAdded = this.itemsStore.$itemsAdded\r\n    public $itemsRemoved = this.itemsStore.$itemsRemoved\r\n    public $itemsUpdated = this.itemsStore.$itemsUpdated\r\n\r\n    public $itemsSelectionChanged = this.selector.$itemsSelectionChanged\r\n\r\n    public $searchedItemsChanged = this.searcher.$searchedItemsChanged\r\n    public $itemsSearched = this.searcher.$itemsSearched\r\n    public $searchedOptionsChanged = this.searcher.$searchedOptionsChanged\r\n\r\n    public $sortedItemsChanged = this.sorter.$sortedItemsChanged\r\n    public $itemsSorted = this.sorter.$itemsSorted\r\n    public $sortingOptionsChanged = this.sorter.$sortingOptionsChanged\r\n\r\n    public $paginatedItemsChanged = this.paginator.$paginatedItemsChanged\r\n    public $pageNbChanged = this.paginator.$pageNbChanged\r\n    public $nbOfItemsPerPageChanged = this.paginator.$nbOfItemsPerPageChanged\r\n    public $nbOfTotalPagesChanged = this.paginator.$nbOfTotalPagesChanged\r\n\r\n    /** ------------ SEARCH METHODS ------------ */\r\n\r\n    /**\r\n     * Searches the items by multiple number ranges for multiple fields.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `ranges`: An object containing the number ranges for each field (fields as a key, array of number ranges\r\n     *     objects).\r\n     *   - `mustMatchAllFields`: A boolean value indicating whether all fields must match the number ranges.\r\n     *   - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByNumbersRanges({\r\n     *     ranges: {\r\n     *         field1: [{ min: 1, max: 10 }, { min: 20 }],\r\n     *         field2: [{ max: 10 }],\r\n     *     },\r\n     *     mustMatchAllFields: true,  // Optional\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     */\r\n    searchByNumbersRanges\r\n        = this.searcher.searchByNumbersRanges.bind(this.searcher)\r\n\r\n    /**\r\n     * Searches the items by multiple exact values for multiple fields.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `values`: An object containing the exact values for each field (fields as a key, array of exact values).\r\n     * - `mustMatchAllFields`: A boolean value indicating whether all fields must match the number ranges.\r\n     *  - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByExactValues({\r\n     *     values: {\r\n     *         field1: ['value1', 'value2'],\r\n     *         field2: ['value3'],\r\n     *     },\r\n     *     customCompareFns: {  // Optional\r\n     *         field2: (actualVal: Date, expectedVal: Date) => actualVal.getTime() === expectedVal.getTime(),\r\n     *     },\r\n     *     mustMatchAllFields: true,  // Optional\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     */\r\n    searchByExactValues\r\n        = this.searcher.searchByExactValues.bind(this.searcher)\r\n\r\n    /**\r\n     * Searches the items by one or multiple string queries.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `query`: A string query or an array of string queries.\r\n     *   - `includeFields`: An array of fields to include in the search.\r\n     *   If empty or not provided, then all fields will be included.\r\n     *   **(Default: [])**\r\n     *   - `excludeFields`: An array of fields to exclude from the search. **(Default: [])**\r\n     *   - `singleWordMatchCriteria`: A string value indicating the match criteria for single-word queries.\r\n     *   **(Default: 'Contains')**.\r\n     *   `Contains`: Matches the substring anywhere in the word.\r\n     *   `StartsWith`: Matches\r\n     *   the substring at the beginning of the word.\r\n     *   `EndsWith`: Matches the substring at the end of the\r\n     *   word.\r\n     *   `ExactMatch`: Matches the exact complete word.\r\n     *   - `mustMatchAllWords`: A boolean value indicating whether all words must match the query.\r\n     *   **(Default: true)**\r\n     *   - `wordsMustBeInOrder`: A boolean value indicating whether the words must be in order.\r\n     *   **(Default: false)**\r\n     *   - `convertNonStringTypes`: An array of primitive types to convert to string before searching.\r\n     *   **(Default: ['string', 'number', 'boolean', 'date'])**.\r\n     *   NOTE: `date` is not yet supported.\r\n     *   - `ignoreWhitespace`: A boolean value indicating whether to ignore whitespace in the query.\r\n     *   **(Default: true)**\r\n     *   - `wordSeparator`: A string value indicating the separator between words in the query.\r\n     *   **(Default: \" \")**\r\n     *   - `isCaseSensitive`: A boolean value indicating whether the search is case-sensitive.\r\n     *   **(Default: false)**\r\n     *   - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   **(Default: 'ClearPrev')**\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *   **(Default: false)**\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByStringQuery({\r\n     *     query: 'search query',\r\n     *     includeFields: [],  // Optional\r\n     *     excludeFields: ['field3'],  // Optional\r\n     *     singleWordMatchCriteria: 'Contains',  // Optional\r\n     *     mustMatchAllWords: true,  // Optional\r\n     *     wordsMustBeInOrder: false,  // Optional\r\n     *     convertNonStringTypes: ['number'],  // Optional\r\n     *     ignoreWhitespace: true,  // Optional\r\n     *     wordSeparator: ' ',  // Optional\r\n     *     isCaseSensitive: false,  // Optional\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: false,  // Optional\r\n     * })\r\n     * ```\r\n     */\r\n    searchByStringQuery\r\n        = this.searcher.searchByStringQuery.bind(this.searcher)\r\n\r\n    /**\r\n     * Searches the items by a void query.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `query`: A string query.\r\n     *   - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByVoid({\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     *\r\n     * @remarks\r\n     * - This method can be used to clear the search results.\r\n     * - This method can be used to revert all the searched items.\r\n     */\r\n    searchByVoid\r\n        = this.searcher.searchByVoid.bind(this.searcher)\r\n\r\n    /**\r\n     * Searches the items by date ranges for multiple fields.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `ranges`: An object containing the date ranges for each field (fields as a key, array of date ranges).\r\n     *   - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByDateTimesRanges({\r\n     *     ranges: {\r\n     *         hire_date: [\r\n     *             {\r\n     *                 start: new Date('2020-01-01'),\r\n     *                 includeStart: true,\r\n     *                 end: new Date('2021-01-01'),\r\n     *                 includeEnd: false,\r\n     *             },\r\n     *         ],\r\n     *     },\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByDateTimesRanges({\r\n     *     ranges: {\r\n     *         hire_date: [\r\n     *             {\r\n     *                 start: '2020-01-01',\r\n     *                 includeStart: true,\r\n     *                 end: 'Now',\r\n     *                 includeEnd: false,\r\n     *             }\r\n     *         ],\r\n     *     },\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByDateTimesRanges({\r\n     *     ranges: {\r\n     *         hire_date: [\r\n     *             {\r\n     *                 start: 'Now',\r\n     *                 startOffset: {\r\n     *                     years: -2,  // 2 years back from now\r\n     *                 },\r\n     *                 includeStart: true,\r\n     *                 end: 'Now'\r\n     *             }\r\n     *         ],\r\n     *     },\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     */\r\n    searchByDateTimesRanges\r\n        = this.searcher.searchByDateRanges.bind(this.searcher)\r\n\r\n    /**\r\n     * Searches the items by a custom function.\r\n     *\r\n     * @keywords `revert` - If reverted, all the _new searched_ items will be replaced by\r\n     * non-searched items.\r\n     *\r\n     * @parameter options - An object with the following properties:\r\n     *   - `customName`: A string name for the custom search.\r\n     *   - `customFn`: A function that takes the following parameters:\r\n     *     - `item`: The item to evaluate.\r\n     *     - `items`: The list of all items.\r\n     *     and returns a boolean.\r\n     *   - `searchBehavior`: A string value indicating the search behavior (ClearPrev, SearchInPrev, MergeInPrev).\r\n     *   - `revertResultsAtEnd`: A boolean value indicating whether to revert the results at the end of the search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByCustomFn({\r\n     *     fn: (item: AugmentedItem<T>) => item.name === 'John Doe',\r\n     *     searchBehavior: 'ClearPrev',  // Optional\r\n     *     revertResultsAtEnd: true,  // Optional\r\n     * })\r\n     * ```\r\n     */\r\n    searchByCustomFn\r\n        = this.searcher.searchByCustomFn.bind(this.searcher)\r\n\r\n    /**\r\n     * Clears the current search.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.clearSearch()\r\n     * ```\r\n     */\r\n    clearSearch\r\n        = this.searcher.clearSearch.bind(this.searcher)\r\n\r\n    /**\r\n     * Retrieves all the current searched items.\r\n     *\r\n     * @returnings an array of current searched items.\r\n     *\r\n     * @remarks\r\n     * If no search is performed, all the items will be returned.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = tablor.getSearchedItems()\r\n     * // [\r\n     * //     {\r\n     * //         name: 'John wick',\r\n     * //         surname: 'Doe',\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 1, ... }\r\n     * //     },\r\n     * //     ...\r\n     * // ]\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByStringQuery({\r\n     *     name: 'john',\r\n     * })\r\n     *\r\n     * const items = tablor.getSearchedItems()\r\n     * // [\r\n     * //     {\r\n     * //         name: 'John wick',\r\n     * //         surname: 'Doe',\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 1, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         name: 'Alison',\r\n     * //         surname: 'Alison John',\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 2, ... }\r\n     * //     },\r\n     * //     ...\r\n     * // ]\r\n     * ```\r\n     */\r\n    getSearchedItems\r\n        = this.searcher.getItems.bind(this.searcher)\r\n\r\n    /**\r\n     * Retrieves the current search options.\r\n     *\r\n     * @returnings an array of current search items.\r\n     *\r\n     * @remarks\r\n     * This method returns processed search options.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.searchByStringQuery({\r\n     *     query: 'john wick',\r\n     * })\r\n     *\r\n     * tablor.searchByDateTimesRanges({\r\n     *     ranges: {\r\n     *         hire_date: [\r\n     *             { start: 'Now' }\r\n     *         ]\r\n     *     }\r\n     * })\r\n     *\r\n     * const options = tablor.getSearchOptions()\r\n     * // [\r\n     * //    {\r\n     * //        by: 'StringQuery',\r\n     * //        query: 'john wick',\r\n     * //        words: [ 'john', 'wick' ],\r\n     * //        includeFields: [\r\n     * //            'field1', 'field2',\r\n     * //            'field3', ...\r\n     * //        ],\r\n     * //        excludeFields: [],\r\n     * //        singleWordMatchCriteria: 'Contains',\r\n     * //        mustMatchAllWords: true,\r\n     * //        wordsMustBeInOrder: false,\r\n     * //        convertNonStringTypes: [ 'string', 'number', 'boolean', 'date' ],\r\n     * //        ignoreWhitespace: true,\r\n     * //        wordSeparator: ' ',\r\n     * //        isCaseSensitive: false\r\n     * //        searchBehavior: 'ClearPrev',\r\n     * //        revertResultsAtEnd: false\r\n     * //    },\r\n     * //    {\r\n     * //        by: 'DateTimesRanges',\r\n     * //        ranges: {\r\n     * //            hire_date: [{\r\n     * //                 start: new Date('2024-01-01'),\r\n     * //                 includeStart: false,\r\n     * //                 end: undefined,\r\n     * //                 includeEnd: undefined\r\n     * //            }]\r\n     * //        },\r\n     * //        mustMatchAllFields: true,\r\n     * //        searchBehavior: 'ClearPrev',\r\n     * //        revertResultsAtEnd: false\r\n     * //    }\r\n     * // ]\r\n     * ```\r\n     */\r\n    getSearchOptions\r\n        = this.searcher.getOptions.bind(this.searcher)\r\n\r\n    /**\r\n     * Retrieves the number of searched items.\r\n     *\r\n     * @returnings the number of searched items\r\n     *\r\n     * @keywords\r\n     * searched items - Items that are searched.\r\n     * Search is identified by the `tablorMeta.uuid` property.\r\n     */\r\n    getNbOfSearchedItems\r\n        = this.searcher.getNbOfSearchedItems.bind(this.searcher)\r\n\r\n    /** ------------ SELECT METHODS  ------------ */\r\n\r\n    /**\r\n     * Retrieves the number of selected items.\r\n     *\r\n     * @returnings the number of selected items\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getNbOfSelectedItems\r\n        = this.selector.getNbOfSelectedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the number of unselected items.\r\n     *\r\n     * @returnings the number of unselected items\r\n     *\r\n     * @keywords\r\n     * unselected items - Items that are unselected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getNbOfUnselectedItems\r\n        = this.selector.getNbOfUnselectedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the number of selected paginated items.\r\n     *\r\n     * @returnings the number of selected paginated items\r\n     *\r\n     * @keywords\r\n     * selected paginated items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getNbOfSelectedPaginatedItems\r\n        = this.selector.getNbOfSelectedPaginatedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the number of unselected paginated items.\r\n     *\r\n     * @returnings the number of unselected paginated items\r\n     *\r\n     * @keywords\r\n     * unselected paginated items - Items that are unselected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getNbOfUnselectedPaginatedItems\r\n        = this.selector.getNbOfUnselectedPaginatedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the selected items.\r\n     *\r\n     * @returnings the selected items\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getSelectedItems\r\n        = this.selector.getSelectedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the unselected items.\r\n     *\r\n     * @returnings the unselected items\r\n     *\r\n     * @keywords\r\n     * unselected items - Items that are unselected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getUnselectedItems\r\n        = this.selector.getUnselectedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the selected item uuids.\r\n     *\r\n     * @returnings the selected item uuids\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getSelectedItemUuids\r\n        = this.selector.getSelectedItemUuids.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the unselected item uuids.\r\n     *\r\n     * @returnings the unselected item uuids\r\n     *\r\n     * @keywords\r\n     * unselected items - Items that are unselected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getUnselectedItemUuids\r\n        = this.selector.getUnselectedItemUuids.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the selected paginated items.\r\n     *\r\n     * @returnings the selected paginated items\r\n     *\r\n     * @keywords\r\n     * selected paginated items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getSelectedPaginatedItems\r\n        = this.selector.getSelectedPaginatedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the unselected paginated items.\r\n     *\r\n     * @returnings the unselected paginated items\r\n     *\r\n     * @keywords\r\n     * unselected paginated items - Items that are unselected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     */\r\n    getUnselectedPaginatedItems\r\n        = this.selector.getUnselectedPaginatedItems.bind(this.selector)\r\n\r\n    /**\r\n     * Retrieves the number of selected items in the given items.\r\n     *\r\n     * @returnings the number of selected items\r\n     *\r\n     * @remarks\r\n     * - For `undefined` item, it is ignored.\r\n     * - For `number` item, it is considered as a `tablorMeta.uuid`, and check is performed.\r\n     * - For `object` item containing `tablorMeta`, it is considered as an `AugmentedItem<T>`, and its\r\n     * `givenItem.tablorMeta.uuid` is checked.\r\n     * Note that `givenItem.tablorMeta.isSelected` is not checked because the\r\n     * given item might be an outdated copy of the original item.\r\n     * - For any other item, it is ignored.\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const nbOfSelectedItems = tablor.getNbOfSelectedItemsIn([\r\n     *     { // selected\r\n     *         ...,\r\n     *         tablorMeta: { uuid: 1, isSelected: true, ... }\r\n     *     },\r\n     *     { // selected, but outdated copy\r\n     *         ...,\r\n     *         tablorMeta: { uuid: 2, isSelected: false, ... }\r\n     *     },\r\n     *      { // not selected, but outdated copy\r\n     *          ...,\r\n     *          tablorMeta: { uuid: 1, isSelected: true, ... }\r\n     *     },\r\n     *     9, // not selected\r\n     *     10, // selected\r\n     *     undefined, // not selected\r\n     * ])\r\n     * // Output: 3\r\n     * ```\r\n     */\r\n    getNbOfSelectedItemsIn\r\n        = this.selector.getNbOfSelectedItemsIn.bind(this.selector)\r\n\r\n    /**\r\n     * Selects an item.\r\n     *\r\n     * @parameters item - The item to select.\r\n     * @parameters state - A boolean value indicating whether to select or deselect the item.\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const augmentedItem = {\r\n     *     ...\r\n     *     tablorMeta: { uuid: 1, isSelected: false, ... }\r\n     * }\r\n     *\r\n     * tablor.select(item, true)\r\n     * tablor.select(item, false)\r\n     * tablor.select(item, 'toggle')\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const regularItem = {\r\n     *     ...\r\n     *     tablorMeta: undefined\r\n     * }\r\n     *\r\n     * tablor.select(item, true)\r\n     * tablor.select(item, false)\r\n     * tablor.select(item, 'toggle')\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const itemUuid = 9\r\n     *\r\n     * tablor.select(itemUuid, true)\r\n     * tablor.select(itemUuid, false)\r\n     * tablor.select(itemUuid, 'toggle')\r\n     * ```\r\n     */\r\n    selectItem\r\n        = this.selector.select.bind(this.selector)\r\n\r\n    /**\r\n     * Selects multiple items.\r\n     *\r\n     * @parameters items - The items to select.\r\n     * @parameters state - A boolean value indicating whether to select or deselect the items.\r\n     *\r\n     * @keywords\r\n     * selected items - Items that are selected.\r\n     * Selection is identified by the `tablorMeta.isSelected` property.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = [\r\n     *     {\r\n     *         ...,\r\n     *         tablorMeta: { uuid: 1, isSelected: false, ... }\r\n     *     },\r\n     *     {\r\n     *         ...,\r\n     *         tablorMeta: undefined\r\n     *     },\r\n     *     9,\r\n     *     10,\r\n     *     undefined\r\n     * ]\r\n     *\r\n     * tablor.select(items, true)\r\n     * tablor.select(items, false)\r\n     * tablor.select(items, 'toggle')\r\n     *\r\n     * tablor.select(items, [false, true, false, 'toggle', true])\r\n     * ```\r\n     */\r\n    selectItems\r\n        = this.selector.selectMultiple.bind(this.selector)\r\n\r\n    /** ------------ PAGINATION METHODS  ------------ */\r\n\r\n    /**\r\n     * Retrieve the current page items.\r\n     *\r\n     * @returnings The current page items.\r\n     *\r\n     * @remarks\r\n     * This method is optimized for performance.\r\n     * But in Angular, `Angular changes detection` might get slower\r\n     * for `nbOfItemsPerPage` is set to `-1` for large numbers of items (e.g., 5000 items per page).\r\n     * But this is not the case when using a limited number of items per page (e.g., 300 items per page).\r\n\r\n     * -\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = tablor.getPaginatedItems()\r\n     * // [\r\n     * //     {\r\n     * //         ...,\r\n     * //         tablorMeta: { uuid: 1, isSelected: false, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         ...,\r\n     * //         tablorMeta: { uuid: 2, isSelected: false, ... }\r\n     * //     },\r\n     * //     ...\r\n     * // ]\r\n     * ```\r\n     */\r\n    getPaginatedItems\r\n        = this.paginator.getItems.bind(this.paginator)\r\n\r\n    /**\r\n     * Retrieve the current page number.\r\n     *\r\n     * @returnings The current page number.\r\n     */\r\n    getPageNb\r\n        = this.paginator.getPageNb.bind(this.paginator)\r\n\r\n    /**\r\n     * Retrieve the number of total pages.\r\n     *\r\n     * @returnings The number of total pages.\r\n     */\r\n    getNbOfPages\r\n        = this.paginator.getNbOfPages.bind(this.paginator)\r\n\r\n    /**\r\n     * Retrieve the number of items on the current page.\r\n     *\r\n     * @returnings The current page size.\r\n     */\r\n    getPageSize\r\n        = this.paginator.getPageSize.bind(this.paginator)\r\n\r\n    /**\r\n     * Retrieve the number of items per page.\r\n     *\r\n     * @returnings The number of items per page.\r\n     */\r\n    getNbOfItemsPerPage\r\n        = this.paginator.getNbOfItemsPerPage.bind(this.paginator)\r\n\r\n    /**\r\n     * Set the page number.\r\n     *\r\n     * @parameters nb - The page number to set.\r\n     */\r\n    setPageNb\r\n        = this.paginator.setPageNb.bind(this.paginator)\r\n\r\n    /**\r\n     * Set the number of items per page.\r\n     *\r\n     * @parameters nb - The number of items per page to set.\r\n     */\r\n    setNbOfItemsPerPage\r\n        = this.paginator.setNbOfItemsPerPage.bind(this.paginator)\r\n\r\n    /** ------------ FIELDS METHODS  ------------ */\r\n\r\n    /**\r\n     * Initializes the fields with an array of fields.\r\n     *\r\n     * @parameters fields - An array of fields.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * type User = {\r\n     *     id: number\r\n     *     name: string\r\n     *     age: number\r\n     * }\r\n     *\r\n     * const userFields: TablorTypes['Fields']<User> = {\r\n     *     id: {\r\n     *         title: 'ID',\r\n     *         isSortedByDefault: true\r\n     *     },\r\n     *     name: { title: 'Name' },\r\n     *     age: { title: 'Age' },\r\n     * }\r\n     *\r\n     * const tablor = new Tablor<User>()\r\n     *\r\n     * tablor.initializeFields(userFields)\r\n     * ```\r\n     */\r\n    initializeFields\r\n        = this.fieldsStore.initialize.bind(this.fieldsStore)\r\n\r\n    /**\r\n     * Get all processed fields as an object.\r\n     *\r\n     * @returnings The fields as an object.\r\n     *\r\n     * @remarks\r\n     * To get the fields as an array, use the `getFieldsAsArray` method.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const fields = tablor.getFields()\r\n     * // {\r\n     * //     id: {\r\n     * //         key: 'id',\r\n     * //         title: 'ID',\r\n     * //         isSortedByDefault: true\r\n     * //     },\r\n     * //     name: { ... },\r\n     * //     age: { ... },\r\n     * // }\r\n     * ```\r\n     */\r\n    getFields\r\n        = this.fieldsStore.getFields.bind(this.fieldsStore)\r\n\r\n    /**\r\n     * Get all processed fields as an array.\r\n     *\r\n     * @returnings The fields as an array.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const fields = tablor.getFieldsAsArray()\r\n     * // [\r\n     * //     {\r\n     * //         key: 'id',\r\n     * //         title: 'ID',\r\n     * //         isSortedByDefault: true\r\n     * //     },\r\n     * //     { ... },\r\n     * //     { ... },\r\n     * // ]\r\n     * ```\r\n     */\r\n    getFieldsAsArray\r\n        = this.fieldsStore.getFieldsAsArray.bind(this.fieldsStore)\r\n\r\n    /**\r\n     * Get a field by its key.\r\n     *\r\n     * @parameters key - The key of the field to get.\r\n     *\r\n     * @returnings The field, or undefined if not found.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const field = tablor.getField('id')\r\n     * // {\r\n     * //     key: 'id',\r\n     * //     title: 'ID',\r\n     * //     isSortedByDefault: true\r\n     * // }\r\n     * ```\r\n     */\r\n    getField\r\n        = this.fieldsStore.getField.bind(this.fieldsStore)\r\n\r\n    /**\r\n     * Get the keys of all processed fields.\r\n     *\r\n     * @returnings An array of field keys.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const fieldKeys = tablor.getFieldsKeys()\r\n     * // ['id', 'name', 'age']\r\n     * ```\r\n     */\r\n    getFieldsKeys\r\n        = this.fieldsStore.getFieldsKeys.bind(this.fieldsStore)\r\n\r\n    /**\r\n     * Check if a field exists.\r\n     *\r\n     * @parameters key - The key of the field to check.\r\n     *\r\n     * @returnings True if the field exists, false otherwise.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const hasField = tablor.hasField('id')\r\n     * // true\r\n     * ```\r\n     */\r\n    hasField\r\n        = this.fieldsStore.hasField.bind(this.fieldsStore)\r\n\r\n    /** ------------ ITEMS METHODS  ------------ */\r\n\r\n    /**\r\n     * Initializes the items with an array of items.\r\n     *\r\n     * @parameters items - An array of items.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * type User = {\r\n     *     id: number\r\n     *     name: string\r\n     *     age: number\r\n     * }\r\n     *\r\n     * const users: User[] = [\r\n     *     {\r\n     *         id: 1,\r\n     *         name: 'John',\r\n     *         age: 30\r\n     *     },\r\n     *     {\r\n     *         id: 2,\r\n     *         name: 'Jane',\r\n     *         age: 25\r\n     *     }\r\n     * ]\r\n     *\r\n     * const tablor = new Tablor<User>()\r\n     *\r\n     * tablor.initializeItems(users)\r\n     * ```\r\n     */\r\n    initializeItems\r\n        = this.itemsStore.initialize.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Get all items.\r\n     *\r\n     * @parameters strictlyTyped - A boolean indicating whether to return strictly typed items or loosely typed items.\r\n     *\r\n     * @returnings An array of items.\r\n     *\r\n     * @remarks\r\n     * - For getting searched items, use the `getSearchedItems` method.\r\n     * - For getting selected items, use the `getSelectedItems` method.\r\n     * - For getting sorted items, use the `getSortedItems` method.\r\n     * - For getting paginated items, use the `getPaginatedItems` method.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const users = tablor.getItems()\r\n     * // [\r\n     * //     {\r\n     * //         id: 1,\r\n     * //         name: 'John',\r\n     * //         age: 30,\r\n     * //         tablorMeta: { uuid: 1, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         id: 2,\r\n     * //         name: 'Jane',\r\n     * //         age: 25,\r\n     * //         tablorMeta: { uuid: 1, ... }\r\n     * //     }\r\n     * // ]\r\n     * ```\r\n     */\r\n    getAllItems\r\n        = this.itemsStore.getItems.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Adds new items to the store.\r\n     *\r\n     * @parameters items - An array of items.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const users: User[] = [\r\n     *     {\r\n     *         id: 1,\r\n     *         name: 'John',\r\n     *         age: 30\r\n     *     },\r\n     *     {\r\n     *         id: 2,\r\n     *         name: 'Jane',\r\n     *         age: 25\r\n     *     }\r\n     * ]\r\n     *\r\n     * tablor.addItems(users)\r\n     * ```\r\n     */\r\n    addItems\r\n        = this.itemsStore.add.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Removes items from the store by UUIDs.\r\n     *\r\n     * @parameters itemsOrUuids - An array of UUIDs.\r\n     *\r\n     * @returnings An array of boolean values, indicating whether the items were removed successfully or not.\r\n     *\r\n     * @recommendations\r\n     * It is recommended to remove multiple items at once if there is a need to do so, as an event listener will be\r\n     * emitted for all removed items at once.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const itemsAndUuids = [\r\n     *     1, // used as a UUID\r\n     *     2, // used as a UUID\r\n     *     {  // tablorMeta.uuid is used\r\n     *         ...\r\n     *         tablorMeta: { uuid: 3, ... }\r\n     *     },\r\n     *     {  // a complete object is matched, and tablorMeta.uuid is used if found\r\n     *         ...\r\n     *         tablorMeta: undefined\r\n     *     }\r\n     * ]\r\n     *\r\n     * tablor.removeItems(uuids)\r\n     * ```\r\n     */\r\n    removeItems\r\n        = this.itemsStore.remove.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Returns the loading state.\r\n     *\r\n     * @returnings A boolean value indicating whether the store is currently loading or not.\r\n     *\r\n     * @experimental\r\n     * This method is not yet supported.\r\n     */\r\n    getLoadingState\r\n        = this.itemsStore.getLoadingState.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Returns the total number of items.\r\n     *\r\n     * @returnings A number representing the total number of items.\r\n     */\r\n    getNbOfItems\r\n        = this.itemsStore.getNbOfItems.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Finds and returns items matching the given UUIDs or item objects.\r\n     *\r\n     * @parameters itemsAndUuids - An array of UUIDs or item objects.\r\n     *\r\n     * @returnings An array of items that match the given UUIDs or item objects.\r\n     *\r\n     * @remarks\r\n     * For not found items, undefined values are placed in the returned array.\r\n     * - For finding single index for each item, use the `findOneIndexForEach` instead.\r\n     * - For finding all possible indexes for each item (useful for duplicates),\r\n     * use the `findAllPossibleIndexesForEach`\r\n     * instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const itemsAndUuids = [\r\n     *     1, // used as a UUID\r\n     *     2, // used as a UUID\r\n     *     {  // tablorMeta.uuid is used\r\n     *         ...\r\n     *         tablorMeta: { uuid: 3, ... }\r\n     *     },\r\n     *     {  // the complete object is matched to find it\r\n     *         ...\r\n     *         tablorMeta: undefined\r\n     *     },\r\n     *     {  // deleted item\r\n     *         ...\r\n     *         tablorMeta: { uuid: 5, ... }\r\n     *     }\r\n     * ]\r\n     *\r\n     * const items = tablor.findItems(itemsAndUuids)\r\n     * // [\r\n     * //     {\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 1, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 2, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 3, ... }\r\n     * //     },\r\n     * //     {\r\n     * //         ...\r\n     * //         tablorMeta: { uuid: 4, ... }\r\n     * //     },\r\n     * //     undefined,\r\n     * // ]\r\n     * ```\r\n     */\r\n    findOneMatchingItemForEach\r\n        = this.itemsStore.findOneMatchingItemForEach.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Finds and returns the indexes of items matching the given UUIDs or item objects.\r\n     *\r\n     * @parameters itemsAndUuids - An array of UUIDs or item objects.\r\n     *\r\n     * @returnings An array of indexes of items that match the given UUIDs or item objects.\r\n     *\r\n     * @remarks\r\n     * For not found items, undefined values are placed in the returned array.\r\n     * - For finding all possible indexes (useful for duplicates), use `findAllPossibleIndexesForEach` instead.\r\n     * - For finding a single matching item, use `findOneMatchingItemForEach` instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const itemsAndUuids = [\r\n     *     1, // used as a UUID\r\n     *     2, // used as a UUID\r\n     *     {  // tablorMeta.uuid is used\r\n     *         ...\r\n     *         tablorMeta: { uuid: 3, ... }\r\n     *     },\r\n     *     {  // the complete object is matched to find it\r\n     *         ...\r\n     *         tablorMeta: undefined\r\n     *     },\r\n     *     {  // deleted item\r\n     *         ...\r\n     *         tablorMeta: { uuid: 5, ... }\r\n     *     }\r\n     * ]\r\n     *\r\n     * const items = tablor.findOneIndexForEach(itemsAndUuids)\r\n     * // [\r\n     * //     0,\r\n     * //     1,\r\n     * //     2,\r\n     * //     3,\r\n     * //     undefined,\r\n     * // ]\r\n     * ```\r\n     */\r\n    findOneIndexForEach = this.itemsStore.findOneIndexForEach.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Finds and returns all the possible indexes of items matching the given UUIDs or item objects.\r\n     *\r\n     * @parameters itemsAndUuids - An array of UUIDs or item objects.\r\n     *\r\n     * @returnings An array of indexes of items that match the given UUIDs or item objects.\r\n     *\r\n     * @remarks\r\n     * This method is useful for finding duplicate items.\r\n     * - For finding single index for each item, use `findOneIndexForEach` instead.\r\n     * - For finding single matching item, use `findOneMatchingItemForEach` instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const itemsAndUuids = [\r\n     *     1, // used as a UUID\r\n     *     2, // used as a UUID\r\n     *     {  // tablorMeta.uuid is used\r\n     *         ...\r\n     *         tablorMeta: { uuid: 3, ... }\r\n     *     },\r\n     *     {  // a complete object is matched to find it\r\n     *         ...\r\n     *         tablorMeta: undefined\r\n     *     }\r\n     * ]\r\n     *\r\n     * const items = tablor.findAllPossibleIndexesForEach(itemsAndUuids)\r\n     * // [\r\n     * //     [0, 8],\r\n     * //     [1, 2, 15, 20,\r\n     * //     [],\r\n     * //     [3],\r\n     * // ]\r\n     * ```\r\n     */\r\n    findAllPossibleIndexesForEach\r\n        = this.itemsStore.findAllPossibleIndexesForEach.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Updates items by matching UUIDs that are present in the items.\r\n     *\r\n     * @parameters items - An array of partial item objects.\r\n     *\r\n     * @returnings An array of booleans, each indicating whether the update was successful.\r\n     *\r\n     * @remarks\r\n     * If applicable, update all the target items at once, as this method emits a single event.\r\n     * - For updating items by index, use `updateByIndex` instead.\r\n     * - For updating items by UUID, use `updateByUuid` instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = [\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 1, ... }\r\n     *     },\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 2, ... }\r\n     *     },\r\n     * ]\r\n     *\r\n     * const updated = tablor.updateByInItemUuid(items)\r\n     * // [true, true]\r\n     * ```\r\n     */\r\n    updateByInItemUuid\r\n        = this.itemsStore.updateByInItemUuid.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Updates items by matching UUIDs that are passed externally.\r\n     *\r\n     * @parameters items - An array of partial item objects.\r\n     * @parameters uuids - An array of UUIDs to match against.\r\n     *\r\n     * @returnings An array of booleans, each indicating whether the update was successful.\r\n     *\r\n     * @throws If the number of items and UUIDs do not match.\r\n     *\r\n     *\r\n     * @remarks\r\n     * If applicable, update all the target items at once, as this method emits a single event.\r\n     * - For updating items by index, use `updateByIndex` instead.\r\n     * - For updating items by internal UUID in the item, use `updateByInItemUuid` instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = [\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 1, ... }\r\n     *     },\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 2, ... }\r\n     *     },\r\n     * ]\r\n     * const uuids = [1, 2]\r\n     *\r\n     * const updated = tablor.updateByExternalUuids(items, uuids)\r\n     * // [true, true]\r\n     * ```\r\n     */\r\n    updateByExternalUuids\r\n        = this.itemsStore.updateByExternalUuids.bind(this.itemsStore)\r\n\r\n    /**\r\n     * Updates items at specified indexes.\r\n     *\r\n     * @parameters items - An array of partial item objects.\r\n     * @parameters indexes - An array of items' indexes to update.\r\n     *\r\n     * @returnings An array of booleans, each indicating whether the update was successful.\r\n     *\r\n     * @throws If the number of items and indexes do not match.\r\n     *\r\n     * @remarks\r\n     * If applicable, update all the target items at once, as this method emits a single event.\r\n     * - For updating items by internal UUID in the item, use `updateByInItemUuid` instead.\r\n     * - For updating items by external UUID, use `updateByExternalUuids` instead.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = [\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 1, ... }\r\n     *     },\r\n     *     {\r\n     *         ...\r\n     *         tablorMeta: { uuid: 2, ... }\r\n     *     },\r\n     * ]\r\n     * const indexes = [0, 1]\r\n     *\r\n     * const updated = tablor.updateByIndex(items, indexes)\r\n     * // [true, true]\r\n     * ```\r\n     */\r\n    updateByIndex\r\n        = this.itemsStore.updateByIndex.bind(this.itemsStore)\r\n\r\n    /** ------------ SORTER METHODS ------------ */\r\n\r\n    /**\r\n     * Gets the sorting option objects.\r\n     *\r\n     * @parameters `includingNoneOrdered` - Whether to include the `'None'` ordered options.\r\n     * (Default: `true`)\r\n     *\r\n     * @returnings An array of sorting options.\r\n     *\r\n     * @remarks\r\n     * + `'Toggle'` order iterates through the `supportedToggleOrders`,\r\n     * and uses the `toggleOrderIndex` to determine the current position.\r\n     * + `'None'` order sorts the items in the original order, but nested sorting options can resort the items.\r\n     * `'None'` order acts as no sorting.\r\n     * + `'ORIGINAL'` order sorts the items in the original order.\r\n     * Nested sorting options only sort them in nested order.\r\n     *\r\n     * @remarks\r\n     * + To check if a field was sorted by `'Toggle'`,\r\n     * check the existence of the `supportedToggleOrders` property in the sorting options.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * // sorted by a single field\r\n     * const options = tablor.getSortingOptions();\r\n     * // [{ field: 'name', order: 'ASC', ... }]\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * // sorted by multiple fields\r\n     * const options = tablor.getSortingOptions();\r\n     * // [\r\n     * //     { field: 'name', order: 'ASC', ... },\r\n     * //     { field: 'surname', order: 'ASC', ... }\r\n     * // ]\r\n     * ```\r\n     */\r\n    getSortingOptions\r\n        = this.sorter.getOptions.bind(this.sorter)\r\n\r\n    /**\r\n     * Gets the keys of all current sorting options.\r\n     *\r\n     * @parameters `includingNoneOrdered` - Whether to include the `'None'` ordered options.\r\n     * (Default: `true`)\r\n     *\r\n     * @returnings An array of keys of sorting options.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const keys = tablor.getSortingFieldKeys();\r\n     * // ['name', 'surname']\r\n     * ```\r\n     */\r\n    getSortingFieldKeys\r\n        = this.sorter.getSortingFieldKeys.bind(this.sorter)\r\n\r\n    /**\r\n     * Gets the orders of all current sorting options.\r\n     *\r\n     * @parameters `includingNoneOrdered` - Whether to include the `'None'` ordered options.\r\n     * (Default: `true`)\r\n     *\r\n     * @returnings An array of orders of sorting options.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const orders = tablor.getSortingFieldOrders();\r\n     * // ['ASC', 'ASC']\r\n     * ```\r\n     */\r\n    getSortingFieldOrders\r\n        = this.sorter.getSortingFieldOrders.bind(this.sorter)\r\n\r\n    /**\r\n     * Gets the order of a specific sorting option.\r\n     *\r\n     * @parameters `indexOrKey` - The index or key of the sorting option.\r\n     *\r\n     * @returnings The order of the sorting option, or `undefined` if not found.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const order = tablor.getSortingFieldOrder('name');\r\n     * // 'ASC'\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const order = tablor.getSortingFieldOrder(-1);\r\n     * // 'ASC'\r\n     * ```\r\n     */\r\n    getSortingFieldOrder\r\n        = this.sorter.getSortingFieldOrder.bind(this.sorter)\r\n\r\n    /**\r\n     * Checks if a field is sorted.\r\n     *\r\n     * @parameters `field` - The field to check.\r\n     *\r\n     * @parameters `includingNoneOrdered` - Whether to include the `'None'` ordered options.\r\n     * (Default: `true`)\r\n     *\r\n     * @returnings `true` if the field is sorted, `false` otherwise.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const isSorted = tablor.isFieldSorted('name');\r\n     * // true\r\n     * ```\r\n     */\r\n    isFieldSorted\r\n        = this.sorter.isFieldSorted.bind(this.sorter)\r\n\r\n    /**\r\n     * Gets the sorted items.\r\n     *\r\n     * @returnings An array of sorted items.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * const items = tablor.getSortedItems();\r\n     * // [...] // same as searched items\r\n     * ```\r\n     */\r\n    getSortedItems\r\n        = this.sorter.getItems.bind(this.sorter)\r\n\r\n    /**\r\n     * Sorts the items.\r\n     *\r\n     * @parameters options - An array of sorting options.\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.sort({\r\n     *     field: 'name',\r\n     *     order: 'ASC'\r\n     * });\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.sort({\r\n     *     field: 'name',\r\n     *     order: 'Toggle'\r\n     * });\r\n     * ```\r\n     *\r\n     * @exampleUsage\r\n     * ```TypeScript\r\n     * tablor.sort({\r\n     *     field: 'name',\r\n     *     order: 'ASC'\r\n     * });\r\n     *\r\n     * tablor.sort({\r\n     *     field: 'surname',\r\n     *     order: 'Toggle'\r\n     * });\r\n     * ```\r\n     */\r\n    sort = this.sorter.sort.bind(this.sorter)\r\n\r\n    /**\r\n     * Clears the sorting.\r\n     *\r\n     * @remarks\r\n     * Note that after calling this method, the items will go back to their original order.\r\n     */\r\n    clearSorting\r\n        = this.sorter.clearSort.bind(this.sorter)\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}