Source: media/filter/client/ClientFilter.js

import { DuplicateFilter } from "./tools/DuplicateFilter";
import { DemoHeightFilter } from "./tools/DemoHeightFilter";

export { ClientFilter }

/**
 * Class representing a client filter. 
 */
class ClientFilter {
    /**
     * Create a client filter.
     * @param {Object} settings - The dictionary containing the client filter settings.
     */
    constructor(settings = {}) {
        this.settings = settings;
    }

    /**
     * Initialize filter objects based on client filter settings.
     */
    _initFilter() {
        const _filterObjects = i => i != null && i !== false && Object.keys(i).length !== 0;

        this.registeredDataDeletionFilter = [
            this.settings.demoHeightFilter?.enable && new DemoHeightFilter(this.settings.demoHeightFilter?.heightMin)
        ].filter(_filterObjects);

        this.registeredDataManipulationFilter = [
            this.settings.duplicateFilter?.enable && new DuplicateFilter('pid', true)
        ].filter(_filterObjects);
    }
    /**
     * Apply the client filters on the data. 
     * @param {Array} data - List where filter are applied on each item. 
     * @returns [itemStack, itemIndexStack]
     */
    filterData(data) {
        this._initFilter();
        const itemStack = [];
        const itemIndexStack = [];

        const dataCopy = structuredClone(data)
        dataCopy.forEach((item, index) => {
            if (item == null) {
                itemStack.push(undefined)
                itemIndexStack.push([index])
            }

            const isDeletion = this.registeredDataDeletionFilter[0]?.isFilterConditionMatched(item) || false;
            if (isDeletion) {
                this.registeredDataDeletionFilter[0].applyFilterMethod(index, item, itemStack, itemIndexStack)
                return
            }

            const isModification = this.registeredDataManipulationFilter[0]?.isFilterConditionMatched(item) || false;
            if (isModification) {
                this.registeredDataManipulationFilter[0].applyFilterMethod(index, item, itemStack, itemIndexStack)
                return
            }

            const isNormalDataInsert = !isDeletion & !isModification;

            if (item != null) {
                item['numItemsOnSlide'] = 1;
                itemStack.push(item);
                itemIndexStack.push([index]);
            }
        })
        return [itemStack, itemIndexStack]
    }
}